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