0
0
mirror of https://github.com/vim/vim.git synced 2025-09-26 04:04:07 -04:00

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.
This commit is contained in:
Bram Moolenaar
2019-06-01 14:15:52 +02:00
parent 3a97bb3f0f
commit 815b76bff6
8 changed files with 70 additions and 4 deletions

View File

@@ -1864,6 +1864,8 @@ do_argfile(exarg_T *eap, int argn)
char_u *p; char_u *p;
int old_arg_idx = curwin->w_arg_idx; int old_arg_idx = curwin->w_arg_idx;
if (NOT_IN_POPUP_WINDOW)
return;
if (argn < 0 || argn >= ARGCOUNT) if (argn < 0 || argn >= ARGCOUNT)
{ {
if (ARGCOUNT <= 1) if (ARGCOUNT <= 1)

View File

@@ -5452,6 +5452,8 @@ ex_doautocmd(exarg_T *eap)
static void static void
ex_bunload(exarg_T *eap) ex_bunload(exarg_T *eap)
{ {
if (NOT_IN_POPUP_WINDOW)
return;
eap->errmsg = do_bufdel( eap->errmsg = do_bufdel(
eap->cmdidx == CMD_bdelete ? DOBUF_DEL eap->cmdidx == CMD_bdelete ? DOBUF_DEL
: eap->cmdidx == CMD_bwipeout ? DOBUF_WIPE : eap->cmdidx == CMD_bwipeout ? DOBUF_WIPE
@@ -5466,6 +5468,8 @@ ex_bunload(exarg_T *eap)
static void static void
ex_buffer(exarg_T *eap) ex_buffer(exarg_T *eap)
{ {
if (NOT_IN_POPUP_WINDOW)
return;
if (*eap->arg) if (*eap->arg)
eap->errmsg = e_trailing; eap->errmsg = e_trailing;
else else
@@ -6768,6 +6772,9 @@ ex_splitview(exarg_T *eap)
|| eap->cmdidx == CMD_tabfind || eap->cmdidx == CMD_tabfind
|| eap->cmdidx == CMD_tabnew; || eap->cmdidx == CMD_tabnew;
if (NOT_IN_POPUP_WINDOW)
return;
#ifdef FEAT_GUI #ifdef FEAT_GUI
need_mouse_correct = TRUE; need_mouse_correct = TRUE;
#endif #endif
@@ -6895,6 +6902,8 @@ ex_tabnext(exarg_T *eap)
{ {
int tab_number; int tab_number;
if (NOT_IN_POPUP_WINDOW)
return;
switch (eap->cmdidx) switch (eap->cmdidx)
{ {
case CMD_tabfirst: case CMD_tabfirst:
@@ -7146,6 +7155,8 @@ do_exedit(
int need_hide; int need_hide;
int exmode_was = exmode_active; int exmode_was = exmode_active;
if (NOT_IN_POPUP_WINDOW)
return;
/* /*
* ":vi" command ends Ex mode. * ":vi" command ends Ex mode.
*/ */

View File

@@ -339,3 +339,9 @@
/* Wether a command index indicates a user command. */ /* Wether a command index indicates a user command. */
#define IS_USER_CMDIDX(idx) ((int)(idx) < 0) #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

View File

@@ -747,4 +747,16 @@ f_popup_getoptions(typval_T *argvars, typval_T *rettv)
# endif # 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 #endif // FEAT_TEXT_PROP

View File

@@ -13,4 +13,5 @@ void ex_popupclear(exarg_T *eap);
void f_popup_move(typval_T *argvars, typval_T *rettv); void f_popup_move(typval_T *argvars, typval_T *rettv);
void f_popup_getpos(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); void f_popup_getoptions(typval_T *argvars, typval_T *rettv);
int not_in_popup_window(void);
/* vim: set ft=c : */ /* vim: set ft=c : */

View File

@@ -108,8 +108,27 @@ endfunc
func Test_win_execute_closing_curwin() func Test_win_execute_closing_curwin()
split split
let winid = popup_create('some text', {}) let winid = popup_create('some text', {})
call win_execute(winid, winnr() .. "close") call assert_fails('call win_execute(winid, winnr() .. "close")', 'E994')
call assert_equal(1, winnr()) 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 popupclear
endfunc endfunc

View File

@@ -767,6 +767,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1438,
/**/ /**/
1437, 1437,
/**/ /**/

View File

@@ -87,7 +87,8 @@ do_window(
#endif #endif
char_u cbuf[40]; char_u cbuf[40];
Prenum1 = Prenum == 0 ? 1 : Prenum; if (NOT_IN_POPUP_WINDOW)
return;
#ifdef FEAT_CMDWIN #ifdef FEAT_CMDWIN
# define CHECK_CMDWIN \ # define CHECK_CMDWIN \
@@ -102,6 +103,8 @@ do_window(
# define CHECK_CMDWIN do { /**/ } while (0) # define CHECK_CMDWIN do { /**/ } while (0)
#endif #endif
Prenum1 = Prenum == 0 ? 1 : Prenum;
switch (nchar) switch (nchar)
{ {
/* split current window in two parts, horizontally */ /* split current window in two parts, horizontally */
@@ -732,6 +735,9 @@ cmd_with_count(
int int
win_split(int size, int flags) 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. */ /* When the ":tab" modifier was used open a new tab page instead. */
if (may_open_tabpage() == OK) if (may_open_tabpage() == OK)
return OK; return OK;
@@ -1509,7 +1515,9 @@ win_exchange(long Prenum)
win_T *wp2; win_T *wp2;
int temp; int temp;
if (ONE_WINDOW) /* just one window */ if (NOT_IN_POPUP_WINDOW)
return;
if (ONE_WINDOW) // just one window
{ {
beep_flush(); beep_flush();
return; return;
@@ -2363,6 +2371,9 @@ win_close(win_T *win, int free_buf)
tabpage_T *prev_curtab = curtab; tabpage_T *prev_curtab = curtab;
frame_T *win_frame = win->w_frame->fr_parent; frame_T *win_frame = win->w_frame->fr_parent;
if (NOT_IN_POPUP_WINDOW)
return FAIL;
if (last_window()) if (last_window())
{ {
emsg(_("E444: Cannot close last window")); emsg(_("E444: Cannot close last window"));
@@ -4221,6 +4232,8 @@ win_goto(win_T *wp)
win_T *owp = curwin; win_T *owp = curwin;
#endif #endif
if (NOT_IN_POPUP_WINDOW)
return;
if (text_locked()) if (text_locked())
{ {
beep_flush(); beep_flush();