summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/popupwin.c10
-rw-r--r--src/testdir/test_popupwin.vim25
-rw-r--r--src/version.c2
3 files changed, 36 insertions, 1 deletions
diff --git a/src/popupwin.c b/src/popupwin.c
index 714529181..abf40e8c0 100644
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -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;
}
diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim
index f0959e767..8f2b5dcd1 100644
--- a/src/testdir/test_popupwin.vim
+++ b/src/testdir/test_popupwin.vim
@@ -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,
diff --git a/src/version.c b/src/version.c
index 7fd13b802..fe8b34ae6 100644
--- a/src/version.c
+++ b/src/version.c
@@ -762,6 +762,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1963,
+/**/
1962,
/**/
1961,