# HG changeset patch # User Christian Brabandt # Date 1695233707 -7200 # Node ID cb447202030dae07b5194a9f689e8fe3bc8d5d80 # Parent 2d4bb2485c2a08f1e0e3975e65798bf2d3d587f4 patch 9.0.1919: Wrong curswant when clicking on empty line or with vsplits Commit: https://github.com/vim/vim/commit/03cd697d635f1b0e7ffe21cf8244a8fb755f2ddb Author: zeertzjq Date: Wed Sep 20 20:08:40 2023 +0200 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 diff --git a/src/mouse.c b/src/mouse.c --- 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 --- a/src/testdir/test_normal.vim +++ b/src/testdir/test_normal.vim @@ -4104,6 +4104,39 @@ func Test_normal_click_on_double_width_c 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 --- 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 --- 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 */ /**/ + 1919, +/**/ 1918, /**/ 1917,