0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

patch 8.2.4913: popup_hide() does not always have effect

Problem:    Popup_hide() does not always have effect.
Solution:   Add the POPF_HIDDEN_FORCE flag. (closes #10376)
This commit is contained in:
Bram Moolenaar
2022-05-08 15:00:04 +01:00
parent d899e51120
commit 27724251bc
6 changed files with 47 additions and 13 deletions

View File

@@ -978,7 +978,7 @@ apply_options(win_T *wp, dict_T *dict, int create)
nr = dict_get_bool(dict, (char_u *)"hidden", FALSE);
if (nr > 0)
wp->w_popup_flags |= POPF_HIDDEN;
wp->w_popup_flags |= POPF_HIDDEN | POPF_HIDDEN_FORCE;
// when "firstline" and "cursorline" are both set and the cursor would be
// above or below the displayed lines, move the cursor to "firstline".
@@ -2644,7 +2644,10 @@ f_popup_hide(typval_T *argvars, typval_T *rettv UNUSED)
id = (int)tv_get_number(argvars);
wp = find_popup_win(id);
if (wp != NULL)
{
popup_hide(wp);
wp->w_popup_flags |= POPF_HIDDEN_FORCE;
}
}
void
@@ -2674,6 +2677,7 @@ f_popup_show(typval_T *argvars, typval_T *rettv UNUSED)
wp = find_popup_win(id);
if (wp != NULL)
{
wp->w_popup_flags &= ~POPF_HIDDEN_FORCE;
popup_show(wp);
#ifdef FEAT_QUICKFIX
if (wp->w_popup_flags & POPF_INFO)
@@ -3606,8 +3610,9 @@ check_popup_unhidden(win_T *wp)
textprop_T prop;
linenr_T lnum;
if (find_visible_prop(wp->w_popup_prop_win,
wp->w_popup_prop_type, wp->w_popup_prop_id,
if ((wp->w_popup_flags & POPF_HIDDEN_FORCE) == 0
&& find_visible_prop(wp->w_popup_prop_win,
wp->w_popup_prop_type, wp->w_popup_prop_id,
&prop, &lnum) == OK)
{
wp->w_popup_flags &= ~POPF_HIDDEN;

View File

@@ -0,0 +1,10 @@
| +2&#ffffff0|2+2#e000e06&|++2#0000000&| |[|N|o| |N|a|m|e|]| | +1&&@60
| +0&&@42||+1&&> +0&&@30
|~+0#4040ff13&| @41||+1#0000000&|s+0&&|o|m|e| |t|e|x|t| @21
|~+0#4040ff13&| @41||+1#0000000&| +0&&@30
|~+0#4040ff13&| @41||+1#0000000&|o+0&&|t|h|e|r| |t|e|x|t|a+0#ffffff16#e000002|t@1|a|c|h|e|d| |t|o| |"|o|t|h|e|r|"| +0#0000000#ffffff0@1
|~+0#4040ff13&| @41||+1#0000000&|~+0#4040ff13&| @29
|~| @41||+1#0000000&|~+0#4040ff13&| @29
|~| @41||+1#0000000&|~+0#4040ff13&| @29
|[+1#0000000&|N|o| |N|a|m|e|]| @15|0|,|0|-|1| @9|A|l@1| |[+3&&|N|o| |N|a|m|e|]| |[|+|]| @2|1|,|0|-|1| @6|A|l@1
|:+0&&|c|a|l@1| |p|o|p|u|p|_|h|i|d|e|(|g|:|s|o|m|e|_|i|d|)| @47

View File

@@ -0,0 +1,10 @@
| +2&#ffffff0|2+2#e000e06&|++2#0000000&| |[|N|o| |N|a|m|e|]| | +1&&@60
| +0&&@42||+1&&> +0&&@30
|~+0#4040ff13&| @41||+1#0000000&|s+0&&|o|m|e| |t|e|x|t|a+0#ffffff16#e000002|t@1|a|c|h|e|d| |t|o| |"|s|o|m|e|"| +0#0000000#ffffff0@3
|~+0#4040ff13&| @41||+1#0000000&| +0&&@30
|~+0#4040ff13&| @41||+1#0000000&|o+0&&|t|h|e|r| |t|e|x|t|a+0#ffffff16#e000002|t@1|a|c|h|e|d| |t|o| |"|o|t|h|e|r|"| +0#0000000#ffffff0@1
|~+0#4040ff13&| @41||+1#0000000&|~+0#4040ff13&| @29
|~| @41||+1#0000000&|~+0#4040ff13&| @29
|~| @41||+1#0000000&|~+0#4040ff13&| @29
|[+1#0000000&|N|o| |N|a|m|e|]| @15|0|,|0|-|1| @9|A|l@1| |[+3&&|N|o| |N|a|m|e|]| |[|+|]| @2|1|,|0|-|1| @6|A|l@1
|:+0&&|c|a|l@1| |p|o|p|u|p|_|s|h|o|w|(|g|:|s|o|m|e|_|i|d|)| @47

View File

@@ -4055,7 +4055,7 @@ func Test_popup_prop_not_visible()
setline(1, ['', 'some text', '', 'other text'])
prop_type_add('someprop', {})
prop_add(2, 9, {type: 'someprop', length: 5})
popup_create('attached to "some"', {
g:some_id = popup_create('attached to "some"', {
textprop: 'someprop',
highlight: 'ErrorMsg',
line: -1,
@@ -4076,6 +4076,12 @@ func Test_popup_prop_not_visible()
let buf = RunVimInTerminal('-S XtestPropNotVisble', #{rows: 10})
call VerifyScreenDump(buf, 'Test_popup_prop_not_visible_01', {})
" check that hiding and unhiding the popup works
call term_sendkeys(buf, ":call popup_hide(g:some_id)\<CR>")
call VerifyScreenDump(buf, 'Test_popup_prop_not_visible_01a', {})
call term_sendkeys(buf, ":call popup_show(g:some_id)\<CR>")
call VerifyScreenDump(buf, 'Test_popup_prop_not_visible_01b', {})
call term_sendkeys(buf, ":vert resize -14\<CR>")
call VerifyScreenDump(buf, 'Test_popup_prop_not_visible_02', {})

View File

@@ -746,6 +746,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
4913,
/**/
4912,
/**/

View File

@@ -631,15 +631,16 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
// Values for w_popup_flags.
#define POPF_IS_POPUP 0x01 // this is a popup window
#define POPF_HIDDEN 0x02 // popup is not displayed
#define POPF_CURSORLINE 0x04 // popup is highlighting at the cursorline
#define POPF_ON_CMDLINE 0x08 // popup overlaps command line
#define POPF_DRAG 0x10 // popup can be moved by dragging border
#define POPF_DRAGALL 0x20 // popup can be moved by dragging everywhere
#define POPF_RESIZE 0x40 // popup can be resized by dragging
#define POPF_MAPPING 0x80 // mapping keys
#define POPF_INFO 0x100 // used for info of popup menu
#define POPF_INFO_MENU 0x200 // align info popup with popup menu
#define POPF_POSINVERT 0x400 // vertical position can be inverted
#define POPF_HIDDEN_FORCE 0x04 // popup is explicitly set to not be displayed
#define POPF_CURSORLINE 0x08 // popup is highlighting at the cursorline
#define POPF_ON_CMDLINE 0x10 // popup overlaps command line
#define POPF_DRAG 0x20 // popup can be moved by dragging border
#define POPF_DRAGALL 0x40 // popup can be moved by dragging everywhere
#define POPF_RESIZE 0x80 // popup can be resized by dragging
#define POPF_MAPPING 0x100 // mapping keys
#define POPF_INFO 0x200 // used for info of popup menu
#define POPF_INFO_MENU 0x400 // align info popup with popup menu
#define POPF_POSINVERT 0x800 // vertical position can be inverted
// flags used in w_popup_handled
#define POPUP_HANDLED_1 0x01 // used by mouse_find_win()