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:
parent
55008aad50
commit
934470e562
@ -2764,8 +2764,14 @@ invoke_popup_filter(win_T *wp, int c)
|
|||||||
int
|
int
|
||||||
popup_do_filter(int c)
|
popup_do_filter(int c)
|
||||||
{
|
{
|
||||||
|
static int recursive = FALSE;
|
||||||
int res = FALSE;
|
int res = FALSE;
|
||||||
win_T *wp;
|
win_T *wp;
|
||||||
|
int save_KeyTyped = KeyTyped;
|
||||||
|
|
||||||
|
if (recursive)
|
||||||
|
return FALSE;
|
||||||
|
recursive = TRUE;
|
||||||
|
|
||||||
popup_reset_handled();
|
popup_reset_handled();
|
||||||
|
|
||||||
@ -2776,13 +2782,15 @@ popup_do_filter(int c)
|
|||||||
|
|
||||||
wp = mouse_find_win(&row, &col, FIND_POPUP);
|
wp = mouse_find_win(&row, &col, FIND_POPUP);
|
||||||
if (wp != NULL && popup_close_if_on_X(wp, row, col))
|
if (wp != NULL && popup_close_if_on_X(wp, row, col))
|
||||||
return TRUE;
|
res = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!res && (wp = find_next_popup(FALSE)) != NULL)
|
while (!res && (wp = find_next_popup(FALSE)) != NULL)
|
||||||
if (wp->w_filter_cb.cb_name != NULL)
|
if (wp->w_filter_cb.cb_name != NULL)
|
||||||
res = invoke_popup_filter(wp, c);
|
res = invoke_popup_filter(wp, c);
|
||||||
|
|
||||||
|
recursive = FALSE;
|
||||||
|
KeyTyped = save_KeyTyped;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1919,6 +1919,31 @@ func Test_popupwin_with_buffer()
|
|||||||
call delete('XsomeFile')
|
call delete('XsomeFile')
|
||||||
endfunc
|
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()
|
func Test_popupwin_width()
|
||||||
let winid = popup_create(repeat(['short', 'long long long line', 'medium width'], 50), #{
|
let winid = popup_create(repeat(['short', 'long long long line', 'medium width'], 50), #{
|
||||||
\ maxwidth: 40,
|
\ maxwidth: 40,
|
||||||
|
@ -761,6 +761,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 */
|
||||||
|
/**/
|
||||||
|
1963,
|
||||||
/**/
|
/**/
|
||||||
1962,
|
1962,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user