From 03cd697d635f1b0e7ffe21cf8244a8fb755f2ddb Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Wed, 20 Sep 2023 20:08:40 +0200 Subject: [PATCH] patch 9.0.1919: Wrong curswant when clicking on empty line or with vsplits Problem: Wrong curswant when clicking on empty line or with vsplits. Solution: Don't check for ScreenCols[] before the start of the window and handle empty line properly. closes: #13132 Signed-off-by: Christian Brabandt Co-authored-by: zeertzjq --- src/mouse.c | 8 ++++---- src/testdir/test_normal.vim | 33 ++++++++++++++++++++++++++++++++ src/testdir/test_virtualedit.vim | 23 ++++++++++++---------- src/version.c | 2 ++ 4 files changed, 52 insertions(+), 14 deletions(-) diff --git a/src/mouse.c b/src/mouse.c index aa06e6cb50..ec03673759 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -2101,11 +2101,11 @@ retnomove: if (col_from_screen == MAXCOL) { // When clicking after end of line, still need to set correct curswant - int off_l = LineOffset[prev_row]; + int off_l = LineOffset[prev_row] + curwin->w_wincol; if (ScreenCols[off_l] < MAXCOL) { // Binary search to find last char in line - int off_r = off_l + prev_col; + int off_r = LineOffset[prev_row] + prev_col; int off_click = off_r; while (off_l < off_r) { @@ -2118,8 +2118,8 @@ retnomove: col = ScreenCols[off_r] + (off_click - off_r); } else - // Shouldn't normally happen - col = MAXCOL; + // Clicking on an empty line + col = prev_col - curwin->w_wincol; } else if (col_from_screen >= 0) { diff --git a/src/testdir/test_normal.vim b/src/testdir/test_normal.vim index 9111eb84a1..c7d37f066f 100644 --- a/src/testdir/test_normal.vim +++ b/src/testdir/test_normal.vim @@ -4104,6 +4104,39 @@ func Test_normal_click_on_double_width_char() let &mouse = save_mouse endfunc +func Test_normal_click_on_empty_line() + let save_mouse = &mouse + set mouse=a + botright new + call setline(1, ['', '', '']) + let row = win_screenpos(0)[0] + 2 + 20vsplit + redraw + + call test_setmouse(row, 1) + call feedkeys("\", 'xt') + call assert_equal([0, 3, 1, 0, 1], getcurpos()) + call test_setmouse(row, 2) + call feedkeys("\", 'xt') + call assert_equal([0, 3, 1, 0, 2], getcurpos()) + call test_setmouse(row, 10) + call feedkeys("\", 'xt') + call assert_equal([0, 3, 1, 0, 10], getcurpos()) + + call test_setmouse(row, 21 + 1) + call feedkeys("\", 'xt') + call assert_equal([0, 3, 1, 0, 1], getcurpos()) + call test_setmouse(row, 21 + 2) + call feedkeys("\", 'xt') + call assert_equal([0, 3, 1, 0, 2], getcurpos()) + call test_setmouse(row, 21 + 10) + call feedkeys("\", 'xt') + call assert_equal([0, 3, 1, 0, 10], getcurpos()) + + bwipe! + let &mouse = save_mouse +endfunc + func Test_normal33_g_cmd_nonblank() " Test that g goes to the last non-blank char and g$ to the last " visible column diff --git a/src/testdir/test_virtualedit.vim b/src/testdir/test_virtualedit.vim index 44c5ec8962..0cd5e9675e 100644 --- a/src/testdir/test_virtualedit.vim +++ b/src/testdir/test_virtualedit.vim @@ -564,35 +564,38 @@ func Test_virtualedit_mouse() let save_mouse = &mouse set mouse=a set virtualedit=all - new + botright new + let row = win_screenpos(0)[0] + 20vsplit + wincmd p call setline(1, ["text\tword"]) redraw - call test_setmouse(1, 4) + call test_setmouse(row, 21 + 4) call feedkeys("\", "xt") call assert_equal([0, 1, 4, 0, 4], getcurpos()) - call test_setmouse(1, 5) + call test_setmouse(row, 21 + 5) call feedkeys("\", "xt") call assert_equal([0, 1, 5, 0, 5], getcurpos()) - call test_setmouse(1, 6) + call test_setmouse(row, 21 + 6) call feedkeys("\", "xt") call assert_equal([0, 1, 5, 1, 6], getcurpos()) - call test_setmouse(1, 7) + call test_setmouse(row, 21 + 7) call feedkeys("\", "xt") call assert_equal([0, 1, 5, 2, 7], getcurpos()) - call test_setmouse(1, 8) + call test_setmouse(row, 21 + 8) call feedkeys("\", "xt") call assert_equal([0, 1, 5, 3, 8], getcurpos()) - call test_setmouse(1, 9) + call test_setmouse(row, 21 + 9) call feedkeys("\", "xt") call assert_equal([0, 1, 6, 0, 9], getcurpos()) - call test_setmouse(1, 12) + call test_setmouse(row, 21 + 12) call feedkeys("\", "xt") call assert_equal([0, 1, 9, 0, 12], getcurpos()) - call test_setmouse(1, 13) + call test_setmouse(row, 21 + 13) call feedkeys("\", "xt") call assert_equal([0, 1, 10, 0, 13], getcurpos()) - call test_setmouse(1, 15) + call test_setmouse(row, 21 + 15) call feedkeys("\", "xt") call assert_equal([0, 1, 10, 2, 15], getcurpos()) diff --git a/src/version.c b/src/version.c index 1ca184268c..ec6cce3084 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 */ +/**/ + 1919, /**/ 1918, /**/