Patch 8.2.3614
Problem:    zindex of popup windows not used when redrawing popup menu.
Solution:   Check the zindex when redrawing the popup menu.  (closes #9129,
            closes #9089)
Files:      src/popupmenu.c, src/popupwin.c, src/proto/popupmenu.pro,
            src/screen.c, src/testdir/test_popupwin.vim,
            src/testdir/dumps/Test_popupwin_popupmenu_masking_1.dump,
            src/testdir/dumps/Test_popupwin_popupmenu_masking_2.dump


*** ../vim-8.2.3613/src/popupmenu.c     2021-04-27 19:06:52.635151858 +0100
--- src/popupmenu.c     2021-11-17 20:24:32.302368223 +0000
***************
*** 382,390 ****
   * "row"/"col" is under the popup menu.
   */
      int
! pum_under_menu(int row, int col)
  {
!     return pum_will_redraw
            && row >= pum_row
            && row < pum_row + pum_height
            && col >= pum_col - 1
--- 382,390 ----
   * "row"/"col" is under the popup menu.
   */
      int
! pum_under_menu(int row, int col, int only_redrawing)
  {
!     return (!only_redrawing || pum_will_redraw)
            && row >= pum_row
            && row < pum_row + pum_height
            && col >= pum_col - 1
*** ../vim-8.2.3613/src/popupwin.c      2021-11-15 11:22:05.059277981 +0000
--- src/popupwin.c      2021-11-17 20:24:32.306368195 +0000
***************
*** 3654,3660 ****
            for (col = wp->w_wincol;
                 col < wp->w_wincol + width - wp->w_popup_leftoff
                                                && col < screen_Columns; ++col)
!               if (wp->w_popup_mask_cells == NULL
                                || !popup_masked(wp, width, height, col, line))
                    mask[line * screen_Columns + col] = wp->w_zindex;
      }
--- 3654,3664 ----
            for (col = wp->w_wincol;
                 col < wp->w_wincol + width - wp->w_popup_leftoff
                                                && col < screen_Columns; ++col)
!               if (wp->w_zindex < POPUPMENU_ZINDEX
!                       && pum_visible()
!                       && pum_under_menu(line, col, FALSE))
!                   mask[line * screen_Columns + col] = POPUPMENU_ZINDEX;
!               else if (wp->w_popup_mask_cells == NULL
                                || !popup_masked(wp, width, height, col, line))
                    mask[line * screen_Columns + col] = wp->w_zindex;
      }
*** ../vim-8.2.3613/src/proto/popupmenu.pro     2021-04-23 20:01:30.649469081 
+0100
--- src/proto/popupmenu.pro     2021-11-17 20:24:32.306368195 +0000
***************
*** 1,7 ****
  /* popupmenu.c */
  void pum_display(pumitem_T *array, int size, int selected);
  void pum_call_update_screen(void);
! int pum_under_menu(int row, int col);
  void pum_redraw(void);
  void pum_position_info_popup(win_T *wp);
  void pum_undisplay(void);
--- 1,7 ----
  /* popupmenu.c */
  void pum_display(pumitem_T *array, int size, int selected);
  void pum_call_update_screen(void);
! int pum_under_menu(int row, int col, int only_redrawing);
  void pum_redraw(void);
  void pum_position_info_popup(win_T *wp);
  void pum_undisplay(void);
*** ../vim-8.2.3613/src/screen.c        2021-10-16 17:51:08.047842118 +0100
--- src/screen.c        2021-11-17 20:24:32.306368195 +0000
***************
*** 2139,2145 ****
  
      // Skip if under the popup menu.
      // Popup windows with zindex higher than POPUPMENU_ZINDEX go on top.
!     if (pum_under_menu(row, col)
  #ifdef FEAT_PROP_POPUP
            && screen_zindex <= POPUPMENU_ZINDEX
  #endif
--- 2139,2145 ----
  
      // Skip if under the popup menu.
      // Popup windows with zindex higher than POPUPMENU_ZINDEX go on top.
!     if (pum_under_menu(row, col, TRUE)
  #ifdef FEAT_PROP_POPUP
            && screen_zindex <= POPUPMENU_ZINDEX
  #endif
*** ../vim-8.2.3613/src/testdir/test_popupwin.vim       2021-08-07 
12:08:42.465099997 +0100
--- src/testdir/test_popupwin.vim       2021-11-17 20:32:09.104142453 +0000
***************
*** 3328,3333 ****
--- 3328,3359 ----
        endif
        endfunc
  
+       func OpenOtherPopups()
+       call popup_create([
+               \ 'popup below',
+               \ 'popup below',
+               \ 'popup below',
+               \ 'popup below',
+             \ ], #{
+               \ line: 'cursor',
+               \ col: 'cursor+3',
+               \ highlight: 'ErrorMsg',
+               \ minwidth: 17,
+               \ zindex: 50,
+             \ })
+       call popup_create([
+               \ 'popup on top',
+               \ 'popup on top',
+               \ 'popup on top',
+             \ ], #{
+               \ line: 'cursor+3',
+               \ col: 'cursor-10',
+               \ highlight: 'Search',
+               \ minwidth: 10,
+               \ zindex: 200,
+             \ })
+       endfunc
+ 
        " Check that no autocommands are triggered for the info popup
        au WinEnter * if win_gettype() == 'popup' | call setline(2, 'WinEnter') 
| endif
        au WinLeave * if win_gettype() == 'popup' | call setline(2, 'WinLeave') 
| endif
***************
*** 3520,3525 ****
--- 3546,3574 ----
    call delete('XtestInfoPopupWide')
  endfunc
  
+ func Test_popupmenu_masking()
+   " Test that popup windows that are opened while popup menu is open are
+   " properly displayed.
+   CheckScreendump
+   CheckFeature quickfix
+ 
+   let lines = Get_popupmenu_lines()
+   call add(lines, 'inoremap <C-A> <Cmd>call OpenOtherPopups()<CR>')
+   call writefile(lines, 'XtestPopupmenuMasking')
+ 
+   let buf = RunVimInTerminal('-S XtestPopupmenuMasking', #{rows: 14})
+   call TermWait(buf, 25)
+ 
+   call term_sendkeys(buf, "A\<C-X>\<C-U>\<C-A>")
+   call VerifyScreenDump(buf, 'Test_popupwin_popupmenu_masking_1', {})
+ 
+   call term_sendkeys(buf, "\<Esc>")
+   call VerifyScreenDump(buf, 'Test_popupwin_popupmenu_masking_2', {})
+ 
+   call StopVimInTerminal(buf)
+   call delete('XtestPopupmenuMasking')
+ endfunc
+ 
  func Test_popupwin_recycle_bnr()
    let bufnr = popup_notification('nothing wrong', {})->winbufnr()
    call popup_clear()
*** ../vim-8.2.3613/src/testdir/dumps/Test_popupwin_popupmenu_masking_1.dump    
2021-11-17 20:39:00.947075310 +0000
--- src/testdir/dumps/Test_popupwin_popupmenu_masking_1.dump    2021-11-17 
20:32:30.928070254 +0000
***************
*** 0 ****
--- 1,14 ----
+ |t+0&#ffffff0|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| |t|a|w|o|r|d> 
@2|p+0#ffffff16#e000002|o|p|u|p| |b|e|l|o|w| @1|╔+0#0000001#e0e0e08|═@15|X| 
+0#0000000#ffffff0@9
+ |~+0#4040ff13&| @23| +0#0000001#e0e0e08|w|r|d| @4|W| |e|x|t|r|a| |t|e|x|t| 
|║| |w|o|r|d|s| |a|r|e| |c|o@1|l| |║| +0#4040ff13#ffffff0@9
+ |~| @23| +0#0000001#ffd7ff255|a|n|o|t|w|r|d| |W| |e|x|t|r|a| |t|e|x|t| 
|╚+0&#e0e0e08|═@15|⇲| +0#4040ff13#ffffff0@9
+ |~| @19|p+0#0000000#ffff4012|o|p|u|p| |o|n| |t|o|p| +0#0000001#ffd7ff255|W| 
|e|x|t|r|a| |t|e|x|t| | +0#ffffff16#e000002@3| +0#4040ff13#ffffff0@23
+ |~| @19|p+0#0000000#ffff4012|o|p|u|p| |o|n| |t|o|p| +0#0000001#ffd7ff255|W| 
|e|x|t|r|a| |t|e|x|t| | +0#4040ff13#ffffff0@27
+ |~| @19|p+0#0000000#ffff4012|o|p|u|p| |o|n| |t|o|p| +0#4040ff13#ffffff0@41
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |-+2#0000000&@1| |U|s|e|r| |d|e|f|i|n|e|d| |c|o|m|p|l|e|t|i|o|n| 
|(|^|U|^|N|^|P|)| |m+0#00e0003&|a|t|c|h| |1| |o|f| |4| +0#0000000&@26
*** ../vim-8.2.3613/src/testdir/dumps/Test_popupwin_popupmenu_masking_2.dump    
2021-11-17 20:39:00.955075294 +0000
--- src/testdir/dumps/Test_popupwin_popupmenu_masking_2.dump    2021-11-17 
20:32:31.988066803 +0000
***************
*** 0 ****
--- 1,14 ----
+ |t+0&#ffffff0|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| |t|a|w|o|r>d| 
@2|p+0#ffffff16#e000002|o|p|u|p| |b|e|l|o|w| @5| +0#0000000#ffffff0@23
+ |~+0#4040ff13&| @32|p+0#ffffff16#e000002|o|p|u|p| |b|e|l|o|w| @5| 
+0#4040ff13#ffffff0@23
+ |~| @32|p+0#ffffff16#e000002|o|p|u|p| |b|e|l|o|w| @5| +0#4040ff13#ffffff0@23
+ |~| @19|p+0#0000000#ffff4012|o|p|u|p| |o|n| |t|o|p| 
+0#4040ff13#ffffff0|p+0#ffffff16#e000002|o|p|u|p| |b|e|l|o|w| @5| 
+0#4040ff13#ffffff0@23
+ |~| @19|p+0#0000000#ffff4012|o|p|u|p| |o|n| |t|o|p| +0#4040ff13#ffffff0@41
+ |~| @19|p+0#0000000#ffff4012|o|p|u|p| |o|n| |t|o|p| +0#4040ff13#ffffff0@41
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ | +0#0000000&@56|1|,|3|1| @9|A|l@1| 
*** ../vim-8.2.3613/src/version.c       2021-11-17 19:01:49.606923838 +0000
--- src/version.c       2021-11-17 20:38:10.627178749 +0000
***************
*** 759,760 ****
--- 759,762 ----
  {   /* Add new patch number below this line */
+ /**/
+     3614,
  /**/

-- 
GUEST:        He's killed the best man!
SECOND GUEST: (holding a limp WOMAN) He's killed my auntie.
FATHER:       No, please!  This is supposed to be a happy occasion!  Let's
              not bicker and argue about who killed who ...
                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            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/20211117204058.20EBD1C6578%40moolenaar.net.

Raspunde prin e-mail lui