# HG changeset patch # User Bram Moolenaar # Date 1567373403 -7200 # Node ID 0bf8cb0258be08545614da62951cf4e088056a7b # Parent 209771baa0289f3bb42accdf35c48e060ad75f05 patch 8.1.1963: popup window filter may be called recursively Commit: https://github.com/vim/vim/commit/934470e562df7bc778ff916db44918f3ccecc7cc Author: Bram Moolenaar Date: Sun Sep 1 23:27:05 2019 +0200 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. diff --git a/src/popupwin.c b/src/popupwin.c --- 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 --- 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 --- 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,