]> granicus.if.org Git - vim/commitdiff
patch 8.1.1303: not possible to hide a balloon v8.1.1303
authorBram Moolenaar <Bram@vim.org>
Thu, 9 May 2019 11:50:16 +0000 (13:50 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 9 May 2019 11:50:16 +0000 (13:50 +0200)
Problem:    Not possible to hide a balloon.
Solution:   Hide the balloon when balloon_show() is called with an empty
            string or list.  Add balloon_gettext().

runtime/doc/eval.txt
src/beval.h
src/evalfunc.c
src/gui_beval.c
src/gui_w32.c
src/popupmnu.c
src/testdir/test_balloon.vim
src/version.c

index 84001b7a021748d75436b4dd8efb4e0c9e4a5b4d..15732d6504c672d75dd1f092cbc4259ed2772a99 100644 (file)
@@ -2226,6 +2226,7 @@ assert_true({actual} [, {msg}])   Number  assert {actual} is true
 asin({expr})                   Float   arc sine of {expr}
 atan({expr})                   Float   arc tangent of {expr}
 atan2({expr1}, {expr2})                Float   arc tangent of {expr1} / {expr2}
+balloon_gettext()              String  current text in the balloon
 balloon_show({expr})           none    show {expr} inside the balloon
 balloon_split({msg})           List    split {msg} as used for a balloon
 browse({save}, {title}, {initdir}, {default})
@@ -3007,15 +3008,20 @@ atan2({expr1}, {expr2})                                 *atan2()*
 <                      2.356194
                {only available when compiled with the |+float| feature}
 
+balloon_gettext()                                      *balloon_gettext()*
+               Return the current text in the balloon.  Only for the string,
+               not used for the List.
+
 balloon_show({expr})                                   *balloon_show()*
                Show {expr} inside the balloon.  For the GUI {expr} is used as
                a string.  For a terminal {expr} can be a list, which contains
                the lines of the balloon.  If {expr} is not a list it will be
                split with |balloon_split()|.
+               If {expr} is an empty string any existing balloon is removed.
 
                Example: >
                        func GetBalloonContent()
-                          " initiate getting the content
+                          " ... initiate getting the content
                           return ''
                        endfunc
                        set balloonexpr=GetBalloonContent()
@@ -4229,6 +4235,8 @@ feedkeys({string} [, {mode}])                             *feedkeys()*
                and "\..." notation |expr-quote|. For example,
                feedkeys("\<CR>") simulates pressing of the <Enter> key. But
                feedkeys('\<CR>') pushes 5 characters.
+               A special code that might be useful is <Ignore>, it exits the
+               wait for a character without doing anything.  *<Ignore>*
 
                {mode} is a String, which can contain these character flags:
                'm'     Remap keys. This is default.  If {mode} is absent,
index 090c5fb55cb14c97b717af7d944a1acca8c528ad..60cf1ab9dca4ddd8f1cdd1505a5b359ac44b0222 100644 (file)
@@ -75,7 +75,7 @@ typedef struct BalloonEvalStruct
 #ifdef FEAT_VARTABS
     int                        *vts;           // vartabstop setting for this buffer
 #endif
-    char_u             *msg;
+    char_u             *msg;           // allocated: current text
 #ifdef FEAT_GUI_MSWIN
     void               *tofree;
 #endif
index ca412f7549311d59ec4547791562853a54e7d8da..eaefccf620b478d9dd1d6c78d2f14449c150ed55 100644 (file)
@@ -63,6 +63,7 @@ static void f_atan(typval_T *argvars, typval_T *rettv);
 static void f_atan2(typval_T *argvars, typval_T *rettv);
 #endif
 #ifdef FEAT_BEVAL
+static void f_balloon_gettext(typval_T *argvars, typval_T *rettv);
 static void f_balloon_show(typval_T *argvars, typval_T *rettv);
 # if defined(FEAT_BEVAL_TERM)
 static void f_balloon_split(typval_T *argvars, typval_T *rettv);
@@ -552,6 +553,7 @@ static struct fst
     {"atan2",          2, 2, f_atan2},
 #endif
 #ifdef FEAT_BEVAL
+    {"balloon_gettext",        0, 0, f_balloon_gettext},
     {"balloon_show",   1, 1, f_balloon_show},
 # if defined(FEAT_BEVAL_TERM)
     {"balloon_split",  1, 1, f_balloon_split},
@@ -1763,6 +1765,19 @@ f_atan2(typval_T *argvars, typval_T *rettv)
  * "balloon_show()" function
  */
 #ifdef FEAT_BEVAL
+    static void
+f_balloon_gettext(typval_T *argvars UNUSED, typval_T *rettv)
+{
+    rettv->v_type = VAR_STRING;
+    if (balloonEval != NULL)
+    {
+       if (balloonEval->msg == NULL)
+           rettv->vval.v_string = NULL;
+       else
+           rettv->vval.v_string = vim_strsave(balloonEval->msg);
+    }
+}
+
     static void
 f_balloon_show(typval_T *argvars, typval_T *rettv UNUSED)
 {
@@ -1773,9 +1788,21 @@ f_balloon_show(typval_T *argvars, typval_T *rettv UNUSED)
                && !gui.in_use
 # endif
           )
-           post_balloon(balloonEval, NULL, argvars[0].vval.v_list);
+       {
+           list_T *l = argvars[0].vval.v_list;
+
+           // empty list removes the balloon
+           post_balloon(balloonEval, NULL,
+                                      l == NULL || l->lv_len == 0 ? NULL : l);
+       }
        else
-           post_balloon(balloonEval, tv_get_string_chk(&argvars[0]), NULL);
+       {
+           char_u *mesg = tv_get_string_chk(&argvars[0]);
+
+           if (mesg != NULL)
+               // empty string removes the balloon
+               post_balloon(balloonEval, *mesg == NUL ? NULL : mesg, NULL);
+       }
     }
 }
 
index e1e093f375ec9797b9a2be19248c8b8f71bf3a14..f4309b8c33bcac81dfc21977dcebf2b6ad156878 100644 (file)
@@ -117,7 +117,8 @@ gui_mch_create_beval_area(
        beval->appContext = XtWidgetToApplicationContext((Widget)target);
 #endif
        beval->showState = ShS_NEUTRAL;
-       beval->msg = mesg;
+       vim_free(beval->msg);
+       beval->msg = mesg == NULL ? NULL : vim_strsave(mesg);
        beval->msgCB = mesgCB;
        beval->clientData = clientData;
 
@@ -208,8 +209,9 @@ gui_mch_currently_showing_beval(void)
     void
 gui_mch_post_balloon(BalloonEval *beval, char_u *mesg)
 {
-    beval->msg = mesg;
-    if (mesg != NULL)
+    vim_free(beval->msg);
+    beval->msg = mesg == NULL ? NULL : vim_strsave(mesg);
+    if (beval->msg != NULL)
        drawBalloon(beval);
     else
        undrawBalloon(beval);
@@ -225,6 +227,7 @@ gui_mch_post_balloon(BalloonEval *beval, char_u *mesg)
     void
 gui_mch_unpost_balloon(BalloonEval *beval)
 {
+    VIM_CLEAR(beval->msg);
     undrawBalloon(beval);
 }
 #endif
@@ -975,6 +978,7 @@ drawBalloon(BalloonEval *beval)
        gtk_widget_show(beval->balloonShell);
 
        beval->showState = ShS_SHOWING;
+       gui_mch_update();
     }
 }
 
index 69212ebb759f73e6e59b6929e00705821e08fbaf..8d28148808e97fe89ff5d23367d4ddeddca47af7 100644 (file)
@@ -8506,6 +8506,15 @@ gui_mch_post_balloon(BalloonEval *beval, char_u *mesg)
 {
     POINT   pt;
 
+    vim_free(beval->msg);
+    beval->msg = mesg == NULL ? NULL : vim_strsave(mesg);
+    if (beval->msg == NULL)
+    {
+       delete_tooltip(beval);
+       beval->showState = ShS_NEUTRAL;
+       return;
+    }
+
     // TRACE0("gui_mch_post_balloon {{{");
     if (beval->showState == ShS_SHOWING)
        return;
index 2639d97d56418a8b512c9e64983dbad77cf48d7e..0b002f53e3c92a7ebc5029f084c33a614a0cbacf 100644 (file)
@@ -1154,7 +1154,10 @@ ui_post_balloon(char_u *mesg, list_T *list)
     ui_remove_balloon();
 
     if (mesg == NULL && list == NULL)
+    {
+       pum_undisplay();
        return;
+    }
     if (list != NULL)
     {
        listitem_T  *li;
index 966587c31245117ef27d2bb11f2819a66f999b25..57d8dcce308940f17b600a93917929a5723b447a 100644 (file)
@@ -1,8 +1,7 @@
 " Tests for 'balloonevalterm'.
 
-if !has('balloon_eval_term') || has('gui_running')
-  finish
-endif
+" Tests that only work in the terminal.
+if has('balloon_eval_term') && !has('gui_running')
 
 source screendump.vim
 if !CanRunVimInTerminal()
@@ -53,3 +52,24 @@ func Test_balloon_eval_term_visual()
   call StopVimInTerminal(buf)
   call delete('XTest_beval_visual')
 endfunc
+
+endif
+
+" Tests that only work in the GUI
+if has('gui_running')
+
+func Test_balloon_show_gui()
+  let msg = 'this this this this'
+  call balloon_show(msg)
+  call assert_equal(msg, balloon_gettext())
+  sleep 10m
+  call balloon_show('')
+
+  let msg = 'that that'
+  call balloon_show(msg)
+  call assert_equal(msg, balloon_gettext())
+  sleep 10m
+  call balloon_show('')
+endfunc
+
+endif
index 96c72faa275a189aa2bd2beef4351339689a1851..8aef9ddaf8db68d1f7ccbbf8a5a9e91f73a55346 100644 (file)
@@ -767,6 +767,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1303,
 /**/
     1302,
 /**/