Patch 8.2.1769
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.
Files:      runtime/doc/popup.txt, src/getchar.c, src/evalfunc.c,
            src/ex_docmd.c, src/menu.c, src/globals.h,
            src/testdir/test_popupwin.vim,
            src/testdir/dumps/Test_popupwin_normal_cmd.dump


*** ../vim-8.2.1768/runtime/doc/popup.txt       2020-05-18 19:46:00.070602956 
+0200
--- runtime/doc/popup.txt       2020-09-28 22:26:46.562308885 +0200
***************
*** 908,918 ****
--- 910,931 ----
  Vim provides standard filters |popup_filter_menu()| and
  |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,
  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
  'ttimeoutlen' option to 100 and set 'timeout' and/or 'ttimeout'.
  
+                                                       *popup-filter-errors*
+ If the filter function can't be called, e.g. because the name is wrong, then
+ the popup is closed.  If the filter causes an error then it is assumed to
+ return zero.  If this happens three times in a row the popup is closed.  If
+ the popup gives errors fewer than 10% of the calls then it won't be closed.
+ 
  
  POPUP CALLBACK                                                *popup-callback*
  
*** ../vim-8.2.1768/src/getchar.c       2020-09-23 12:28:46.421898027 +0200
--- src/getchar.c       2020-09-28 22:16:11.712489576 +0200
***************
*** 1888,1894 ****
      }
  #endif
  #ifdef FEAT_PROP_POPUP
!     if (!ex_normal_busy_done && popup_do_filter(c))
      {
        if (c == Ctrl_C)
            got_int = FALSE;  // avoid looping
--- 1888,1896 ----
      }
  #endif
  #ifdef FEAT_PROP_POPUP
!     // 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)
            got_int = FALSE;  // avoid looping
***************
*** 3168,3176 ****
                        timedout = TRUE;
                        continue;
                    }
- #ifdef FEAT_PROP_POPUP
-                   ex_normal_busy_done = TRUE;
- #endif
  
                    // When 'insertmode' is set, ESC just beeps in Insert
                    // mode.  Use CTRL-L to make edit() return.
--- 3170,3175 ----
*** ../vim-8.2.1768/src/evalfunc.c      2020-09-26 22:39:18.427725844 +0200
--- src/evalfunc.c      2020-09-28 22:15:20.084668419 +0200
***************
*** 2616,2630 ****
                msg_scroll = FALSE;
  
                if (!dangerous)
                    ++ex_normal_busy;
                exec_normal(TRUE, lowlevel, TRUE);
                if (!dangerous)
                {
                    --ex_normal_busy;
! #ifdef FEAT_PROP_POPUP
!                   if (ex_normal_busy == 0)
!                       ex_normal_busy_done = FALSE;
! #endif
                }
  
                msg_scroll |= save_msg_scroll;
--- 2616,2630 ----
                msg_scroll = FALSE;
  
                if (!dangerous)
+               {
                    ++ex_normal_busy;
+                   ++in_feedkeys;
+               }
                exec_normal(TRUE, lowlevel, TRUE);
                if (!dangerous)
                {
                    --ex_normal_busy;
!                   --in_feedkeys;
                }
  
                msg_scroll |= save_msg_scroll;
*** ../vim-8.2.1768/src/ex_docmd.c      2020-09-26 17:20:49.693186820 +0200
--- src/ex_docmd.c      2020-09-28 21:52:40.593408174 +0200
***************
*** 8037,8046 ****
  
      restore_current_state(&save_state);
      --ex_normal_busy;
- #ifdef FEAT_PROP_POPUP
-     if (ex_normal_busy == 0)
-       ex_normal_busy_done = FALSE;
- #endif
      setmouse();
  #ifdef CURSOR_SHAPE
      ui_cursor_shape();                // may show different cursor shape
--- 8037,8042 ----
*** ../vim-8.2.1768/src/menu.c  2020-09-23 12:28:46.421898027 +0200
--- src/menu.c  2020-09-28 21:53:01.453333531 +0200
***************
*** 2398,2407 ****
                                                           menu->silent[idx]);
            restore_current_state(&save_state);
            --ex_normal_busy;
- #ifdef FEAT_PROP_POPUP
-           if (ex_normal_busy == 0)
-               ex_normal_busy_done = FALSE;
- #endif
        }
        else
            ins_typebuf(menu->strings[idx], menu->noremap[idx], 0,
--- 2398,2403 ----
*** ../vim-8.2.1768/src/globals.h       2020-09-23 12:28:46.417898049 +0200
--- src/globals.h       2020-09-28 22:14:53.516760583 +0200
***************
*** 1150,1161 ****
                    = {NULL, NULL, 0, 0, 0, 0, 0, 0, 0}
  #endif
                    ;
! EXTERN int    ex_normal_busy INIT(= 0); // recursiveness 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
  EXTERN int    ignore_script INIT(= FALSE);  // ignore script input
--- 1150,1158 ----
                    = {NULL, NULL, 0, 0, 0, 0, 0, 0, 0}
  #endif
                    ;
! 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()
  
  #ifdef FEAT_EVAL
  EXTERN int    ignore_script INIT(= FALSE);  // ignore script input
*** ../vim-8.2.1768/src/testdir/test_popupwin.vim       2020-09-27 
22:47:01.884163380 +0200
--- src/testdir/test_popupwin.vim       2020-09-28 22:10:19.177719095 +0200
***************
*** 1539,1551 ****
    call popup_clear()
  endfunc
  
! " this tests that the "ex_normal_busy_done" flag works
  func Test_popup_filter_normal_cmd()
    CheckScreendump
  
    let lines =<< trim END
!       let g:winid = popup_create('some text', {'filter': 'invalidfilter'})
!       call timer_start(0, {-> win_execute(g:winid, 'norm! zz')})
    END
    call writefile(lines, 'XtestPopupNormal')
    let buf = RunVimInTerminal('-S XtestPopupNormal', #{rows: 10})
--- 1539,1552 ----
    call popup_clear()
  endfunc
  
! " this tests that the filter is not used for :normal command
  func Test_popup_filter_normal_cmd()
    CheckScreendump
  
    let lines =<< trim END
!       let text = range(1, 20)->map({_, v -> string(v)})
!       let g:winid = popup_create(text, #{maxheight: 5, minwidth: 3, filter: 
'invalidfilter'})
!       call timer_start(0, {-> win_execute(g:winid, 'norm! 10Gzz')})
    END
    call writefile(lines, 'XtestPopupNormal')
    let buf = RunVimInTerminal('-S XtestPopupNormal', #{rows: 10})
*** ../vim-8.2.1768/src/testdir/dumps/Test_popupwin_normal_cmd.dump     
2020-09-23 12:28:46.429897985 +0200
--- src/testdir/dumps/Test_popupwin_normal_cmd.dump     2020-09-28 
22:10:32.201673255 +0200
***************
*** 1,10 ****
  > +0&#ffffff0@74
  |~+0#4040ff13&| @73
! |~| @73
! |~| @73
! |~| @31| +0#0000000&@8| +0#4040ff13&@32
! |~| @73
! |~| @73
  |~| @73
  |~| @73
  | +0#0000000&@56|0|,|0|-|1| @8|A|l@1| 
--- 1,10 ----
  > +0&#ffffff0@74
  |~+0#4040ff13&| @73
! |~| @33|8+0#0000001#ffd7ff255| @1| +0#0000000#a8a8a8255| 
+0#4040ff13#ffffff0@35
! |~| @33|9+0#0000001#ffd7ff255| @1| +0#0000000#a8a8a8255| 
+0#4040ff13#ffffff0@35
! |~| @33|1+0#0000001#ffd7ff255|0| | +0#0000000#0000001| +0#4040ff13#ffffff0@35
! |~| @33|1+0#0000001#ffd7ff255@1| | +0#0000000#a8a8a8255| 
+0#4040ff13#ffffff0@35
! |~| @33|1+0#0000001#ffd7ff255|2| | +0#0000000#a8a8a8255| 
+0#4040ff13#ffffff0@35
  |~| @73
  |~| @73
  | +0#0000000&@56|0|,|0|-|1| @8|A|l@1| 
*** ../vim-8.2.1768/src/version.c       2020-09-28 21:41:08.616043789 +0200
--- src/version.c       2020-09-28 22:27:35.082143086 +0200
***************
*** 752,753 ****
--- 752,755 ----
  {   /* Add new patch number below this line */
+ /**/
+     1769,
  /**/

-- 
Me?  A skeptic?  I trust you have proof.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202009282030.08SKUUj7520960%40masaka.moolenaar.net.

Raspunde prin e-mail lui