1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-09 17:38:00 +00:00

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.

[originally from svn r2763]
This commit is contained in:
Ben Harris 2003-02-01 12:26:33 +00:00
parent d3d8714f06
commit fe5f4c14f4
4 changed files with 65 additions and 5 deletions

View File

@ -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();

View File

@ -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 *);

View File

@ -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;
@ -794,6 +797,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.
*/
@ -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;

View File

@ -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;