diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-09-21 16:33:09 +0200 |
---|---|---|
committer | Christian Brabandt <cb@256bit.org> | 2023-09-21 16:33:09 +0200 |
commit | db54e989b5cff3cc6442dfc500e3962cc1c0b6d0 (patch) | |
tree | f25258b3b57a48831842789bf08f9b0f8bce7d70 | |
parent | a7aba6ca5033a85839d997d29d5ca88a1f2acf8f (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.c | 17 | ||||
-rw-r--r-- | src/mouse.c | 11 | ||||
-rw-r--r-- | src/screen.c | 4 | ||||
-rw-r--r-- | src/testdir/test_virtualedit.vim | 55 | ||||
-rw-r--r-- | src/version.c | 2 |
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, |