]> granicus.if.org Git - vim/commitdiff
patch 8.1.1657: Terminal: screen updates from 'balloonexpr' are not displayed v8.1.1657
authorBram Moolenaar <Bram@vim.org>
Tue, 9 Jul 2019 21:22:15 +0000 (23:22 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 9 Jul 2019 21:22:15 +0000 (23:22 +0200)
Problem:    Terminal: screen updates from 'balloonexpr' are not displayed.
Solution:   Update the screen if needed.  Fix the word position for
            "mousemoved".

src/beval.c
src/normal.c
src/popupwin.c
src/proto/beval.pro
src/proto/normal.pro
src/version.c

index ef307c5246fb2cb1c574a1261e664f552bdab1cf..dc8966fe2fc692b1b4e3ca1ee1fdfa11bf3203cd 100644 (file)
@@ -27,10 +27,12 @@ find_word_under_cursor(
        win_T       **winp,     // can be NULL
        linenr_T    *lnump,     // can be NULL
        char_u      **textp,
-       int         *colp)
+       int         *colp,      // column where mouse hovers, can be NULL
+       int         *startcolp) // column where text starts, can be NULL
 {
     int                row = mouserow;
     int                col = mousecol;
+    int                scol;
     win_T      *wp;
     char_u     *lbuf;
     linenr_T   lnum;
@@ -98,8 +100,8 @@ find_word_under_cursor(
                    {
                        // Find the word under the cursor.
                        ++emsg_off;
-                       len = find_ident_at_pos(wp, lnum, (colnr_T)col, &lbuf,
-                                                                       flags);
+                       len = find_ident_at_pos(wp, lnum, (colnr_T)col,
+                                                         &lbuf, &scol, flags);
                        --emsg_off;
                        if (len == 0)
                            return FAIL;
@@ -112,7 +114,10 @@ find_word_under_cursor(
                if (lnump != NULL)
                    *lnump = lnum;
                *textp = lbuf;
-               *colp = col;
+               if (colp != NULL)
+                   *colp = col;
+               if (startcolp != NULL)
+                   *startcolp = scol;
                return OK;
            }
        }
@@ -150,7 +155,7 @@ get_beval_info(
 #endif
     if (find_word_under_cursor(row, col, getword,
                FIND_IDENT + FIND_STRING + FIND_EVAL,
-               winp, lnump, textp, colp) == OK)
+               winp, lnump, textp, colp, NULL) == OK)
     {
 #ifdef FEAT_VARTABS
        vim_free(beval->vts);
@@ -296,12 +301,10 @@ general_beval_cb(BalloonEval *beval, int state UNUSED)
            if (result != NULL && result[0] != NUL)
                post_balloon(beval, result, NULL);
 
-# ifdef FEAT_GUI
            // The 'balloonexpr' evaluation may show something on the screen
            // that requires a screen update.
-           if (gui.in_use && must_redraw)
+           if (must_redraw)
                redraw_after_callback(FALSE);
-# endif
 
            recursive = FALSE;
            return;
index f626f45dc1e02dce5fa2d45f56b15c25370474d2..6cac553155f70f497cbb39dd705cbd9ffb79ef86 100644 (file)
@@ -2325,6 +2325,7 @@ do_mouse(
        ui_may_remove_balloon();
        if (p_bevalterm)
        {
+ch_log(NULL, "setting balloon timer");
            profile_setlimit(p_bdlay, &bevalexpr_due);
            bevalexpr_due_set = TRUE;
        }
@@ -3327,28 +3328,28 @@ find_is_eval_item(
  * Find the identifier under or to the right of the cursor.
  * "find_type" can have one of three values:
  * FIND_IDENT:   find an identifier (keyword)
- * FIND_STRING:  find any non-white string
- * FIND_IDENT + FIND_STRING: find any non-white string, identifier preferred.
+ * FIND_STRING:  find any non-white text
+ * FIND_IDENT + FIND_STRING: find any non-white text, identifier preferred.
  * FIND_EVAL:   find text useful for C program debugging
  *
  * There are three steps:
- * 1. Search forward for the start of an identifier/string.  Doesn't move if
+ * 1. Search forward for the start of an identifier/text.  Doesn't move if
  *    already on one.
- * 2. Search backward for the start of this identifier/string.
+ * 2. Search backward for the start of this identifier/text.
  *    This doesn't match the real Vi but I like it a little better and it
  *    shouldn't bother anyone.
- * 3. Search forward to the end of this identifier/string.
+ * 3. Search forward to the end of this identifier/text.
  *    When FIND_IDENT isn't defined, we backup until a blank.
  *
- * Returns the length of the string, or zero if no string is found.
- * If a string is found, a pointer to the string is put in "*string".  This
- * string is not always NUL terminated.
+ * Returns the length of the text, or zero if no text is found.
+ * If text is found, a pointer to the text is put in "*text".  This
+ * points into the current buffer line and is not always NUL terminated.
  */
     int
-find_ident_under_cursor(char_u **string, int find_type)
+find_ident_under_cursor(char_u **text, int find_type)
 {
     return find_ident_at_pos(curwin, curwin->w_cursor.lnum,
-                                    curwin->w_cursor.col, string, find_type);
+                               curwin->w_cursor.col, text, NULL, find_type);
 }
 
 /*
@@ -3360,33 +3361,34 @@ find_ident_at_pos(
     win_T      *wp,
     linenr_T   lnum,
     colnr_T    startcol,
-    char_u     **string,
+    char_u     **text,
+    int                *textcol,       // column where "text" starts, can be NULL
     int                find_type)
 {
     char_u     *ptr;
-    int                col = 0;            /* init to shut up GCC */
+    int                col = 0;        // init to shut up GCC
     int                i;
     int                this_class = 0;
     int                prev_class;
     int                prevcol;
-    int                bn = 0;     /* bracket nesting */
+    int                bn = 0;         // bracket nesting
 
     /*
      * if i == 0: try to find an identifier
-     * if i == 1: try to find any non-white string
+     * if i == 1: try to find any non-white text
      */
     ptr = ml_get_buf(wp->w_buffer, lnum, FALSE);
     for (i = (find_type & FIND_IDENT) ? 0 : 1; i < 2; ++i)
     {
        /*
-        * 1. skip to start of identifier/string
+        * 1. skip to start of identifier/text
         */
        col = startcol;
        if (has_mbyte)
        {
            while (ptr[col] != NUL)
            {
-               /* Stop at a ']' to evaluate "a[x]". */
+               // Stop at a ']' to evaluate "a[x]".
                if ((find_type & FIND_EVAL) && ptr[col] == ']')
                    break;
                this_class = mb_get_class(ptr + col);
@@ -3402,11 +3404,11 @@ find_ident_at_pos(
                    )
                ++col;
 
-       /* When starting on a ']' count it, so that we include the '['. */
+       // When starting on a ']' count it, so that we include the '['.
        bn = ptr[col] == ']';
 
        /*
-        * 2. Back up to start of identifier/string.
+        * 2. Back up to start of identifier/text.
         */
        if (has_mbyte)
        {
@@ -3432,8 +3434,8 @@ find_ident_at_pos(
                col = prevcol;
            }
 
-           /* If we don't want just any old string, or we've found an
-            * identifier, stop searching. */
+           // If we don't want just any old text, or we've found an
+           // identifier, stop searching.
            if (this_class > 2)
                this_class = 2;
            if (!(find_type & FIND_STRING) || this_class == 2)
@@ -3454,8 +3456,8 @@ find_ident_at_pos(
                        ))
                --col;
 
-           /* If we don't want just any old string, or we've found an
-            * identifier, stop searching. */
+           // If we don't want just any old text, or we've found an
+           // identifier, stop searching.
            if (!(find_type & FIND_STRING) || vim_iswordc(ptr[col]))
                break;
        }
@@ -3464,7 +3466,7 @@ find_ident_at_pos(
     if (ptr[col] == NUL || (i == 0
                && (has_mbyte ? this_class != 2 : !vim_iswordc(ptr[col]))))
     {
-       // didn't find an identifier or string
+       // didn't find an identifier or text
        if ((find_type & FIND_NOERROR) == 0)
        {
            if (find_type & FIND_STRING)
@@ -3475,17 +3477,19 @@ find_ident_at_pos(
        return 0;
     }
     ptr += col;
-    *string = ptr;
+    *text = ptr;
+    if (textcol != NULL)
+       *textcol = col;
 
     /*
-     * 3. Find the end if the identifier/string.
+     * 3. Find the end if the identifier/text.
      */
     bn = 0;
     startcol -= col;
     col = 0;
     if (has_mbyte)
     {
-       /* Search for point of changing multibyte character class. */
+       // Search for point of changing multibyte character class.
        this_class = mb_get_class(ptr);
        while (ptr[col] != NUL
                && ((i == 0 ? mb_get_class(ptr + col) == this_class
index a997cde87dea53be60cdcf0b1f7cab0660eece9f..59aaa6617bbf6473343b683b22951211cafee437 100644 (file)
@@ -188,7 +188,7 @@ set_mousemoved_columns(win_T *wp, int flags)
     int                col;
 
     if (find_word_under_cursor(mouse_row, mouse_col, TRUE, flags,
-                                               NULL, NULL, &text, &col) == OK)
+                                        NULL, NULL, &text, NULL, &col) == OK)
     {
        wp->w_popup_mouse_mincol = col;
        wp->w_popup_mouse_maxcol = col + STRLEN(text) - 1;
@@ -1437,6 +1437,7 @@ check_mouse_moved(win_T *wp, win_T *mouse_wp)
     {
        typval_T res;
 
+ch_log(NULL, "closing popup %d", wp->w_id);
        res.v_type = VAR_NUMBER;
        res.vval.v_number = -2;
        // Careful: this makes "wp" invalid.
index 62eba9ef0b42d52acf6ead60beefdf95d80ae978..8b67e383db7b19b15cb5c2b78775bacd0bd2a8cd 100644 (file)
@@ -1,5 +1,5 @@
 /* beval.c */
-int find_word_under_cursor(int mouserow, int mousecol, int getword, int flags, win_T **winp, linenr_T *lnump, char_u **textp, int *colp);
+int find_word_under_cursor(int mouserow, int mousecol, int getword, int flags, win_T **winp, linenr_T *lnump, char_u **textp, int *colp, int *startcolp);
 int get_beval_info(BalloonEval *beval, int getword, win_T **winp, linenr_T *lnump, char_u **textp, int *colp);
 void post_balloon(BalloonEval *beval, char_u *mesg, list_T *list);
 int can_use_beval(void);
index 55d12bb2927cbf68966d70667e53143028c915c7..cc4bf7dfc9cb0e14239e0fd2826423473199a0b0 100644 (file)
@@ -7,8 +7,8 @@ void check_visual_highlight(void);
 void end_visual_mode(void);
 void reset_VIsual_and_resel(void);
 void reset_VIsual(void);
-int find_ident_under_cursor(char_u **string, int find_type);
-int find_ident_at_pos(win_T *wp, linenr_T lnum, colnr_T startcol, char_u **string, int find_type);
+int find_ident_under_cursor(char_u **text, int find_type);
+int find_ident_at_pos(win_T *wp, linenr_T lnum, colnr_T startcol, char_u **text, int *textcol, int find_type);
 void clear_showcmd(void);
 int add_to_showcmd(int c);
 void add_to_showcmd_c(int c);
index c58cbc588fb462c92ee39140b249a101ff46c425..fb21f07712f4908f91b794dc7fab82b01ff324c2 100644 (file)
@@ -777,6 +777,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1657,
 /**/
     1656,
 /**/