1
0
forked from aniani/vim

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)
This commit is contained in:
Bram Moolenaar 2022-11-17 11:34:38 +00:00
parent fc1b2d0961
commit f32fb93e43
5 changed files with 29 additions and 19 deletions

View File

@ -393,6 +393,7 @@ finish_incsearch_highlighting(
magic_overruled = is_state->magic_overruled_save; magic_overruled = is_state->magic_overruled_save;
validate_cursor(); // needed for TAB validate_cursor(); // needed for TAB
status_redraw_all();
redraw_all_later(UPD_SOME_VALID); redraw_all_later(UPD_SOME_VALID);
if (call_update_screen) if (call_update_screen)
update_screen(UPD_SOME_VALID); update_screen(UPD_SOME_VALID);
@ -559,6 +560,7 @@ may_do_incsearch_highlighting(
} }
validate_cursor(); validate_cursor();
// May redraw the status line to show the cursor position. // May redraw the status line to show the cursor position.
if (p_ru && curwin->w_status_height > 0) if (p_ru && curwin->w_status_height > 0)
curwin->w_redr_status = TRUE; curwin->w_redr_status = TRUE;

View File

@ -201,6 +201,23 @@ redraw_for_cursorcolumn(win_T *wp)
} }
#endif #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. * Update curwin->w_topline and redraw if necessary.
* Used to update the screen before printing a message. * Used to update the screen before printing a message.
@ -458,13 +475,9 @@ update_topline(void)
) )
{ {
dollar_vcol = -1; dollar_vcol = -1;
if (curwin->w_skipcol != 0) redraw_later(UPD_VALID);
{ reset_skipcol();
curwin->w_skipcol = 0;
redraw_later(UPD_NOT_VALID);
}
else
redraw_later(UPD_VALID);
// May need to set w_skipcol when cursor in w_topline. // May need to set w_skipcol when cursor in w_topline.
if (curwin->w_cursor.lnum == curwin->w_topline) if (curwin->w_cursor.lnum == curwin->w_topline)
validate_cursor(); validate_cursor();
@ -1319,7 +1332,7 @@ curs_columns(
else if (!curwin->w_p_sms) else if (!curwin->w_p_sms)
curwin->w_skipcol = 0; curwin->w_skipcol = 0;
if (prev_skipcol != curwin->w_skipcol) if (prev_skipcol != curwin->w_skipcol)
redraw_later(UPD_NOT_VALID); redraw_later(UPD_SOME_VALID);
#ifdef FEAT_SYN_HL #ifdef FEAT_SYN_HL
redraw_for_cursorcolumn(curwin); redraw_for_cursorcolumn(curwin);
@ -1849,11 +1862,7 @@ adjust_skipcol(void)
if (curwin->w_cline_height == curwin->w_height) if (curwin->w_cline_height == curwin->w_height)
{ {
// the line just fits in the window, don't scroll // the line just fits in the window, don't scroll
if (curwin->w_skipcol != 0) reset_skipcol();
{
curwin->w_skipcol = 0;
redraw_later(UPD_NOT_VALID);
}
return; return;
} }
@ -2302,10 +2311,7 @@ scroll_cursor_top(int min_scroll, int always)
#endif #endif
// TODO: if the line doesn't fit may optimize w_skipcol // TODO: if the line doesn't fit may optimize w_skipcol
if (curwin->w_topline == curwin->w_cursor.lnum) if (curwin->w_topline == curwin->w_cursor.lnum)
{ reset_skipcol();
curwin->w_skipcol = 0;
redraw_later(UPD_NOT_VALID);
}
if (curwin->w_topline != old_topline if (curwin->w_topline != old_topline
|| curwin->w_skipcol != old_skipcol || curwin->w_skipcol != old_skipcol
#ifdef FEAT_DIFF #ifdef FEAT_DIFF
@ -2737,7 +2743,7 @@ cursor_correct(void)
if (curwin->w_cline_height == curwin->w_height) if (curwin->w_cline_height == curwin->w_height)
{ {
// The cursor line just fits in the window, don't scroll. // The cursor line just fits in the window, don't scroll.
curwin->w_skipcol = 0; reset_skipcol();
return; return;
} }
// TODO: If the cursor line doesn't fit in the window then only adjust // TODO: If the cursor line doesn't fit in the window then only adjust

View File

@ -484,6 +484,7 @@ NEW_TESTS_RES = \
test_retab.res \ test_retab.res \
test_ruby.res \ test_ruby.res \
test_scriptnames.res \ test_scriptnames.res \
test_scroll_opt.res \
test_scrollbind.res \ test_scrollbind.res \
test_search.res \ test_search.res \
test_search_stat.res \ test_search_stat.res \

View File

@ -19,7 +19,6 @@ source test_global.vim
source test_move.vim source test_move.vim
source test_put.vim source test_put.vim
source test_reltime.vim source test_reltime.vim
source test_scroll_opt.vim
source test_searchpos.vim source test_searchpos.vim
source test_set.vim source test_set.vim
source test_shift.vim source test_shift.vim

View File

@ -695,6 +695,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
892,
/**/ /**/
891, 891,
/**/ /**/