Patch 8.1.1657
Problem:    Terminal: screen updates from 'balloonexpr' are not displayed.
Solution:   Update the screen if needed.  Fix the word position for
            "mousemoved".
Files:      src/beval.c, src/proto/beval.pro, src/popupwin.c, src/normal.c,
            src/proto/normal.pro


*** ../vim-8.1.1656/src/beval.c 2019-07-08 22:23:30.574768870 +0200
--- src/beval.c 2019-07-09 23:07:49.382246903 +0200
***************
*** 27,36 ****
        win_T       **winp,     // can be NULL
        linenr_T    *lnump,     // can be NULL
        char_u      **textp,
!       int         *colp)
  {
      int               row = mouserow;
      int               col = mousecol;
      win_T     *wp;
      char_u    *lbuf;
      linenr_T  lnum;
--- 27,38 ----
        win_T       **winp,     // can be NULL
        linenr_T    *lnump,     // can be NULL
        char_u      **textp,
!       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,105 ****
                    {
                        // Find the word under the cursor.
                        ++emsg_off;
!                       len = find_ident_at_pos(wp, lnum, (colnr_T)col, &lbuf,
!                                                                       flags);
                        --emsg_off;
                        if (len == 0)
                            return FAIL;
--- 100,107 ----
                    {
                        // Find the word under the cursor.
                        ++emsg_off;
!                       len = find_ident_at_pos(wp, lnum, (colnr_T)col,
!                                                         &lbuf, &scol, flags);
                        --emsg_off;
                        if (len == 0)
                            return FAIL;
***************
*** 112,118 ****
                if (lnump != NULL)
                    *lnump = lnum;
                *textp = lbuf;
!               *colp = col;
                return OK;
            }
        }
--- 114,123 ----
                if (lnump != NULL)
                    *lnump = lnum;
                *textp = lbuf;
!               if (colp != NULL)
!                   *colp = col;
!               if (startcolp != NULL)
!                   *startcolp = scol;
                return OK;
            }
        }
***************
*** 150,156 ****
  #endif
      if (find_word_under_cursor(row, col, getword,
                FIND_IDENT + FIND_STRING + FIND_EVAL,
!               winp, lnump, textp, colp) == OK)
      {
  #ifdef FEAT_VARTABS
        vim_free(beval->vts);
--- 155,161 ----
  #endif
      if (find_word_under_cursor(row, col, getword,
                FIND_IDENT + FIND_STRING + FIND_EVAL,
!               winp, lnump, textp, colp, NULL) == OK)
      {
  #ifdef FEAT_VARTABS
        vim_free(beval->vts);
***************
*** 296,307 ****
            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)
                redraw_after_callback(FALSE);
- # endif
  
            recursive = FALSE;
            return;
--- 301,310 ----
            if (result != NULL && result[0] != NUL)
                post_balloon(beval, result, NULL);
  
            // The 'balloonexpr' evaluation may show something on the screen
            // that requires a screen update.
!           if (must_redraw)
                redraw_after_callback(FALSE);
  
            recursive = FALSE;
            return;
*** ../vim-8.1.1656/src/proto/beval.pro 2019-07-07 20:30:43.518359624 +0200
--- src/proto/beval.pro 2019-07-09 23:14:00.572561678 +0200
***************
*** 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 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);
--- 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 
*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);
*** ../vim-8.1.1656/src/popupwin.c      2019-07-09 20:25:19.911815741 +0200
--- src/popupwin.c      2019-07-09 23:04:44.435128124 +0200
***************
*** 188,194 ****
      int               col;
  
      if (find_word_under_cursor(mouse_row, mouse_col, TRUE, flags,
!                                               NULL, NULL, &text, &col) == OK)
      {
        wp->w_popup_mouse_mincol = col;
        wp->w_popup_mouse_maxcol = col + STRLEN(text) - 1;
--- 188,194 ----
      int               col;
  
      if (find_word_under_cursor(mouse_row, mouse_col, TRUE, flags,
!                                        NULL, NULL, &text, NULL, &col) == OK)
      {
        wp->w_popup_mouse_mincol = col;
        wp->w_popup_mouse_maxcol = col + STRLEN(text) - 1;
***************
*** 1437,1442 ****
--- 1437,1443 ----
      {
        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.
*** ../vim-8.1.1656/src/normal.c        2019-07-07 18:27:52.365277132 +0200
--- src/normal.c        2019-07-09 23:21:57.510482992 +0200
***************
*** 2325,2330 ****
--- 2325,2331 ----
        ui_may_remove_balloon();
        if (p_bevalterm)
        {
+ ch_log(NULL, "setting balloon timer");
            profile_setlimit(p_bdlay, &bevalexpr_due);
            bevalexpr_due_set = TRUE;
        }
***************
*** 3327,3354 ****
   * 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_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
   *    already on one.
!  * 2. Search backward for the start of this identifier/string.
   *    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.
   *    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.
   */
      int
! find_ident_under_cursor(char_u **string, int find_type)
  {
      return find_ident_at_pos(curwin, curwin->w_cursor.lnum,
!                                    curwin->w_cursor.col, string, find_type);
  }
  
  /*
--- 3328,3355 ----
   * 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 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/text.  Doesn't move if
   *    already on one.
!  * 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/text.
   *    When FIND_IDENT isn't defined, we backup until a blank.
   *
!  * 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 **text, int find_type)
  {
      return find_ident_at_pos(curwin, curwin->w_cursor.lnum,
!                               curwin->w_cursor.col, text, NULL, find_type);
  }
  
  /*
***************
*** 3360,3392 ****
      win_T     *wp,
      linenr_T  lnum,
      colnr_T   startcol,
!     char_u    **string,
      int               find_type)
  {
      char_u    *ptr;
!     int               col = 0;            /* init to shut up GCC */
      int               i;
      int               this_class = 0;
      int               prev_class;
      int               prevcol;
!     int               bn = 0;     /* bracket nesting */
  
      /*
       * if i == 0: try to find an identifier
!      * if i == 1: try to find any non-white string
       */
      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
         */
        col = startcol;
        if (has_mbyte)
        {
            while (ptr[col] != NUL)
            {
!               /* Stop at a ']' to evaluate "a[x]". */
                if ((find_type & FIND_EVAL) && ptr[col] == ']')
                    break;
                this_class = mb_get_class(ptr + col);
--- 3361,3394 ----
      win_T     *wp,
      linenr_T  lnum,
      colnr_T   startcol,
!     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               i;
      int               this_class = 0;
      int               prev_class;
      int               prevcol;
!     int               bn = 0;         // bracket nesting
  
      /*
       * if i == 0: try to find an identifier
!      * 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/text
         */
        col = startcol;
        if (has_mbyte)
        {
            while (ptr[col] != NUL)
            {
!               // Stop at a ']' to evaluate "a[x]".
                if ((find_type & FIND_EVAL) && ptr[col] == ']')
                    break;
                this_class = mb_get_class(ptr + col);
***************
*** 3402,3412 ****
                    )
                ++col;
  
!       /* When starting on a ']' count it, so that we include the '['. */
        bn = ptr[col] == ']';
  
        /*
!        * 2. Back up to start of identifier/string.
         */
        if (has_mbyte)
        {
--- 3404,3414 ----
                    )
                ++col;
  
!       // When starting on a ']' count it, so that we include the '['.
        bn = ptr[col] == ']';
  
        /*
!        * 2. Back up to start of identifier/text.
         */
        if (has_mbyte)
        {
***************
*** 3432,3439 ****
                col = prevcol;
            }
  
!           /* If we don't want just any old string, or we've found an
!            * identifier, stop searching. */
            if (this_class > 2)
                this_class = 2;
            if (!(find_type & FIND_STRING) || this_class == 2)
--- 3434,3441 ----
                col = prevcol;
            }
  
!           // 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,3461 ****
                        ))
                --col;
  
!           /* If we don't want just any old string, or we've found an
!            * identifier, stop searching. */
            if (!(find_type & FIND_STRING) || vim_iswordc(ptr[col]))
                break;
        }
--- 3456,3463 ----
                        ))
                --col;
  
!           // 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,3470 ****
      if (ptr[col] == NUL || (i == 0
                && (has_mbyte ? this_class != 2 : !vim_iswordc(ptr[col]))))
      {
!       // didn't find an identifier or string
        if ((find_type & FIND_NOERROR) == 0)
        {
            if (find_type & FIND_STRING)
--- 3466,3472 ----
      if (ptr[col] == NUL || (i == 0
                && (has_mbyte ? this_class != 2 : !vim_iswordc(ptr[col]))))
      {
!       // didn't find an identifier or text
        if ((find_type & FIND_NOERROR) == 0)
        {
            if (find_type & FIND_STRING)
***************
*** 3475,3491 ****
        return 0;
      }
      ptr += col;
!     *string = ptr;
  
      /*
!      * 3. Find the end if the identifier/string.
       */
      bn = 0;
      startcol -= col;
      col = 0;
      if (has_mbyte)
      {
!       /* 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
--- 3477,3495 ----
        return 0;
      }
      ptr += col;
!     *text = ptr;
!     if (textcol != NULL)
!       *textcol = col;
  
      /*
!      * 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.
        this_class = mb_get_class(ptr);
        while (ptr[col] != NUL
                && ((i == 0 ? mb_get_class(ptr + col) == this_class
*** ../vim-8.1.1656/src/proto/normal.pro        2018-05-17 13:52:46.000000000 
+0200
--- src/proto/normal.pro        2019-07-09 23:13:23.364727054 +0200
***************
*** 7,14 ****
  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);
  void clear_showcmd(void);
  int add_to_showcmd(int c);
  void add_to_showcmd_c(int c);
--- 7,14 ----
  void end_visual_mode(void);
  void reset_VIsual_and_resel(void);
  void reset_VIsual(void);
! 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);
*** ../vim-8.1.1656/src/version.c       2019-07-09 20:25:19.911815741 +0200
--- src/version.c       2019-07-09 23:18:47.835302456 +0200
***************
*** 779,780 ****
--- 779,782 ----
  {   /* Add new patch number below this line */
+ /**/
+     1657,
  /**/

-- 
    f y cn rd ths thn y cn hv grt jb n cmptr prgrmmng

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/201907092122.x69LMUZ5008978%40masaka.moolenaar.net.
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui