# HG changeset patch # User Bram Moolenaar # Date 1559392206 -7200 # Node ID da5f5836e90cf76777692a66362061c25178bd2a # Parent 1958b437e8921278e1e968ab69fa272e0d3c41cc patch 8.1.1438: some commands cause trouble in a popup window commit https://github.com/vim/vim/commit/815b76bff618c07226653e11f29c4d3c5640b63a Author: Bram Moolenaar Date: Sat Jun 1 14:15:52 2019 +0200 patch 8.1.1438: some commands cause trouble in a popup window Problem: Some commands cause trouble in a popup window. Solution: Add NOT_IN_POPUP_WINDOW. diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c --- a/src/ex_cmds2.c +++ b/src/ex_cmds2.c @@ -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) diff --git a/src/ex_docmd.c b/src/ex_docmd.c --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -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. */ diff --git a/src/macros.h b/src/macros.h --- a/src/macros.h +++ b/src/macros.h @@ -339,3 +339,9 @@ /* 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 diff --git a/src/popupwin.c b/src/popupwin.c --- a/src/popupwin.c +++ b/src/popupwin.c @@ -747,4 +747,16 @@ f_popup_getoptions(typval_T *argvars, ty # 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 diff --git a/src/proto/popupwin.pro b/src/proto/popupwin.pro --- a/src/proto/popupwin.pro +++ b/src/proto/popupwin.pro @@ -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 : */ diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -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 diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -768,6 +768,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1438, +/**/ 1437, /**/ 1436, diff --git a/src/window.c b/src/window.c --- a/src/window.c +++ b/src/window.c @@ -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();