[vte/vte-0-36] widget: Fix invalidation region



commit 88e8e89560a62d0981ce2b18974a230d0a07dbdd
Author: Micah Cowan <micah cowan name>
Date:   Tue Oct 22 23:30:43 2013 +0200

    widget: Fix invalidation region
    
    When the sequence handler moves the cursor into the restricted scrolling region,
    the bbox needs to be reset, too.
    Fixes glitches with interspersing writes to the bottom line with scrolls of the
    upper region, and also fixes missing screen redraws when using mosh.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=542087
    https://bugzilla.gnome.org/show_bug.cgi?id=686097

 src/vte.c |   28 +++++++++++++++++++++++-----
 1 files changed, 23 insertions(+), 5 deletions(-)
---
diff --git a/src/vte.c b/src/vte.c
index 9f6d7d8..a4d9d25 100644
--- a/src/vte.c
+++ b/src/vte.c
@@ -4077,6 +4077,7 @@ vte_terminal_process_incoming(VteTerminal *terminal)
        long wcount, start, delta;
        gboolean leftovers, modified, bottom, again;
        gboolean invalidated_text;
+       gboolean in_scroll_region;
        GArray *unichars;
        struct _vte_incoming_chunk *chunk, *next_chunk, *achunk = NULL;
 
@@ -4096,6 +4097,10 @@ vte_terminal_process_incoming(VteTerminal *terminal)
        cursor = screen->cursor_current;
        cursor_visible = terminal->pvt->cursor_visible;
 
+       in_scroll_region = screen->scrolling_restricted
+           && (screen->cursor_current.row >= (screen->insert_delta + screen->scrolling_region.start))
+           && (screen->cursor_current.row <= (screen->insert_delta + screen->scrolling_region.end));
+
        /* We should only be called when there's data to process. */
        g_assert(terminal->pvt->incoming ||
                 (terminal->pvt->pending->len > 0));
@@ -4194,6 +4199,8 @@ skip_chunk:
                 * points to the first character which isn't part of this
                 * sequence. */
                if ((match != NULL) && (match[0] != '\0')) {
+                       gboolean new_in_scroll_region;
+
                        /* Call the right sequence handler for the requested
                         * behavior. */
                        _vte_terminal_handle_sequence(terminal,
@@ -4204,12 +4211,21 @@ skip_chunk:
                        start = (next - wbuf);
                        modified = TRUE;
 
-                       /* if we have moved during the sequence handler, restart the bbox */
+                       new_in_scroll_region = screen->scrolling_restricted
+                           && (screen->cursor_current.row >= (screen->insert_delta + 
screen->scrolling_region.start))
+                           && (screen->cursor_current.row <= (screen->insert_delta + 
screen->scrolling_region.end));
+
+                       delta = screen->scroll_delta;   /* delta may have changed from sequence. */
+
+                       /* if we have moved greatly during the sequence handler, or moved
+                         * into a scroll_region from outside it, restart the bbox.
+                         */
                        if (invalidated_text &&
-                                       (screen->cursor_current.col > bbox_bottomright.x + 
VTE_CELL_BBOX_SLACK ||
-                                        screen->cursor_current.col < bbox_topleft.x - VTE_CELL_BBOX_SLACK    
 ||
-                                        screen->cursor_current.row > bbox_bottomright.y + 
VTE_CELL_BBOX_SLACK ||
-                                        screen->cursor_current.row < bbox_topleft.y - VTE_CELL_BBOX_SLACK)) {
+                                       ((new_in_scroll_region && !in_scroll_region) ||
+                                        (screen->cursor_current.col > bbox_bottomright.x + 
VTE_CELL_BBOX_SLACK ||
+                                         screen->cursor_current.col < bbox_topleft.x - VTE_CELL_BBOX_SLACK   
  ||
+                                         screen->cursor_current.row > bbox_bottomright.y + 
VTE_CELL_BBOX_SLACK ||
+                                         screen->cursor_current.row < bbox_topleft.y - 
VTE_CELL_BBOX_SLACK))) {
                                /* Clip off any part of the box which isn't already on-screen. */
                                bbox_topleft.x = MAX(bbox_topleft.x, 0);
                                bbox_topleft.y = MAX(bbox_topleft.y, delta);
@@ -4229,6 +4245,8 @@ skip_chunk:
                                bbox_bottomright.x = bbox_bottomright.y = -G_MAXINT;
                                bbox_topleft.x = bbox_topleft.y = G_MAXINT;
                        }
+
+                       in_scroll_region = new_in_scroll_region;
                } else
                /* Second, we have a NULL match, and next points to the very
                 * next character in the buffer.  Insert the character which


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]