-/* $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.
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);
+}
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
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.
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
if (disptop > scrtop)
disptop = scrtop;
update_sbar();
+ if (rel == 0 && where < rows && where > -rows)
+ scroll_display(0, rows - 1, where);
term_update();
}