summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-10-04 21:45:33 +0200
committerChristian Brabandt <cb@256bit.org>2023-10-04 21:45:33 +0200
commit8e5f26ec6a1446aabffa7a0a7819a7462372a5b8 (patch)
tree263693efac261c5910049981776d0ed7d3c71878
parent4dbb2669e9ed9ec6864705dcb569715e417e1303 (diff)
patch 9.0.1983: scrolling inactive window not possible with cursorbindv9.0.1983
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 <cb@256bit.org> Co-authored-by: zeertzjq <zeertzjq@outlook.com>
-rw-r--r--src/move.c8
-rw-r--r--src/testdir/test_scroll_opt.vim84
-rw-r--r--src/version.c2
3 files changed, 79 insertions, 15 deletions
diff --git a/src/move.c b/src/move.c
index e5309df486..46e4f358dc 100644
--- 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
index 81670cdd7a..005e45bb59 100644
--- 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)
-
- bwipe!
+ 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))
+
+ normal! $
+ call assert_equal(3, col('.', w1), msg)
+ call assert_equal(3, col('.', w2), msg)
+ call test_setmouse(1, 1)
+ call feedkeys("\<ScrollWheelDown>", '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("\<ScrollWheelDown>", '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("\<ScrollWheelUp>", '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("\<ScrollWheelUp>", '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
index 7fdb1e621d..32005545f3 100644
--- 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,