Mercurial > vim
changeset 33307:cb447202030d v9.0.1919
patch 9.0.1919: Wrong curswant when clicking on empty line or with vsplits
Commit: https://github.com/vim/vim/commit/03cd697d635f1b0e7ffe21cf8244a8fb755f2ddb
Author: zeertzjq <zeertzjq@outlook.com>
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 <cb@256bit.org>
Co-authored-by: zeertzjq <zeertzjq@outlook.com>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Wed, 20 Sep 2023 20:15:07 +0200 |
parents | 2d4bb2485c2a |
children | 6e6018705b36 |
files | src/mouse.c src/testdir/test_normal.vim src/testdir/test_virtualedit.vim src/version.c |
diffstat | 4 files changed, 52 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- 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) {
--- 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("\<LeftMouse>", 'xt') + call assert_equal([0, 3, 1, 0, 1], getcurpos()) + call test_setmouse(row, 2) + call feedkeys("\<LeftMouse>", 'xt') + call assert_equal([0, 3, 1, 0, 2], getcurpos()) + call test_setmouse(row, 10) + call feedkeys("\<LeftMouse>", 'xt') + call assert_equal([0, 3, 1, 0, 10], getcurpos()) + + call test_setmouse(row, 21 + 1) + call feedkeys("\<LeftMouse>", 'xt') + call assert_equal([0, 3, 1, 0, 1], getcurpos()) + call test_setmouse(row, 21 + 2) + call feedkeys("\<LeftMouse>", 'xt') + call assert_equal([0, 3, 1, 0, 2], getcurpos()) + call test_setmouse(row, 21 + 10) + call feedkeys("\<LeftMouse>", '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<End> goes to the last non-blank char and g$ to the last " visible column
--- 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("\<LeftMouse>", "xt") call assert_equal([0, 1, 4, 0, 4], getcurpos()) - call test_setmouse(1, 5) + call test_setmouse(row, 21 + 5) call feedkeys("\<LeftMouse>", "xt") call assert_equal([0, 1, 5, 0, 5], getcurpos()) - call test_setmouse(1, 6) + call test_setmouse(row, 21 + 6) call feedkeys("\<LeftMouse>", "xt") call assert_equal([0, 1, 5, 1, 6], getcurpos()) - call test_setmouse(1, 7) + call test_setmouse(row, 21 + 7) call feedkeys("\<LeftMouse>", "xt") call assert_equal([0, 1, 5, 2, 7], getcurpos()) - call test_setmouse(1, 8) + call test_setmouse(row, 21 + 8) call feedkeys("\<LeftMouse>", "xt") call assert_equal([0, 1, 5, 3, 8], getcurpos()) - call test_setmouse(1, 9) + call test_setmouse(row, 21 + 9) call feedkeys("\<LeftMouse>", "xt") call assert_equal([0, 1, 6, 0, 9], getcurpos()) - call test_setmouse(1, 12) + call test_setmouse(row, 21 + 12) call feedkeys("\<LeftMouse>", "xt") call assert_equal([0, 1, 9, 0, 12], getcurpos()) - call test_setmouse(1, 13) + call test_setmouse(row, 21 + 13) call feedkeys("\<LeftMouse>", "xt") call assert_equal([0, 1, 10, 0, 13], getcurpos()) - call test_setmouse(1, 15) + call test_setmouse(row, 21 + 15) call feedkeys("\<LeftMouse>", "xt") call assert_equal([0, 1, 10, 2, 15], getcurpos())