1
0
forked from aniani/vim

patch 8.1.1963: popup window filter may be called recursively

Problem:    Popup window filter may be called recursively when using a Normal
            mode command.
Solution:   Prevent recursiveness. (closes #4887)  Also restore KeyTyped.
This commit is contained in:
Bram Moolenaar 2019-09-01 23:27:05 +02:00
parent 55008aad50
commit 934470e562
3 changed files with 36 additions and 1 deletions

View File

@ -2764,8 +2764,14 @@ invoke_popup_filter(win_T *wp, int c)
int
popup_do_filter(int c)
{
static int recursive = FALSE;
int res = FALSE;
win_T *wp;
int save_KeyTyped = KeyTyped;
if (recursive)
return FALSE;
recursive = TRUE;
popup_reset_handled();
@ -2776,13 +2782,15 @@ popup_do_filter(int c)
wp = mouse_find_win(&row, &col, FIND_POPUP);
if (wp != NULL && popup_close_if_on_X(wp, row, col))
return TRUE;
res = TRUE;
}
while (!res && (wp = find_next_popup(FALSE)) != NULL)
if (wp->w_filter_cb.cb_name != NULL)
res = invoke_popup_filter(wp, c);
recursive = FALSE;
KeyTyped = save_KeyTyped;
return res;
}

View File

@ -1919,6 +1919,31 @@ func Test_popupwin_with_buffer()
call delete('XsomeFile')
endfunc
func Test_popupwin_with_buffer_and_filter()
new Xwithfilter
call setline(1, range(100))
let bufnr = bufnr()
hide
func BufferFilter(win, key)
if a:key == 'G'
" recursive use of "G" does not cause problems.
call win_execute(a:win, 'normal! G')
return 1
endif
return 0
endfunc
let winid = popup_create(bufnr, #{maxheight: 5, filter: 'BufferFilter'})
call assert_equal(1, popup_getpos(winid).firstline)
redraw
call feedkeys("G", 'xt')
call assert_equal(99, popup_getpos(winid).firstline)
call popup_close(winid)
exe 'bwipe! ' .. bufnr
endfunc
func Test_popupwin_width()
let winid = popup_create(repeat(['short', 'long long long line', 'medium width'], 50), #{
\ maxwidth: 40,

View File

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