mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
patch 8.2.1729: endless loop when ":normal" feeds popup window filter
Problem: Endless loop when ":normal" feeds popup window filter. Solution: Add the ex_normal_busy_done flag.
This commit is contained in:
@@ -2610,7 +2610,13 @@ f_feedkeys(typval_T *argvars, typval_T *rettv UNUSED)
|
||||
++ex_normal_busy;
|
||||
exec_normal(TRUE, lowlevel, TRUE);
|
||||
if (!dangerous)
|
||||
{
|
||||
--ex_normal_busy;
|
||||
#ifdef FEAT_PROP_POPUP
|
||||
if (ex_normal_busy == 0)
|
||||
ex_normal_busy_done = FALSE;
|
||||
#endif
|
||||
}
|
||||
|
||||
msg_scroll |= save_msg_scroll;
|
||||
}
|
||||
|
@@ -8030,6 +8030,10 @@ ex_normal(exarg_T *eap)
|
||||
|
||||
restore_current_state(&save_state);
|
||||
--ex_normal_busy;
|
||||
#ifdef FEAT_PROP_POPUP
|
||||
if (ex_normal_busy == 0)
|
||||
ex_normal_busy_done = FALSE;
|
||||
#endif
|
||||
setmouse();
|
||||
#ifdef CURSOR_SHAPE
|
||||
ui_cursor_shape(); // may show different cursor shape
|
||||
|
@@ -1888,7 +1888,7 @@ vgetc(void)
|
||||
}
|
||||
#endif
|
||||
#ifdef FEAT_PROP_POPUP
|
||||
if (popup_do_filter(c))
|
||||
if (!ex_normal_busy_done && popup_do_filter(c))
|
||||
{
|
||||
if (c == Ctrl_C)
|
||||
got_int = FALSE; // avoid looping
|
||||
@@ -3168,6 +3168,10 @@ vgetorpeek(int advance)
|
||||
timedout = TRUE;
|
||||
continue;
|
||||
}
|
||||
#ifdef FEAT_PROP_POPUP
|
||||
ex_normal_busy_done = TRUE;
|
||||
#endif
|
||||
|
||||
// When 'insertmode' is set, ESC just beeps in Insert
|
||||
// mode. Use CTRL-L to make edit() return.
|
||||
// For the command line only CTRL-C always breaks it.
|
||||
|
@@ -1152,6 +1152,11 @@ EXTERN typebuf_T typebuf // typeahead buffer
|
||||
;
|
||||
EXTERN int ex_normal_busy INIT(= 0); // recursiveness of ex_normal()
|
||||
EXTERN int ex_normal_lock INIT(= 0); // forbid use of ex_normal()
|
||||
#ifdef FEAT_PROP_POPUP
|
||||
// Set to TRUE when ex_normal_busy is set and out of typeahead.
|
||||
EXTERN int ex_normal_busy_done INIT(= FALSE);
|
||||
#endif
|
||||
|
||||
#ifdef FEAT_EVAL
|
||||
EXTERN int ignore_script INIT(= FALSE); // ignore script input
|
||||
#endif
|
||||
|
@@ -2398,6 +2398,10 @@ execute_menu(exarg_T *eap, vimmenu_T *menu, int mode_idx)
|
||||
menu->silent[idx]);
|
||||
restore_current_state(&save_state);
|
||||
--ex_normal_busy;
|
||||
#ifdef FEAT_PROP_POPUP
|
||||
if (ex_normal_busy == 0)
|
||||
ex_normal_busy_done = FALSE;
|
||||
#endif
|
||||
}
|
||||
else
|
||||
ins_typebuf(menu->strings[idx], menu->noremap[idx], 0,
|
||||
|
10
src/testdir/dumps/Test_popupwin_normal_cmd.dump
Normal file
10
src/testdir/dumps/Test_popupwin_normal_cmd.dump
Normal file
@@ -0,0 +1,10 @@
|
||||
> +0&#ffffff0@74
|
||||
|~+0#4040ff13&| @73
|
||||
|~| @73
|
||||
|~| @73
|
||||
|~| @31| +0#0000000&@8| +0#4040ff13&@32
|
||||
|~| @73
|
||||
|~| @73
|
||||
|~| @73
|
||||
|~| @73
|
||||
| +0#0000000&@56|0|,|0|-|1| @8|A|l@1|
|
@@ -1539,6 +1539,23 @@ func Test_popup_filter()
|
||||
call popup_clear()
|
||||
endfunc
|
||||
|
||||
" this tests that the "ex_normal_busy_done" flag works
|
||||
func Test_popup_filter_normal_cmd()
|
||||
CheckScreendump
|
||||
|
||||
let lines =<< trim END
|
||||
let g:winid = popup_create('some text', {'filter': 'invalidfilter'})
|
||||
call timer_start(0, {-> win_execute(g:winid, 'norm! zz')})
|
||||
END
|
||||
call writefile(lines, 'XtestPopupNormal')
|
||||
let buf = RunVimInTerminal('-S XtestPopupNormal', #{rows: 10})
|
||||
call TermWait(buf, 100)
|
||||
call VerifyScreenDump(buf, 'Test_popupwin_normal_cmd', {})
|
||||
|
||||
call StopVimInTerminal(buf)
|
||||
call delete('XtestPopupNormal')
|
||||
endfunc
|
||||
|
||||
func ShowDialog(key, result)
|
||||
let s:cb_res = 999
|
||||
let winid = popup_dialog('do you want to quit (Yes/no)?', #{
|
||||
|
@@ -750,6 +750,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
1729,
|
||||
/**/
|
||||
1728,
|
||||
/**/
|
||||
|
Reference in New Issue
Block a user