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

Remove unused and bit-rotted scroll optimisation.

In the very old days, when PuTTY was new and computers were slow, I
tried to implement a feature where scrolling the window would be
implemented using a fast rectangle-copy GDI operation, rather than an
expensive character-by-character redraw of all the changed areas.

It never quite worked right, and I ended up conditioning it out on
Windows, and never even tried to implement it on GTK. It's now been
sitting around unused for so long that I think it's no longer worth
keeping in the code at all - if I tried to put it back in, it surely
wouldn't even compile, and would need rewriting from scratch anyway.

Disturbingly, it looks as if I _tried_ to re-enable it at one point,
in that there was a '#define OPTIMISE_IS_SCROLL 1' in putty.h - but
that never had any effect, because the macro name is misspelled. All
the #ifdefs are for 'OPTIMISE_SCROLL', without the 'IS'. So despite
appearances, it really _has_ been conditioned out all along!
This commit is contained in:
Simon Tatham 2018-10-25 18:34:39 +01:00
parent 6714fcddc6
commit 291c1b07f2
4 changed files with 5 additions and 155 deletions

View File

@ -1020,9 +1020,6 @@ void do_text(Context, int, int, wchar_t *, int, unsigned long, int,
void do_cursor(Context, int, int, wchar_t *, int, unsigned long, int,
truecolour);
int char_width(Context ctx, int uc);
#ifdef OPTIMISE_SCROLL
void do_scroll(Context, int, int, int);
#endif
void set_title(Frontend *frontend, char *);
void set_icon(Frontend *frontend, char *);
void set_sbar(Frontend *frontend, int, int, int);
@ -1043,7 +1040,6 @@ void modalfatalbox(const char *, ...);
void do_beep(Frontend *frontend, int);
void sys_cursor(Frontend *frontend, int x, int y);
void frontend_request_paste(Frontend *frontend, int clipboard);
#define OPTIMISE_IS_SCROLL 1
void set_iconic(Frontend *frontend, int iconic);
void move_window(Frontend *frontend, int x, int y);

View File

@ -101,7 +101,7 @@ static void resizeline(Terminal *, termline *, int);
static termline *lineptr(Terminal *, int, int, int);
static void unlineptr(termline *);
static void check_line_size(Terminal *, termline *);
static void do_paint(Terminal *, Context, int);
static void do_paint(Terminal *, Context);
static void erase_lots(Terminal *, int, int, int);
static int find_last_nonempty_line(Terminal *, tree234 *);
static void swap_screen(Terminal *, int, int, int);
@ -110,9 +110,6 @@ static void deselect(Terminal *);
static void term_print_finish(Terminal *);
static void scroll(Terminal *, int, int, int, int);
static void parse_optionalrgb(optionalrgb *out, unsigned *values);
#ifdef OPTIMISE_SCROLL
static void scroll_display(Terminal *, int, int, int);
#endif /* OPTIMISE_SCROLL */
static termline *newline(Terminal *term, int cols, int bce)
{
@ -1366,7 +1363,7 @@ void term_update(Terminal *term)
if (need_sbar_update)
update_sbar(term);
do_paint(term, ctx, TRUE);
do_paint(term, ctx);
sys_cursor(term->frontend, term->curs.x, term->curs.y - term->disptop);
free_ctx(ctx);
}
@ -1686,9 +1683,6 @@ Terminal *term_init(Conf *myconf, struct unicode_data *ucsdata,
term->rows = term->cols = -1;
power_on(term, TRUE);
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;
@ -2126,18 +2120,10 @@ static void scroll(Terminal *term, int topline, int botline, int lines, int sb)
{
termline *line;
int i, seltop, scrollwinsize;
#ifdef OPTIMISE_SCROLL
int olddisptop, shift;
#endif /* OPTIMISE_SCROLL */
if (topline != 0 || term->alt_which != 0)
sb = FALSE;
#ifdef OPTIMISE_SCROLL
olddisptop = term->disptop;
shift = lines;
#endif /* OPTIMISE_SCROLL */
scrollwinsize = botline - topline + 1;
if (lines < 0) {
@ -2258,81 +2244,8 @@ static void scroll(Terminal *term, int topline, int botline, int lines, int sb)
}
}
}
#ifdef OPTIMISE_SCROLL
shift += term->disptop - olddisptop;
if (shift < term->rows && shift > -term->rows && shift != 0)
scroll_display(term, topline, botline, shift);
#endif /* OPTIMISE_SCROLL */
}
#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.
*/
static 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 = snew(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)
{
int distance, nlines, i, j;
distance = lines > 0 ? lines : -lines;
nlines = botline - topline + 1 - distance;
if (lines > 0) {
for (i = 0; i < nlines; i++)
for (j = 0; j < term->cols; j++)
copy_termchar(term->disptext[i], j,
term->disptext[i+distance]->chars+j);
if (term->dispcursy >= 0 &&
term->dispcursy >= topline + distance &&
term->dispcursy < topline + distance + nlines)
term->dispcursy -= distance;
for (i = 0; i < distance; i++)
for (j = 0; j < term->cols; j++)
term->disptext[nlines+i]->chars[j].attr |= ATTR_INVALID;
} else {
for (i = nlines; i-- ;)
for (j = 0; j < term->cols; j++)
copy_termchar(term->disptext[i+distance], j,
term->disptext[i]->chars+j);
if (term->dispcursy >= 0 &&
term->dispcursy >= topline &&
term->dispcursy < topline + nlines)
term->dispcursy += distance;
for (i = 0; i < distance; i++)
for (j = 0; j < term->cols; j++)
term->disptext[i]->chars[j].attr |= ATTR_INVALID;
}
save_scroll(term, topline, botline, lines);
}
#endif /* OPTIMISE_SCROLL */
/*
* Move the cursor to a given position, clipping at boundaries. We
* may or may not want to clip at the scroll margin: marg_clip is 0
@ -5109,19 +5022,15 @@ static termchar *term_bidi_line(Terminal *term, struct termline *ldata,
}
/*
* Given a context, update the window. Out of paranoia, we don't
* allow WM_PAINT responses to do scrolling optimisations.
* Given a context, update the window.
*/
static void do_paint(Terminal *term, Context ctx, int may_optimise)
static void do_paint(Terminal *term, Context ctx)
{
int i, j, our_curs_y, our_curs_x;
int rv, cursor;
pos scrpos;
wchar_t *ch;
int chlen;
#ifdef OPTIMISE_SCROLL
struct scrollregion *sr;
#endif /* OPTIMISE_SCROLL */
termchar *newline;
chlen = 1024;
@ -5201,18 +5110,6 @@ static void do_paint(Terminal *term, Context ctx, int may_optimise)
}
term->dispcursx = term->dispcursy = -1;
#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++) {
termline *ldata;
@ -5574,7 +5471,7 @@ void term_paint(Terminal *term, Context ctx,
}
if (immediately) {
do_paint (term, ctx, FALSE);
do_paint (term, ctx);
} else {
term_schedule_update(term);
}
@ -5590,10 +5487,6 @@ void term_paint(Terminal *term, Context ctx,
void term_scroll(Terminal *term, int rel, int where)
{
int sbtop = -sblines(term);
#ifdef OPTIMISE_SCROLL
int olddisptop = term->disptop;
int shift;
#endif /* OPTIMISE_SCROLL */
term->disptop = (rel < 0 ? 0 : rel > 0 ? sbtop : term->disptop) + where;
if (term->disptop < sbtop)
@ -5601,11 +5494,6 @@ void term_scroll(Terminal *term, int rel, int where)
if (term->disptop > 0)
term->disptop = 0;
update_sbar(term);
#ifdef OPTIMISE_SCROLL
shift = (term->disptop - olddisptop);
if (shift < term->rows && shift > -term->rows)
scroll_display(term, 0, term->rows - 1, shift);
#endif /* OPTIMISE_SCROLL */
term_update(term);
}

View File

@ -20,15 +20,6 @@ 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 */
typedef struct termchar termchar;
typedef struct termline termline;
@ -98,10 +89,6 @@ struct terminal_tag {
#define TTYPE termchar
#define TSIZE (sizeof(TTYPE))
#ifdef OPTIMISE_SCROLL
struct scrollregion *scrollhead, *scrolltail;
#endif /* OPTIMISE_SCROLL */
int default_attr, curr_attr, save_attr;
truecolour curr_truecolour, save_truecolour;
termchar basic_erase_char, erase_char;

View File

@ -5514,27 +5514,6 @@ void frontend_request_paste(Frontend *frontend, int clipboard)
hwnd, 0, &in_threadid);
}
#if 0
/*
* Move `lines' lines from position `from' to position `to' in the
* window.
*/
void optimised_move(Frontend *frontend, int to, int from, int lines)
{
RECT r;
int min, max;
min = (to < from ? to : from);
max = to + from - min;
r.left = offset_width;
r.right = offset_width + term->cols * font_width;
r.top = offset_height + min * font_height;
r.bottom = offset_height + (max + lines) * font_height;
ScrollWindow(hwnd, 0, (to - from) * font_height, &r, &r);
}
#endif
/*
* Print a modal (Really Bad) message box and perform a fatal exit.
*/