]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.1.1438: some commands cause trouble in a popup window v8.1.1438
authorBram Moolenaar <Bram@vim.org>
Sat, 1 Jun 2019 12:15:52 +0000 (14:15 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 1 Jun 2019 12:15:52 +0000 (14:15 +0200)
Problem:    Some commands cause trouble in a popup window.
Solution:   Add NOT_IN_POPUP_WINDOW.

src/ex_cmds2.c
src/ex_docmd.c
src/macros.h
src/popupwin.c
src/proto/popupwin.pro
src/testdir/test_popupwin.vim
src/version.c
src/window.c

index 5a33bb128c3d82fe1870ca3f0e0336e37247b2d9..66e5fca1282975f5c6c73d023f358e4d3143945a 100644 (file)
@@ -1864,6 +1864,8 @@ do_argfile(exarg_T *eap, int argn)
     char_u     *p;
     int                old_arg_idx = curwin->w_arg_idx;
 
+    if (NOT_IN_POPUP_WINDOW)
+       return;
     if (argn < 0 || argn >= ARGCOUNT)
     {
        if (ARGCOUNT <= 1)
index 82f94629bead4e3f340571e12a164e00ae751e6a..cc6a920a23a0e036cd35e8113edf4c64d1ea9d64 100644 (file)
@@ -5452,6 +5452,8 @@ ex_doautocmd(exarg_T *eap)
     static void
 ex_bunload(exarg_T *eap)
 {
+    if (NOT_IN_POPUP_WINDOW)
+       return;
     eap->errmsg = do_bufdel(
            eap->cmdidx == CMD_bdelete ? DOBUF_DEL
                : eap->cmdidx == CMD_bwipeout ? DOBUF_WIPE
@@ -5466,6 +5468,8 @@ ex_bunload(exarg_T *eap)
     static void
 ex_buffer(exarg_T *eap)
 {
+    if (NOT_IN_POPUP_WINDOW)
+       return;
     if (*eap->arg)
        eap->errmsg = e_trailing;
     else
@@ -6768,6 +6772,9 @@ ex_splitview(exarg_T *eap)
                       || eap->cmdidx == CMD_tabfind
                       || eap->cmdidx == CMD_tabnew;
 
+    if (NOT_IN_POPUP_WINDOW)
+       return;
+
 #ifdef FEAT_GUI
     need_mouse_correct = TRUE;
 #endif
@@ -6895,6 +6902,8 @@ ex_tabnext(exarg_T *eap)
 {
     int tab_number;
 
+    if (NOT_IN_POPUP_WINDOW)
+       return;
     switch (eap->cmdidx)
     {
        case CMD_tabfirst:
@@ -7146,6 +7155,8 @@ do_exedit(
     int                need_hide;
     int                exmode_was = exmode_active;
 
+    if (NOT_IN_POPUP_WINDOW)
+       return;
     /*
      * ":vi" command ends Ex mode.
      */
index 8c0e04a56cfe634c810cebd4803183b844d2ff06..0f5ab7739df5c3c8225e139632cf62ed5d37611a 100644 (file)
 
 /* Wether a command index indicates a user command. */
 #define IS_USER_CMDIDX(idx) ((int)(idx) < 0)
+
+#ifdef FEAT_TEXT_PROP
+# define NOT_IN_POPUP_WINDOW not_in_popup_window()
+#else
+# define NOT_IN_POPUP_WINDOW 0
+#endif
index 73b98beed1bac96fdf04e026455095b37a093782..2ebfda2d9ccd43f90b931f1d9647ceeb9df549da 100644 (file)
@@ -747,4 +747,16 @@ f_popup_getoptions(typval_T *argvars, typval_T *rettv)
 # endif
     }
 }
+
+    int
+not_in_popup_window()
+{
+    if (bt_popup(curwin->w_buffer))
+    {
+       emsg(_("E994: Not allowed in a popup window"));
+       return TRUE;
+    }
+    return FALSE;
+}
+
 #endif // FEAT_TEXT_PROP
index eb9e241528c9af9cf2d6fbf28f6ddb5da6f1309c..107a4273c5e4a108fae41523cc8490e957477b50 100644 (file)
@@ -13,4 +13,5 @@ void ex_popupclear(exarg_T *eap);
 void f_popup_move(typval_T *argvars, typval_T *rettv);
 void f_popup_getpos(typval_T *argvars, typval_T *rettv);
 void f_popup_getoptions(typval_T *argvars, typval_T *rettv);
+int not_in_popup_window(void);
 /* vim: set ft=c : */
index d0d27b56181bc7342f172f8a27dcd139c9be52fc..7c3cd94f0814b99013741e892e0bf2e45297faae 100644 (file)
@@ -108,8 +108,27 @@ endfunc
 func Test_win_execute_closing_curwin()
   split
   let winid = popup_create('some text', {})
-  call win_execute(winid, winnr() .. "close")
-  call assert_equal(1, winnr())
+  call assert_fails('call win_execute(winid, winnr() .. "close")', 'E994')
+  popupclear
+endfunc
+
+func Test_win_execute_not_allowed()
+  let winid = popup_create('some text', {})
+  call assert_fails('call win_execute(winid, "split")', 'E994:')
+  call assert_fails('call win_execute(winid, "vsplit")', 'E994:')
+  call assert_fails('call win_execute(winid, "close")', 'E994:')
+  call assert_fails('call win_execute(winid, "bdelete")', 'E994:')
+  call assert_fails('call win_execute(winid, "tabnew")', 'E994:')
+  call assert_fails('call win_execute(winid, "tabnext")', 'E994:')
+  call assert_fails('call win_execute(winid, "next")', 'E994:')
+  call assert_fails('call win_execute(winid, "rewind")', 'E994:')
+  call assert_fails('call win_execute(winid, "buf")', 'E994:')
+  call assert_fails('call win_execute(winid, "edit")', 'E994:')
+  call assert_fails('call win_execute(winid, "enew")', 'E994:')
+  call assert_fails('call win_execute(winid, "wincmd x")', 'E994:')
+  call assert_fails('call win_execute(winid, "wincmd w")', 'E994:')
+  call assert_fails('call win_execute(winid, "wincmd t")', 'E994:')
+  call assert_fails('call win_execute(winid, "wincmd b")', 'E994:')
   popupclear
 endfunc
 
index c7c19f3984ac4beb746b23941f6303e987f0120b..4b380d2726f693b4a5ec9cc50e336e9353db7f69 100644 (file)
@@ -767,6 +767,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1438,
 /**/
     1437,
 /**/
index e73a9f4921bd4cf08a8d3df935f9a6c1f076c77e..42689ee0bc535293d66e338ffaeb006f21f3db51 100644 (file)
@@ -87,7 +87,8 @@ do_window(
 #endif
     char_u     cbuf[40];
 
-    Prenum1 = Prenum == 0 ? 1 : Prenum;
+    if (NOT_IN_POPUP_WINDOW)
+       return;
 
 #ifdef FEAT_CMDWIN
 # define CHECK_CMDWIN \
@@ -102,6 +103,8 @@ do_window(
 # define CHECK_CMDWIN do { /**/ } while (0)
 #endif
 
+    Prenum1 = Prenum == 0 ? 1 : Prenum;
+
     switch (nchar)
     {
 /* split current window in two parts, horizontally */
@@ -732,6 +735,9 @@ cmd_with_count(
     int
 win_split(int size, int flags)
 {
+    if (NOT_IN_POPUP_WINDOW)
+       return FAIL;
+
     /* When the ":tab" modifier was used open a new tab page instead. */
     if (may_open_tabpage() == OK)
        return OK;
@@ -1509,7 +1515,9 @@ win_exchange(long Prenum)
     win_T      *wp2;
     int                temp;
 
-    if (ONE_WINDOW)        /* just one window */
+    if (NOT_IN_POPUP_WINDOW)
+       return;
+    if (ONE_WINDOW)        // just one window
     {
        beep_flush();
        return;
@@ -2363,6 +2371,9 @@ win_close(win_T *win, int free_buf)
     tabpage_T   *prev_curtab = curtab;
     frame_T    *win_frame = win->w_frame->fr_parent;
 
+    if (NOT_IN_POPUP_WINDOW)
+       return FAIL;
+
     if (last_window())
     {
        emsg(_("E444: Cannot close last window"));
@@ -4221,6 +4232,8 @@ win_goto(win_T *wp)
     win_T      *owp = curwin;
 #endif
 
+    if (NOT_IN_POPUP_WINDOW)
+       return;
     if (text_locked())
     {
        beep_flush();