]> granicus.if.org Git - vim/commitdiff
patch 8.2.4673: redrawing a split window is slow when using CTRL-F and CTRL-B v8.2.4673
authorBram Moolenaar <Bram@vim.org>
Sun, 3 Apr 2022 12:23:22 +0000 (13:23 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 3 Apr 2022 12:23:22 +0000 (13:23 +0100)
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)

src/screen.c
src/version.c

index 3713f49fd6ab0035050f27aa1683601dbed3ac76..7caf2995fc076b60fab6e2d164dabb83bafb7aaa 100644 (file)
@@ -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 && (
index 3fec52ea08a3276625aa5596dffce1d651f83ae4..9b92724b737a3f2e124034efaeec23f5f18e243c 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4673,
 /**/
     4672,
 /**/