From 341eb9782019fd4fd77ff56894b489a23f229131 Mon Sep 17 00:00:00 2001 From: ben Date: Sat, 1 Feb 2003 12:26:33 +0000 Subject: [PATCH] Richard's lazy-scrolling patch. This builds up scroll operations in a list, combining adjacent ones for the same region, and runs them all in do_paint. I'm not sure it's entirely right, but it works on my Mac in every case I've tested. git-svn-id: svn://svn.tartarus.org/sgt/putty@2763 cda61777-01e9-0310-a592-d414129be87e --- mac/macterm.c | 6 +++--- putty.h | 2 +- terminal.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- terminal.h | 13 +++++++++++++ 4 files changed, 65 insertions(+), 5 deletions(-) diff --git a/mac/macterm.c b/mac/macterm.c index 76439fbc..17008c0c 100644 --- a/mac/macterm.c +++ b/mac/macterm.c @@ -1,4 +1,4 @@ -/* $Id: macterm.c,v 1.60 2003/01/28 00:35:54 ben Exp $ */ +/* $Id: macterm.c,v 1.61 2003/02/01 12:26:33 ben Exp $ */ /* * Copyright (c) 1999 Simon Tatham * Copyright (c) 1999, 2002 Ben Harris @@ -1506,8 +1506,8 @@ void palette_reset(void *frontend) { * Scroll the screen. (`lines' is +ve for scrolling forward, -ve * for backward.) */ -void do_scroll(void *frontend, int topline, int botline, int lines) { - Session *s = frontend; +void do_scroll(Context ctx, int topline, int botline, int lines) { + Session *s = ctx; Rect r; RgnHandle scrollrgn = NewRgn(); RgnHandle movedupdate = NewRgn(); diff --git a/putty.h b/putty.h index afdb12e1..a9bca42b 100644 --- a/putty.h +++ b/putty.h @@ -494,7 +494,7 @@ void do_text(Context, int, int, char *, int, unsigned long, int); void do_cursor(Context, int, int, char *, int, unsigned long, int); int char_width(Context ctx, int uc); #ifdef OPTIMISE_SCROLL -void do_scroll(void *, int, int, int); +void do_scroll(Context, int, int, int); #endif void set_title(void *frontend, char *); void set_icon(void *frontend, char *); diff --git a/terminal.c b/terminal.c index 7a21eeed..d81a0af6 100644 --- a/terminal.c +++ b/terminal.c @@ -381,6 +381,9 @@ Terminal *term_init(Config *mycfg, struct unicode_data *ucsdata, term->rows = term->cols = -1; power_on(term); term->beephead = term->beeptail = NULL; +#ifdef OPTIMISE_SCROLL + term->scrollhead = term->scrolltail = NULL; +#endif /* OPTIMISE_SCROLL */ term->nbeeps = 0; term->lastbeep = FALSE; term->beep_overloaded = FALSE; @@ -795,6 +798,35 @@ static void scroll(Terminal *term, int topline, int botline, int lines, int sb) #ifdef OPTIMISE_SCROLL /* + * Add a scroll of a region on the screen into the pending scroll list. + * `lines' is +ve for scrolling forward, -ve for backward. + * + * If the scroll is on the same area as the last scroll in the list, + * merge them. + */ +void save_scroll(Terminal *term, int topline, int botline, int lines) +{ + struct scrollregion *newscroll; + if (term->scrolltail && + term->scrolltail->topline == topline && + term->scrolltail->botline == botline) { + term->scrolltail->lines += lines; + } else { + newscroll = smalloc(sizeof(struct scrollregion)); + newscroll->topline = topline; + newscroll->botline = botline; + newscroll->lines = lines; + newscroll->next = NULL; + + if (!term->scrollhead) + term->scrollhead = newscroll; + else + term->scrolltail->next = newscroll; + term->scrolltail = newscroll; + } +} + +/* * Scroll the physical display, and our conception of it in disptext. */ static void scroll_display(Terminal *term, int topline, int botline, int lines) @@ -820,7 +852,7 @@ static void scroll_display(Terminal *term, int topline, int botline, int lines) for (i = 0; i < distance; i++) start[i] |= ATTR_INVALID; } - do_scroll(term->frontend, topline, botline, lines); + save_scroll(term, topline, botline, lines); } #endif /* OPTIMISE_SCROLL */ @@ -3087,6 +3119,9 @@ static void do_paint(Terminal *term, Context ctx, int may_optimise) char ch[1024]; long cursor_background = ERASE_CHAR; unsigned long ticks; +#ifdef OPTIMISE_SCROLL + struct scrollregion *sr; +#endif /* OPTIMISE_SCROLL */ /* * Check the visual bell state. @@ -3149,6 +3184,18 @@ static void do_paint(Terminal *term, Context ctx, int may_optimise) } term->dispcurs = NULL; +#ifdef OPTIMISE_SCROLL + /* Do scrolls */ + sr = term->scrollhead; + while (sr) { + struct scrollregion *next = sr->next; + do_scroll(ctx, sr->topline, sr->botline, sr->lines); + sfree(sr); + sr = next; + } + term->scrollhead = term->scrolltail = NULL; +#endif /* OPTIMISE_SCROLL */ + /* The normal screen data */ for (i = 0; i < term->rows; i++) { unsigned long *ldata; diff --git a/terminal.h b/terminal.h index daadd708..28f06c0c 100644 --- a/terminal.h +++ b/terminal.h @@ -20,6 +20,15 @@ typedef struct { int y, x; } pos; +#ifdef OPTIMISE_SCROLL +struct scrollregion { + struct scrollregion *next; + int topline; /* Top line of scroll region. */ + int botline; /* Bottom line of scroll region. */ + int lines; /* Number of lines to scroll by - +ve is forwards. */ +}; +#endif /* OPTIMISE_SCROLL */ + struct terminal_tag { int compatibility_level; @@ -47,6 +56,10 @@ struct terminal_tag { term->cpos = lineptr(term->curs.y) + term->curs.x; \ } while(0) +#ifdef OPTIMISE_SCROLL + struct scrollregion *scrollhead, *scrolltail; +#endif /* OPTIMISE_SCROLL */ + unsigned long curr_attr, save_attr; unsigned long erase_char; -- 2.11.0