# HG changeset patch # User Bram Moolenaar # Date 1685987104 -7200 # Node ID e64d1fd431783a7a975d316bdc9558f5bf6a1dd4 # Parent 6059fb171e4031fc2620cab66e8c95aec8eaa92c patch 9.0.1610: display is wrong when 'smoothscroll' is set Commit: https://github.com/vim/vim/commit/d9a92dc70b20c76cef9ca186676583c92c14311c Author: zeertzjq Date: Mon Jun 5 18:41:35 2023 +0100 patch 9.0.1610: display is wrong when 'smoothscroll' is set Problem: Display is wrong when 'smoothscroll' is set and scrolling multiple lines. Solution: Redraw with UPD_NOT_VALID when "skipcol" is or was set. (closes #12490, closes #12468) diff --git a/src/move.c b/src/move.c --- a/src/move.c +++ b/src/move.c @@ -1786,7 +1786,6 @@ scrollup( int width1 = curwin->w_width - curwin_col_off(); int width2 = width1 + curwin_col_off2(); int size = 0; - linenr_T prev_topline = curwin->w_topline; colnr_T prev_skipcol = curwin->w_skipcol; if (do_sms) @@ -1850,10 +1849,9 @@ scrollup( } } - // TODO: is comparing w_topline with prev_topline still needed? - if (curwin->w_topline == prev_topline - || curwin->w_skipcol != prev_skipcol) - // need to redraw because wl_size of the topline may now be invalid + if (prev_skipcol > 0 || curwin->w_skipcol > 0) + // need to redraw more, because wl_size of the (new) topline may + // now be invalid redraw_later(UPD_NOT_VALID); } else diff --git a/src/testdir/dumps/Test_smooth_multi_skipcol_1.dump b/src/testdir/dumps/Test_smooth_multi_skipcol_1.dump --- a/src/testdir/dumps/Test_smooth_multi_skipcol_1.dump +++ b/src/testdir/dumps/Test_smooth_multi_skipcol_1.dump @@ -2,8 +2,8 @@ | +0&&@39 |a@39 @10| @29 -@40 -@40 +|a@39 +@10| @29 @40 @40 |b@2| @36 diff --git a/src/testdir/dumps/Test_smooth_multi_skipcol_2.dump b/src/testdir/dumps/Test_smooth_multi_skipcol_2.dump --- a/src/testdir/dumps/Test_smooth_multi_skipcol_2.dump +++ b/src/testdir/dumps/Test_smooth_multi_skipcol_2.dump @@ -1,6 +1,6 @@ |<+0#4040ff13#ffffff0@2|a+8#0000000&@5>a| @29 -| +0&&@39 -@40 +|a+0&&@39 +@10| @29 @40 @40 |b@2| @36 diff --git a/src/testdir/dumps/Test_smooth_multi_skipcol_3.dump b/src/testdir/dumps/Test_smooth_multi_skipcol_3.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_smooth_multi_skipcol_3.dump @@ -0,0 +1,10 @@ +|<+0#4040ff13#ffffff0@2|a+8#0000000&@5>a| @29 +| +0&&@39 +@40 +|b@2| @36 +|c@2| @36 +|~+0#4040ff13&| @38 +|~| @38 +|~| @38 +|~| @38 +| +0#0000000&@21|4|,|5|0| @9|B|o|t| 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 @@ -798,10 +798,11 @@ func Test_smoothscroll_multi_skipcol() let lines =<< trim END setlocal cursorline scrolloff=0 smoothscroll - call setline(1, repeat([''], 9)) + call setline(1, repeat([''], 8)) call setline(3, repeat('a', 50)) - call setline(8, 'bbb') - call setline(9, 'ccc') + call setline(4, repeat('a', 50)) + call setline(7, 'bbb') + call setline(8, 'ccc') redraw END call writefile(lines, 'XSmoothMultiSkipcol', 'D') @@ -811,6 +812,9 @@ func Test_smoothscroll_multi_skipcol() call term_sendkeys(buf, "3\") call VerifyScreenDump(buf, 'Test_smooth_multi_skipcol_2', {}) + call term_sendkeys(buf, "2\") + call VerifyScreenDump(buf, 'Test_smooth_multi_skipcol_3', {}) + call StopVimInTerminal(buf) endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1610, +/**/ 1609, /**/ 1608,