From f32fb93e431e4db95a8663d86dfeb6bffa5896f6 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 17 Nov 2022 11:34:38 +0000 Subject: [PATCH] patch 9.0.0892: may redraw when not needed Problem: May redraw when not needed, causing slow scrolling. Solution: Do not redraw when w_skipcol doesn't change. When w_skipcol changes only redraw from the top. (issue #11559) --- src/ex_getln.c | 2 ++ src/move.c | 42 ++++++++++++++++++++++----------------- src/testdir/Make_all.mak | 1 + src/testdir/test_alot.vim | 1 - src/version.c | 2 ++ 5 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/ex_getln.c b/src/ex_getln.c index d3119baf25d50..72f2a3aabf1a3 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -393,6 +393,7 @@ finish_incsearch_highlighting( magic_overruled = is_state->magic_overruled_save; validate_cursor(); // needed for TAB + status_redraw_all(); redraw_all_later(UPD_SOME_VALID); if (call_update_screen) update_screen(UPD_SOME_VALID); @@ -559,6 +560,7 @@ may_do_incsearch_highlighting( } validate_cursor(); + // May redraw the status line to show the cursor position. if (p_ru && curwin->w_status_height > 0) curwin->w_redr_status = TRUE; diff --git a/src/move.c b/src/move.c index e255bd68e36ef..3a5f806b5dcc5 100644 --- a/src/move.c +++ b/src/move.c @@ -201,6 +201,23 @@ redraw_for_cursorcolumn(win_T *wp) } #endif +/* + * Set curwin->s_skipcol to zero and redraw later if needed. + */ + static void +reset_skipcol(void) +{ + if (curwin->w_skipcol != 0) + { + curwin->w_skipcol = 0; + + // Should use the least expensive way that displays all that changed. + // UPD_NOT_VALID is too expensive, UPD_REDRAW_TOP does not redraw + // enough when the top line gets another screen line. + redraw_later(UPD_SOME_VALID); + } +} + /* * Update curwin->w_topline and redraw if necessary. * Used to update the screen before printing a message. @@ -458,13 +475,9 @@ update_topline(void) ) { dollar_vcol = -1; - if (curwin->w_skipcol != 0) - { - curwin->w_skipcol = 0; - redraw_later(UPD_NOT_VALID); - } - else - redraw_later(UPD_VALID); + redraw_later(UPD_VALID); + reset_skipcol(); + // May need to set w_skipcol when cursor in w_topline. if (curwin->w_cursor.lnum == curwin->w_topline) validate_cursor(); @@ -1319,7 +1332,7 @@ curs_columns( else if (!curwin->w_p_sms) curwin->w_skipcol = 0; if (prev_skipcol != curwin->w_skipcol) - redraw_later(UPD_NOT_VALID); + redraw_later(UPD_SOME_VALID); #ifdef FEAT_SYN_HL redraw_for_cursorcolumn(curwin); @@ -1849,11 +1862,7 @@ adjust_skipcol(void) if (curwin->w_cline_height == curwin->w_height) { // the line just fits in the window, don't scroll - if (curwin->w_skipcol != 0) - { - curwin->w_skipcol = 0; - redraw_later(UPD_NOT_VALID); - } + reset_skipcol(); return; } @@ -2302,10 +2311,7 @@ scroll_cursor_top(int min_scroll, int always) #endif // TODO: if the line doesn't fit may optimize w_skipcol if (curwin->w_topline == curwin->w_cursor.lnum) - { - curwin->w_skipcol = 0; - redraw_later(UPD_NOT_VALID); - } + reset_skipcol(); if (curwin->w_topline != old_topline || curwin->w_skipcol != old_skipcol #ifdef FEAT_DIFF @@ -2737,7 +2743,7 @@ cursor_correct(void) if (curwin->w_cline_height == curwin->w_height) { // The cursor line just fits in the window, don't scroll. - curwin->w_skipcol = 0; + reset_skipcol(); return; } // TODO: If the cursor line doesn't fit in the window then only adjust diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak index 04ccb4804ec7b..1ac29b1b6a6b3 100644 --- a/src/testdir/Make_all.mak +++ b/src/testdir/Make_all.mak @@ -484,6 +484,7 @@ NEW_TESTS_RES = \ test_retab.res \ test_ruby.res \ test_scriptnames.res \ + test_scroll_opt.res \ test_scrollbind.res \ test_search.res \ test_search_stat.res \ diff --git a/src/testdir/test_alot.vim b/src/testdir/test_alot.vim index b7b7eadb31a7b..592ca65672d0e 100644 --- a/src/testdir/test_alot.vim +++ b/src/testdir/test_alot.vim @@ -19,7 +19,6 @@ source test_global.vim source test_move.vim source test_put.vim source test_reltime.vim -source test_scroll_opt.vim source test_searchpos.vim source test_set.vim source test_shift.vim diff --git a/src/version.c b/src/version.c index 0423d0d6432ca..b526652de3efc 100644 --- a/src/version.c +++ b/src/version.c @@ -695,6 +695,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 892, /**/ 891, /**/