]> granicus.if.org Git - vim/commitdiff
patch 8.0.1167: Motif: typing in terminal window is slow v8.0.1167
authorBram Moolenaar <Bram@vim.org>
Sat, 30 Sep 2017 18:40:27 +0000 (20:40 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 30 Sep 2017 18:40:27 +0000 (20:40 +0200)
Problem:    Motif: typing in terminal window is slow.
Solution:   Do not redraw the whole terminal window but only was was changed.

src/terminal.c
src/version.c

index 029b2c8f685016f7587c2de15caa924c6def9aea..f0ae5ed31bee1065b067357bd4d7dd37f8f1c9ab 100644 (file)
@@ -41,6 +41,7 @@
  * - in GUI vertical split causes problems.  Cursor is flickering. (Hirohito
  *   Higashi, 2017 Sep 19)
  * - Shift-Tab does not work.
+ * - after resizing windows overlap. (Boris Staletic, #2164)
  * - double click in Window toolbar starts Visual mode.
  * - Redirecting output does not work on MS-Windows, Test_terminal_redir_file()
  *   is disabled.
@@ -134,7 +135,7 @@ struct terminal_S {
     char_u     *tl_status_text; /* NULL or allocated */
 
     /* Range of screen rows to update.  Zero based. */
-    int                tl_dirty_row_start; /* -1 if nothing dirty */
+    int                tl_dirty_row_start; /* MAX_ROW if nothing dirty */
     int                tl_dirty_row_end;   /* row below last one to update */
 
     garray_T   tl_scrollback;
@@ -1925,6 +1926,10 @@ handle_moverect(VTermRect dest, VTermRect src, void *user)
                                 clear_attr);
        }
     }
+
+    term->tl_dirty_row_start = MIN(term->tl_dirty_row_start, dest.start_row);
+    term->tl_dirty_row_end = MIN(term->tl_dirty_row_end, dest.end_row);
+
     redraw_buf_later(term->tl_buffer, NOT_VALID);
     return 1;
 }
@@ -2268,8 +2273,8 @@ term_update_window(win_T *wp)
     vterm_state_get_cursorpos(state, &pos);
     position_cursor(wp, &pos);
 
-    /* TODO: Only redraw what changed. */
-    for (pos.row = 0; pos.row < wp->w_height; ++pos.row)
+    for (pos.row = term->tl_dirty_row_start; pos.row < term->tl_dirty_row_end
+                                         && pos.row < wp->w_height; ++pos.row)
     {
        int off = screen_get_current_line_off();
        int max_col = MIN(wp->w_width, term->tl_cols);
@@ -2352,6 +2357,8 @@ term_update_window(win_T *wp)
        screen_line(wp->w_winrow + pos.row, wp->w_wincol,
                                                  pos.col, wp->w_width, FALSE);
     }
+    term->tl_dirty_row_start = MAX_ROW;
+    term->tl_dirty_row_end = 0;
 
     return OK;
 }
index f02ebe0e5d3e2ec667b13e0140557c8c8f2421b5..38743203f5e99ec3ad2b08ba2418e275e8178d7c 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1167,
 /**/
     1166,
 /**/