]> granicus.if.org Git - vim/commitdiff
patch 8.2.3614: zindex of popup windows not used when redrawing popup menu v8.2.3614
authorBakudankun <bakudankun@gmail.com>
Wed, 17 Nov 2021 20:40:16 +0000 (20:40 +0000)
committerBram Moolenaar <Bram@vim.org>
Wed, 17 Nov 2021 20:40:16 +0000 (20:40 +0000)
Problem:    zindex of popup windows not used when redrawing popup menu.
Solution:   Check the zindex when redrawing the popup menu.  (closes #9129,
            closes #9089)

src/popupmenu.c
src/popupwin.c
src/proto/popupmenu.pro
src/screen.c
src/testdir/dumps/Test_popupwin_popupmenu_masking_1.dump [new file with mode: 0644]
src/testdir/dumps/Test_popupwin_popupmenu_masking_2.dump [new file with mode: 0644]
src/testdir/test_popupwin.vim
src/version.c

index bb1a611377a355df4a8daf087e290a0ef85add05..86a9cbb0704a6b9d034b4d5aa71588136e6d5e6e 100644 (file)
@@ -382,9 +382,9 @@ pum_call_update_screen()
  * "row"/"col" is under the popup menu.
  */
     int
-pum_under_menu(int row, int col)
+pum_under_menu(int row, int col, int only_redrawing)
 {
-    return pum_will_redraw
+    return (!only_redrawing || pum_will_redraw)
            && row >= pum_row
            && row < pum_row + pum_height
            && col >= pum_col - 1
index 59bdf86b8247c3c2aeaa06bb5b625a0d358e88aa..2c903bcc4bbb83cd89094797670c7871b0fcd1e9 100644 (file)
@@ -3654,7 +3654,11 @@ may_update_popup_mask(int type)
            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
+               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;
     }
index 03019dcefb743a3cacf3df71b8771a6e57465ab4..53ef843c18744818590ffd9ff73a02bc5a7baa03 100644 (file)
@@ -1,7 +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 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);
index 78d7ef7d71270c58fa6f02ee433b735fd7bef2de..aee18d8e4432c276249136fa1998505f01c27850 100644 (file)
@@ -2139,7 +2139,7 @@ screen_char(unsigned off, int row, int col)
 
     // Skip if under the popup menu.
     // Popup windows with zindex higher than POPUPMENU_ZINDEX go on top.
-    if (pum_under_menu(row, col)
+    if (pum_under_menu(row, col, TRUE)
 #ifdef FEAT_PROP_POPUP
            && screen_zindex <= POPUPMENU_ZINDEX
 #endif
diff --git a/src/testdir/dumps/Test_popupwin_popupmenu_masking_1.dump b/src/testdir/dumps/Test_popupwin_popupmenu_masking_1.dump
new file mode 100644 (file)
index 0000000..9cf4149
--- /dev/null
@@ -0,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
diff --git a/src/testdir/dumps/Test_popupwin_popupmenu_masking_2.dump b/src/testdir/dumps/Test_popupwin_popupmenu_masking_2.dump
new file mode 100644 (file)
index 0000000..41fb879
--- /dev/null
@@ -0,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| 
index 83d632eeed5eee0183b8292a739258db295edfe7..15fa3ca0660e6f7188e67e3043fac4a96faf44c3 100644 (file)
@@ -3328,6 +3328,32 @@ func Get_popupmenu_lines()
        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,6 +3546,29 @@ func Test_popupmenu_info_too_wide()
   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()
index 4f0dac736e40ab7a24fef262810ad5edcf2bc653..2a8465b4f0fb7a83b82ff5a8a6e13c78906cb22d 100644 (file)
@@ -757,6 +757,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3614,
 /**/
     3613,
 /**/