To: vim_dev@googlegroups.com Subject: Patch 8.2.3614 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 call OpenOtherPopups()') + call writefile(lines, 'XtestPopupmenuMasking') + + let buf = RunVimInTerminal('-S XtestPopupmenuMasking', #{rows: 14}) + call TermWait(buf, 25) + + call term_sendkeys(buf, "A\\\") + call VerifyScreenDump(buf, 'Test_popupwin_popupmenu_masking_1', {}) + + call term_sendkeys(buf, "\") + 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 -- Bram@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 ///