From 2145f64798a6a8dc42fc26ef7bcc44900e0cb498 Mon Sep 17 00:00:00 2001 From: Ben Harris Date: Tue, 2 Mar 1999 21:51:55 +0000 Subject: [PATCH] Right, I think we now hove scrolling optimisations. They should probably be conditional on something, but I can't be bothered right now. [originally from svn r67] --- macterm.c | 22 +++++++++++++++++++++- putty.h | 1 + terminal.c | 25 ++++++++++++++++++++++++- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/macterm.c b/macterm.c index b90015e2..0bf6230d 100644 --- 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 49f02307..9f960ad1 100644 --- 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 diff --git a/terminal.c b/terminal.c index baa00d73..db901607 100644 --- a/terminal.c +++ b/terminal.c @@ -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(); } -- 2.45.2