# HG changeset patch # User Christian Brabandt # Date 1696449603 -7200 # Node ID 0eda094f9b7ed60965f6dc4f9a8b5d153b1368f0 # Parent f4c83cd2132c10a571efbb67beebbe7f148eee02 patch 9.0.1983: scrolling inactive window not possible with cursorbind Commit: https://github.com/vim/vim/commit/8e5f26ec6a1446aabffa7a0a7819a7462372a5b8 Author: zeertzjq Date: Wed Oct 4 21:45:33 2023 +0200 patch 9.0.1983: scrolling inactive window not possible with cursorbind Problem: Scrolling non-current window using mouse is inconsistent depending on 'scrollbind'/'scrolloff' and different from GUI vertical scrollbar when 'cursorbind' is set. Solution: Don't move cursor in non-current windows for 'cursorbind' if cursor in the current window didn't move. closes: #13219 closes: #13210 Signed-off-by: Christian Brabandt Co-authored-by: zeertzjq diff --git a/src/move.c b/src/move.c --- a/src/move.c +++ b/src/move.c @@ -3571,6 +3571,14 @@ halfpage(int flag, linenr_T Prenum) void do_check_cursorbind(void) { + static win_T *prev_curwin = NULL; + static pos_T prev_cursor = {0, 0, 0}; + + if (curwin == prev_curwin && EQUAL_POS(curwin->w_cursor, prev_cursor)) + return; + prev_curwin = curwin; + prev_cursor = curwin->w_cursor; + linenr_T line = curwin->w_cursor.lnum; colnr_T col = curwin->w_cursor.col; colnr_T coladd = curwin->w_cursor.coladd; diff --git a/src/testdir/test_scroll_opt.vim b/src/testdir/test_scroll_opt.vim --- a/src/testdir/test_scroll_opt.vim +++ b/src/testdir/test_scroll_opt.vim @@ -1,4 +1,4 @@ -" Test for reset 'scroll' and 'smoothscroll' +" Test for 'scroll', 'scrolloff', 'smoothscroll', etc. source check.vim source screendump.vim @@ -39,20 +39,74 @@ func Test_reset_scroll() endfunc func Test_scolloff_even_line_count() - new - resize 6 - setlocal scrolloff=3 - call setline(1, range(20)) - normal 2j - call assert_equal(1, getwininfo(win_getid())[0].topline) - normal j - call assert_equal(1, getwininfo(win_getid())[0].topline) - normal j - call assert_equal(2, getwininfo(win_getid())[0].topline) - normal j - call assert_equal(3, getwininfo(win_getid())[0].topline) + new + resize 6 + setlocal scrolloff=3 + call setline(1, range(20)) + normal 2j + call assert_equal(1, getwininfo(win_getid())[0].topline) + normal j + call assert_equal(1, getwininfo(win_getid())[0].topline) + normal j + call assert_equal(2, getwininfo(win_getid())[0].topline) + normal j + call assert_equal(3, getwininfo(win_getid())[0].topline) + + bwipe! +endfunc + +func Test_mouse_scroll_inactive_with_cursorbind() + for scb in [0, 1] + for so in [0, 1, 2] + let msg = $'scb={scb} so={so}' + + new | only + let w1 = win_getid() + setlocal cursorbind + let &l:scb = scb + let &l:so = so + call setline(1, range(101, 109)) + rightbelow vnew + let w2 = win_getid() + setlocal cursorbind + let &l:scb = scb + let &l:so = so + call setline(1, range(101, 109)) - bwipe! + normal! $ + call assert_equal(3, col('.', w1), msg) + call assert_equal(3, col('.', w2), msg) + call test_setmouse(1, 1) + call feedkeys("\", 'xt') + call assert_equal(4, line('w0', w1), msg) + call assert_equal(4 + so, line('.', w1), msg) + call assert_equal(1, line('w0', w2), msg) + call assert_equal(1, line('.', w2), msg) + call feedkeys("\", 'xt') + call assert_equal(7, line('w0', w1), msg) + call assert_equal(7 + so, line('.', w1), msg) + call assert_equal(1, line('w0', w2), msg) + call assert_equal(1, line('.', w2), msg) + call feedkeys("\", 'xt') + call assert_equal(4, line('w0', w1), msg) + call assert_equal(7 + so, line('.', w1), msg) + call assert_equal(1, line('w0', w2), msg) + call assert_equal(1, line('.', w2), msg) + call feedkeys("\", 'xt') + call assert_equal(1, line('w0', w1), msg) + call assert_equal(7 + so, line('.', w1), msg) + call assert_equal(1, line('w0', w2), msg) + call assert_equal(1, line('.', w2), msg) + normal! 0 + call assert_equal(1, line('.', w1), msg) + call assert_equal(1, col('.', w1), msg) + call assert_equal(1, line('.', w2), msg) + call assert_equal(1, col('.', w2), msg) + + bwipe! + bwipe! + endfor + endfor endfunc func Test_CtrlE_CtrlY_stop_at_end() diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -705,6 +705,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1983, +/**/ 1982, /**/ 1981,