diff options
author | Bram Moolenaar <Bram@vim.org> | 2022-04-03 13:23:22 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-04-03 13:23:22 +0100 |
commit | 8ef6997e2d90808dec033373c96dda68843af12e (patch) | |
tree | 377cf2c6ded314e31c454ed9d9a8e2ebec44cd58 /src | |
parent | ce416b453a849c837f9f6ffc91dd4792d84e1bfd (diff) |
patch 8.2.4673: redrawing a split window is slow when using CTRL-F and CTRL-Bv8.2.4673
Problem: Redrawing a vertically split window is slow when using CTRL-F and
CTRL-B.
Solution: When deciding on USE_REDRAW bail out if scrolling more than three
lines. (issue #8002)
Diffstat (limited to 'src')
-rw-r--r-- | src/screen.c | 18 | ||||
-rw-r--r-- | src/version.c | 2 |
2 files changed, 19 insertions, 1 deletions
diff --git a/src/screen.c b/src/screen.c index 3713f49fd6..7caf2995fc 100644 --- a/src/screen.c +++ b/src/screen.c @@ -3707,7 +3707,15 @@ screen_ins_lines( */ result_empty = (row + line_count >= end); if (wp != NULL && wp->w_width != Columns && *T_CSV == NUL) + { + // Avoid that lines are first cleared here and then redrawn, which + // results in many characters updated twice. This happens with CTRL-F + // in a vertically split window. With line-by-line scrolling + // USE_REDRAW should be faster. + if (line_count > 3) + return FAIL; type = USE_REDRAW; + } else if (can_clear(T_CD) && result_empty) type = USE_T_CD; else if (*T_CAL != NUL && (line_count > 1 || *T_AL == NUL)) @@ -3879,7 +3887,7 @@ screen_del_lines( int end, int force, // even when line_count > p_ttyscroll int clear_attr, // used for clearing lines - win_T *wp UNUSED) // NULL or window to use width from + win_T *wp) // NULL or window to use width from { int j; int i; @@ -3934,7 +3942,15 @@ screen_del_lines( * 6. redraw the characters from ScreenLines[]. */ if (wp != NULL && wp->w_width != Columns && *T_CSV == NUL) + { + // Avoid that lines are first cleared here and then redrawn, which + // results in many characters updated twice. This happens with CTRL-F + // in a vertically split window. With line-by-line scrolling + // USE_REDRAW should be faster. + if (line_count > 3) + return FAIL; type = USE_REDRAW; + } else if (can_clear(T_CD) && result_empty) type = USE_T_CD; else if (row == 0 && ( diff --git a/src/version.c b/src/version.c index 3fec52ea08..9b92724b73 100644 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4673, +/**/ 4672, /**/ 4671, |