]> asedeno.scripts.mit.edu Git - PuTTY.git/commitdiff
Right, I think we now hove scrolling optimisations. They should probably be
authorBen Harris <bjh21@bjh21.me.uk>
Tue, 2 Mar 1999 21:51:55 +0000 (21:51 +0000)
committerBen Harris <bjh21@bjh21.me.uk>
Tue, 2 Mar 1999 21:51:55 +0000 (21:51 +0000)
conditional on something, but I can't be bothered right now.

[originally from svn r67]

macterm.c
putty.h
terminal.c

index b90015e213b63f01bce979e096718f7a6e482d3c..0bf6230d1ce846cc97e52ffcdd26505836b3b643 100644 (file)
--- a/macterm.c
+++ b/macterm.c
@@ -1,4 +1,4 @@
-/* $Id: macterm.c,v 1.1.2.11 1999/03/02 14:52:35 ben Exp $ */
+/* $Id: macterm.c,v 1.1.2.12 1999/03/02 21:51:55 ben Exp $ */
 /*
  * Copyright (c) 1999 Ben Harris
  * All rights reserved.
@@ -494,3 +494,23 @@ void optimised_move(int to, int from, int lines) {
     InvalRgn(update); /* XXX: necessary?  probably harmless anyway */
     DisposeRgn(update);
 }
+
+
+/*
+ * Scroll the screen. (`lines' is +ve for scrolling forward, -ve
+ * for backward.)
+ */
+void do_scroll(int topline, int botline, int lines) {
+    struct mac_session *s = onlysession;
+    Rect r;
+    RgnHandle update;
+
+    SetPort(s->window);
+    update = NewRgn();
+    SetRect(&r, 0, topline * font_height,
+           cols * font_width, (botline + 1) * font_height);
+    ScrollRect(&r, 0, - lines * font_height, update);
+    /* XXX: move update region? */
+    InvalRgn(update);
+    DisposeRgn(update);
+}
diff --git a/putty.h b/putty.h
index 49f02307c974aa19a334e2d1bc3e30c402cbe9b9..9f960ad166947e3e02c26375a609672e28bc0f77 100644 (file)
--- a/putty.h
+++ b/putty.h
@@ -196,6 +196,7 @@ void palette_reset (void);
 void write_clip (void *, int);
 void get_clip (void **, int *);
 void optimised_move (int, int, int);
+void do_scroll(int, int, int);
 void fatalbox (const char *, ...);
 void beep (void);
 #define OPTIMISE_IS_SCROLL 1
index baa00d73fc3fcec943c9797d8828a0a3e764d80b..db901607e6ec90296714c2078635f4a1f48028e5 100644 (file)
@@ -97,6 +97,7 @@ static void erase_lots (int, int, int);
 static void swap_screen (int);
 static void update_sbar (void);
 static void deselect (void);
+static void scroll_display(int, int, int);
 
 /*
  * Set up power-on settings for the terminal.
@@ -400,9 +401,29 @@ static void scroll (int topline, int botline, int lines, int sb) {
                selend = scroll_top + size + scroll_size;
        }
     }
+    scroll_display(topline, botline, lines);
+}
+
+static void scroll_display(int topline, int botline, int lines) {
+    unsigned long *start, *end;
+    int distance, size, i;
 
-    scroll_heuristic += lines;
+    start = disptext + topline * (cols + 1);
+    end = disptext + (botline + 1) * (cols + 1);
+    distance = (lines > 0 ? lines : -lines) * (cols + 1);
+    size = end - start - distance;
+    if (lines > 0) {
+       memmove(start, start + distance, size * TSIZE);
+       for (i = 0; i < distance; i++)
+           (start + size)[i] |= ATTR_INVALID;
+    } else {
+       memmove(start + distance, start, size * TSIZE);
+       for (i = 0; i < distance; i++)
+           start[i] |= ATTR_INVALID;
+    }
+    do_scroll(topline, botline, lines);
 }
+    
 
 /*
  * Move the cursor to a given position, clipping at boundaries. We
@@ -1282,6 +1303,8 @@ void term_scroll (int rel, int where) {
     if (disptop > scrtop)
        disptop = scrtop;
     update_sbar();
+    if (rel == 0 && where < rows && where > -rows)
+       scroll_display(0, rows - 1, where);
     term_update();
 }