patch 9.0.1923: curswant wrong on click with 've' and 'wrap' set

Commit: 
https://github.com/vim/vim/commit/db54e989b5cff3cc6442dfc500e3962cc1c0b6d0
Author: zeertzjq <zeert...@outlook.com>
Date:   Thu Sep 21 16:33:09 2023 +0200

    patch 9.0.1923: curswant wrong on click with 've' and 'wrap' set
    
    Problem:  curswant wrong on click with 've' and 'wrap' set
    Solution: Add w_leftcol to mouse click column.
    
    closes: #13142
    
    Signed-off-by: Christian Brabandt <c...@256bit.org>
    Co-authored-by: zeertzjq <zeert...@outlook.com>

diff --git a/src/drawline.c b/src/drawline.c
index 6f9044650..95ea3f025 100644
--- a/src/drawline.c
+++ b/src/drawline.c
@@ -3852,7 +3852,14 @@ win_line(
            else
                ScreenAttrs[wlv.off] = wlv.char_attr;
 
-           ScreenCols[wlv.off] = wlv.vcol;
+           if (wlv.draw_state > WL_NR
+#ifdef FEAT_DIFF
+                   && wlv.filler_todo <= 0
+#endif
+                   )
+               ScreenCols[wlv.off] = wlv.vcol;
+           else
+               ScreenCols[wlv.off] = -1;
 
            if (has_mbyte && (*mb_char2cells)(mb_c) > 1)
            {
@@ -3865,19 +3872,21 @@ win_line(
                else
                    // DBCS: Put second byte in the second screen char.
                    ScreenLines[wlv.off] = mb_c & 0xff;
+
                if (wlv.draw_state > WL_NR
 #ifdef FEAT_DIFF
                        && wlv.filler_todo <= 0
 #endif
                        )
-                   ++wlv.vcol;
+                   ScreenCols[wlv.off] = ++wlv.vcol;
+               else
+                   ScreenCols[wlv.off] = -1;
+
                // When "wlv.tocol" is halfway a character, set it to the end
                // of the character, otherwise highlighting won't stop.
                if (wlv.tocol == wlv.vcol)
                    ++wlv.tocol;
 
-               ScreenCols[wlv.off] = wlv.vcol;
-
 #ifdef FEAT_RIGHTLEFT
                if (wp->w_p_rl)
                {
diff --git a/src/mouse.c b/src/mouse.c
index ec0367375..f3342f905 100644
--- a/src/mouse.c
+++ b/src/mouse.c
@@ -2115,11 +2115,16 @@ retnomove:
                else
                    off_r = off_m - 1;
            }
-           col = ScreenCols[off_r] + (off_click - off_r);
+           colnr_T eol_vcol = ScreenCols[off_r];
+           if (eol_vcol < 0)
+               // Empty line or whole line before w_leftcol,
+               // with columns before buffer text
+               eol_vcol = curwin->w_leftcol - 1;
+           col = eol_vcol + (off_click - off_r);
        }
        else
-           // Clicking on an empty line
-           col = prev_col - curwin->w_wincol;
+           // Empty line or whole line before w_leftcol
+           col = prev_col - curwin->w_wincol + curwin->w_leftcol;
     }
     else if (col_from_screen >= 0)
     {
diff --git a/src/screen.c b/src/screen.c
index b4f55fe51..bb905fe51 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -18,8 +18,8 @@
  *                  displayed (excluding text written by external commands).
  * ScreenAttrs[off]  Contains the associated attributes.
  * ScreenCols[off]   Contains the virtual columns in the line. -1 means not
- *                  available (below last line), MAXCOL means after the end
- *                  of the line.
+ *                  available or before buffer text, MAXCOL means after the
+ *                  end of the line.
  *
  * LineOffset[row]   Contains the offset into ScreenLines*[], ScreenAttrs[]
  *                  and ScreenCols[] for each line.
diff --git a/src/testdir/test_virtualedit.vim b/src/testdir/test_virtualedit.vim
index 0cd5e9675..9f254c65a 100644
--- a/src/testdir/test_virtualedit.vim
+++ b/src/testdir/test_virtualedit.vim
@@ -599,6 +599,61 @@ func Test_virtualedit_mouse()
   call feedkeys("\<LeftMouse>", "xt")
   call assert_equal([0, 1, 10, 2, 15], getcurpos())
 
+  setlocal nowrap
+  call setline(2, repeat('a', 19))
+  normal! j14zl
+  redraw
+  call test_setmouse(row, 21 + 1)
+  call feedkeys("\<LeftMouse>", "xt")
+  call assert_equal([0, 1, 10, 2, 15], getcurpos())
+  call test_setmouse(row, 21 + 11)
+  call feedkeys("\<LeftMouse>", "xt")
+  call assert_equal([0, 1, 10, 12, 25], getcurpos())
+  call test_setmouse(row + 1, 21 + 1)
+  call feedkeys("\<LeftMouse>", "xt")
+  call assert_equal([0, 2, 15, 0, 15], getcurpos())
+  call test_setmouse(row + 1, 21 + 11)
+  call feedkeys("\<LeftMouse>", "xt")
+  call assert_equal([0, 2, 20, 5, 25], getcurpos())
+
+  setlocal number numberwidth=2
+  redraw
+  call test_setmouse(row, 21 + 3)
+  call feedkeys("\<LeftMouse>", "xt")
+  call assert_equal([0, 1, 10, 2, 15], getcurpos())
+  call test_setmouse(row, 21 + 13)
+  call feedkeys("\<LeftMouse>", "xt")
+  call assert_equal([0, 1, 10, 12, 25], getcurpos())
+  call test_setmouse(row + 1, 21 + 3)
+  call feedkeys("\<LeftMouse>", "xt")
+  call assert_equal([0, 2, 15, 0, 15], getcurpos())
+  call test_setmouse(row + 1, 21 + 13)
+  call feedkeys("\<LeftMouse>", "xt")
+  call assert_equal([0, 2, 20, 5, 25], getcurpos())
+  setlocal nonumber
+
+  if has('signs')
+    sign define Sign1 text=口
+    sign place 1 name=Sign1 line=1
+    sign place 2 name=Sign1 line=2
+    redraw
+    call test_setmouse(row, 21 + 3)
+    call feedkeys("\<LeftMouse>", "xt")
+    call assert_equal([0, 1, 10, 2, 15], getcurpos())
+    call test_setmouse(row, 21 + 13)
+    call feedkeys("\<LeftMouse>", "xt")
+    call assert_equal([0, 1, 10, 12, 25], getcurpos())
+    call test_setmouse(row + 1, 21 + 3)
+    call feedkeys("\<LeftMouse>", "xt")
+    call assert_equal([0, 2, 15, 0, 15], getcurpos())
+    call test_setmouse(row + 1, 21 + 13)
+    call feedkeys("\<LeftMouse>", "xt")
+    call assert_equal([0, 2, 20, 5, 25], getcurpos())
+    sign unplace 1
+    sign unplace 2
+    sign undefine Sign1
+  endif
+
   bwipe!
   let &mouse = save_mouse
   set virtualedit&
diff --git a/src/version.c b/src/version.c
index 7e8589b05..c08894288 100644
--- a/src/version.c
+++ b/src/version.c
@@ -699,6 +699,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1923,
 /**/
     1922,
 /**/

-- 
-- 
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 vim_dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/E1qjKvR-0055aq-0F%40256bit.org.

Raspunde prin e-mail lui