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 -- Br...@Moolenaar.net --
http://www.Moolenaar.net \\\
/// \\\
\\\ sponsor Vim, vote for features --
http://www.Vim.org/sponsor/ ///
\\\ help me help AIDS victims --
http://ICCF-Holland.org ///