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:
parent
d3d8714f06
commit
fe5f4c14f4
@ -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();
|
||||
|
2
putty.h
2
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 *);
|
||||
|
49
terminal.c
49
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;
|
||||
@ -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;
|
||||
|
13
terminal.h
13
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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user