]> granicus.if.org Git - vim/commitdiff
patch 8.2.4913: popup_hide() does not always have effect v8.2.4913
authorBram Moolenaar <Bram@vim.org>
Sun, 8 May 2022 14:00:04 +0000 (15:00 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 8 May 2022 14:00:04 +0000 (15:00 +0100)
Problem:    Popup_hide() does not always have effect.
Solution:   Add the POPF_HIDDEN_FORCE flag. (closes #10376)

src/popupwin.c
src/testdir/dumps/Test_popup_prop_not_visible_01a.dump [new file with mode: 0644]
src/testdir/dumps/Test_popup_prop_not_visible_01b.dump [new file with mode: 0644]
src/testdir/test_popupwin.vim
src/version.c
src/vim.h

index 27e9fe12e6d601d4799c9b581f7a9d4e1ff9f9ac..2306dacc1ac224e0ca9390226b29958818171669 100644 (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;
diff --git a/src/testdir/dumps/Test_popup_prop_not_visible_01a.dump b/src/testdir/dumps/Test_popup_prop_not_visible_01a.dump
new file mode 100644 (file)
index 0000000..0b97cb8
--- /dev/null
@@ -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
diff --git a/src/testdir/dumps/Test_popup_prop_not_visible_01b.dump b/src/testdir/dumps/Test_popup_prop_not_visible_01b.dump
new file mode 100644 (file)
index 0000000..e8a5c2e
--- /dev/null
@@ -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
index 3e5373ca86abc9f238a1a50f7883bc2d0d8a6e05..f58b159e3abdefd5122dab006e7acbdaae0e16ee 100644 (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', {})
 
index ead455bbdc5c7367e955676df8b59713a15c47a1..792bd24b9d03c62be18708c743ba52ed7bb63ba1 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4913,
 /**/
     4912,
 /**/
index 9e34c2e0b6100884975cb3fbbd1e12d1765c9caa..f17da411fcd78555cc90f1bfe2c5c11232981117 100644 (file)
--- a/src/vim.h
+++ b/src/vim.h
@@ -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()