]> granicus.if.org Git - vim/commitdiff
patch 8.1.1659: popup window "mousemoved" values not correct v8.1.1659
authorBram Moolenaar <Bram@vim.org>
Wed, 10 Jul 2019 19:55:54 +0000 (21:55 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 10 Jul 2019 19:55:54 +0000 (21:55 +0200)
Problem:    Popup window "mousemoved" values not correct.
Solution:   Convert text column to mouse column.

runtime/doc/popup.txt
src/popupwin.c
src/version.c

index 13674109eedf6180e6f9fc30e53a1577c7bf73f5..ba4dc3fc155d285db8a537e1257c787cc9b2f54a 100644 (file)
@@ -192,7 +192,7 @@ popup_beval({what}, {options})                      *popup_beval()*
                  let pos = screenpos(v:beval_winnr, v:beval_lnum, v:beval_col)
                  call popup_create({what}, {
                        \ 'pos': 'botleft',
-                       \ 'line': pos.lnum - 1,
+                       \ 'line': pos.row - 1,
                        \ 'col': pos.col,
                        \ 'mousemoved': 'WORD',
                        \ })
@@ -762,38 +762,49 @@ Example for using a popup window for 'ballooneval': >
        set ballooneval balloonevalterm
        set balloonexpr=BalloonExpr()
        let s:winid = 0
+       let s:last_text = ''
 
        func BalloonExpr()
-         if s:winid
+         if s:winid && popup_getpos(s:winid) != {}
+           " previous popup window still shows
+           if v:beval_text == s:last_text
+             " Still the same text, keep the existing popup
+             return ''
+           endif
            call popup_close(s:winid)
-           let s:winid = 0
          endif
-         let s:winid = popup_beval([bufname(v:beval_bufnr), v:beval_text], {})
+         let s:winid = popup_beval(v:beval_text, {'mousemoved': 'word'})
+         let s:last_text = v:beval_text
          return ''
        endfunc
 <
 If the text has to be obtained asynchronously return an empty string from the
 expression function and call popup_beval() once the text is available.  In
-this example similated with a timer callback: >
+this example simulated with a timer callback: >
 
        set ballooneval balloonevalterm
        set balloonexpr=BalloonExpr()
        let s:winid = 0
+       let s:balloonText = ''
 
        func BalloonExpr()
-         if s:winid
+         if s:winid && popup_getpos(s:winid) != {}
+           " previous popup window still shows
+           if  v:beval_text == s:balloonText
+             " Still the same text, keep the existing popup
+             return ''
+           endif
            call popup_close(s:winid)
            let s:winid = 0
          endif
          " simulate an asynchronous loopup for the text to display
-         let s:balloonFile = bufname(v:beval_bufnr)
-         let s:balloonWord = v:beval_text
+         let s:balloonText = v:beval_text
          call timer_start(100, 'ShowPopup')
          return ''
        endfunc
 
        func ShowPopup(id)
-         let s:winid = popup_beval([s:balloonFile, s:balloonWord], {})
+         let s:winid = popup_beval(s:balloonText, {'mousemoved': 'word'})
        endfunc
 <
 
index c6355e122aa2e48b6a97d61946a63cc4f5598537..f2b31300f07a754eb8b2e8237a012f560e55e599 100644 (file)
@@ -184,14 +184,24 @@ set_mousemoved_values(win_T *wp)
     static void
 set_mousemoved_columns(win_T *wp, int flags)
 {
+    win_T      *textwp;
     char_u     *text;
     int                col;
+    pos_T      pos;
+    colnr_T    mcol;
 
     if (find_word_under_cursor(mouse_row, mouse_col, TRUE, flags,
-                                        NULL, NULL, &text, NULL, &col) == OK)
+                                 &textwp, &pos.lnum, &text, NULL, &col) == OK)
     {
-       wp->w_popup_mouse_mincol = col;
-       wp->w_popup_mouse_maxcol = col + STRLEN(text) - 1;
+       // convert text column to mouse column
+       pos.col = col;
+       pos.coladd = 0;
+       getvcol(textwp, &pos, &mcol, NULL, NULL);
+       wp->w_popup_mouse_mincol = mcol;
+
+       pos.col = col + STRLEN(text) - 1;
+       getvcol(textwp, &pos, NULL, NULL, &mcol);
+       wp->w_popup_mouse_maxcol = mcol;
        vim_free(text);
     }
 }
index 5cede94f95be67e39ec5ef6e7878508a2603338c..5e83159edfbf34f207ee54bd3d8ab3845d296a96 100644 (file)
@@ -777,6 +777,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1659,
 /**/
     1658,
 /**/