summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-09-21 16:33:09 +0200
committerChristian Brabandt <cb@256bit.org>2023-09-21 16:33:09 +0200
commitdb54e989b5cff3cc6442dfc500e3962cc1c0b6d0 (patch)
treef25258b3b57a48831842789bf08f9b0f8bce7d70
parenta7aba6ca5033a85839d997d29d5ca88a1f2acf8f (diff)
patch 9.0.1923: curswant wrong on click with 've' and 'wrap' setv9.0.1923
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 <cb@256bit.org> Co-authored-by: zeertzjq <zeertzjq@outlook.com>
-rw-r--r--src/drawline.c17
-rw-r--r--src/mouse.c11
-rw-r--r--src/screen.c4
-rw-r--r--src/testdir/test_virtualedit.vim55
-rw-r--r--src/version.c2
5 files changed, 80 insertions, 9 deletions
diff --git a/src/drawline.c b/src/drawline.c
index 6f9044650a..95ea3f025a 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 ec03673759..f3342f9056 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 b4f55fe510..bb905fe518 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 0cd5e9675e..9f254c65a4 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 7e8589b05c..c088942889 100644
--- a/src/version.c
+++ b/src/version.c
@@ -700,6 +700,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1923,
+/**/
1922,
/**/
1921,