0
0
mirror of https://github.com/vim/vim.git synced 2025-10-02 05:04:20 -04:00

patch 8.2.1769: popup filter interferes with using :normal to move the cursor

Problem:    A popup filter interferes with using :normal to move the cursor in
            a popup.
Solution:   Do not invoke the filter when ex_normal_busy is set.
This commit is contained in:
Bram Moolenaar
2020-09-28 22:29:58 +02:00
parent d58a3bf7da
commit 4934ad0e44
9 changed files with 27 additions and 31 deletions

View File

@@ -1,4 +1,4 @@
*popup.txt* For Vim version 8.2. Last change: 2020 Sep 27 *popup.txt* For Vim version 8.2. Last change: 2020 Sep 28
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@@ -910,6 +910,11 @@ A mouse click arrives as <LeftMouse>. The coordinates can be obtained with
Vim provides standard filters |popup_filter_menu()| and Vim provides standard filters |popup_filter_menu()| and
|popup_filter_yesno()|. |popup_filter_yesno()|.
Keys coming from a `:normal` command do not pass through the filter. This can
be used to move the cursor in a popup where the "cursorline" option is set: >
call win_execute(winid, 'normal! 10Gzz')
Keys coming from `feedkeys()` are passed through the filter.
Note that "x" is the normal way to close a popup. You may want to use Esc, Note that "x" is the normal way to close a popup. You may want to use Esc,
but since many keys start with an Esc character, there may be a delay before but since many keys start with an Esc character, there may be a delay before
Vim recognizes the Esc key. If you do use Esc, it is recommended to set the Vim recognizes the Esc key. If you do use Esc, it is recommended to set the

View File

@@ -2616,15 +2616,15 @@ f_feedkeys(typval_T *argvars, typval_T *rettv UNUSED)
msg_scroll = FALSE; msg_scroll = FALSE;
if (!dangerous) if (!dangerous)
{
++ex_normal_busy; ++ex_normal_busy;
++in_feedkeys;
}
exec_normal(TRUE, lowlevel, TRUE); exec_normal(TRUE, lowlevel, TRUE);
if (!dangerous) if (!dangerous)
{ {
--ex_normal_busy; --ex_normal_busy;
#ifdef FEAT_PROP_POPUP --in_feedkeys;
if (ex_normal_busy == 0)
ex_normal_busy_done = FALSE;
#endif
} }
msg_scroll |= save_msg_scroll; msg_scroll |= save_msg_scroll;

View File

@@ -8037,10 +8037,6 @@ ex_normal(exarg_T *eap)
restore_current_state(&save_state); restore_current_state(&save_state);
--ex_normal_busy; --ex_normal_busy;
#ifdef FEAT_PROP_POPUP
if (ex_normal_busy == 0)
ex_normal_busy_done = FALSE;
#endif
setmouse(); setmouse();
#ifdef CURSOR_SHAPE #ifdef CURSOR_SHAPE
ui_cursor_shape(); // may show different cursor shape ui_cursor_shape(); // may show different cursor shape

View File

@@ -1888,7 +1888,9 @@ vgetc(void)
} }
#endif #endif
#ifdef FEAT_PROP_POPUP #ifdef FEAT_PROP_POPUP
if (!ex_normal_busy_done && popup_do_filter(c)) // Only filter keys that do not come from ":normal". Keys from feedkeys()
// are filtered.
if ((!ex_normal_busy || in_feedkeys) && popup_do_filter(c))
{ {
if (c == Ctrl_C) if (c == Ctrl_C)
got_int = FALSE; // avoid looping got_int = FALSE; // avoid looping
@@ -3168,9 +3170,6 @@ vgetorpeek(int advance)
timedout = TRUE; timedout = TRUE;
continue; continue;
} }
#ifdef FEAT_PROP_POPUP
ex_normal_busy_done = TRUE;
#endif
// When 'insertmode' is set, ESC just beeps in Insert // When 'insertmode' is set, ESC just beeps in Insert
// mode. Use CTRL-L to make edit() return. // mode. Use CTRL-L to make edit() return.

View File

@@ -1151,11 +1151,8 @@ EXTERN typebuf_T typebuf // typeahead buffer
#endif #endif
; ;
EXTERN int ex_normal_busy INIT(= 0); // recursiveness of ex_normal() EXTERN int ex_normal_busy INIT(= 0); // recursiveness of ex_normal()
EXTERN int in_feedkeys INIT(= 0); // ex_normal_busy set in feedkeys()
EXTERN int ex_normal_lock INIT(= 0); // forbid use 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 #ifdef FEAT_EVAL
EXTERN int ignore_script INIT(= FALSE); // ignore script input EXTERN int ignore_script INIT(= FALSE); // ignore script input

View File

@@ -2398,10 +2398,6 @@ execute_menu(exarg_T *eap, vimmenu_T *menu, int mode_idx)
menu->silent[idx]); menu->silent[idx]);
restore_current_state(&save_state); restore_current_state(&save_state);
--ex_normal_busy; --ex_normal_busy;
#ifdef FEAT_PROP_POPUP
if (ex_normal_busy == 0)
ex_normal_busy_done = FALSE;
#endif
} }
else else
ins_typebuf(menu->strings[idx], menu->noremap[idx], 0, ins_typebuf(menu->strings[idx], menu->noremap[idx], 0,

View File

@@ -1,10 +1,10 @@
> +0&#ffffff0@74 > +0&#ffffff0@74
|~+0#4040ff13&| @73 |~+0#4040ff13&| @73
|~| @73 |~| @33|8+0#0000001#ffd7ff255| @1| +0#0000000#a8a8a8255| +0#4040ff13#ffffff0@35
|~| @73 |~| @33|9+0#0000001#ffd7ff255| @1| +0#0000000#a8a8a8255| +0#4040ff13#ffffff0@35
|~| @31| +0#0000000&@8| +0#4040ff13&@32 |~| @33|1+0#0000001#ffd7ff255|0| | +0#0000000#0000001| +0#4040ff13#ffffff0@35
|~| @73 |~| @33|1+0#0000001#ffd7ff255@1| | +0#0000000#a8a8a8255| +0#4040ff13#ffffff0@35
|~| @73 |~| @33|1+0#0000001#ffd7ff255|2| | +0#0000000#a8a8a8255| +0#4040ff13#ffffff0@35
|~| @73 |~| @73
|~| @73 |~| @73
| +0#0000000&@56|0|,|0|-|1| @8|A|l@1| | +0#0000000&@56|0|,|0|-|1| @8|A|l@1|

View File

@@ -1539,13 +1539,14 @@ func Test_popup_filter()
call popup_clear() call popup_clear()
endfunc endfunc
" this tests that the "ex_normal_busy_done" flag works " this tests that the filter is not used for :normal command
func Test_popup_filter_normal_cmd() func Test_popup_filter_normal_cmd()
CheckScreendump CheckScreendump
let lines =<< trim END let lines =<< trim END
let g:winid = popup_create('some text', {'filter': 'invalidfilter'}) let text = range(1, 20)->map({_, v -> string(v)})
call timer_start(0, {-> win_execute(g:winid, 'norm! zz')}) let g:winid = popup_create(text, #{maxheight: 5, minwidth: 3, filter: 'invalidfilter'})
call timer_start(0, {-> win_execute(g:winid, 'norm! 10Gzz')})
END END
call writefile(lines, 'XtestPopupNormal') call writefile(lines, 'XtestPopupNormal')
let buf = RunVimInTerminal('-S XtestPopupNormal', #{rows: 10}) let buf = RunVimInTerminal('-S XtestPopupNormal', #{rows: 10})

View File

@@ -750,6 +750,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 */
/**/
1769,
/**/ /**/
1768, 1768,
/**/ /**/