summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2016-06-05 18:51:24 -0400
committerJesse Luehrs <doy@tozt.net>2016-06-05 18:57:40 -0400
commit6121ce76dc14096ef0eb805dc0bded5cd98ab2c9 (patch)
tree0c6ab7495c7401a1dba0f19cfb36dbc707f6e50f /src
parent8947aec3f40270b0f5dc31ff15260bb4de6c58f1 (diff)
downloadlibvt100-6121ce76dc14096ef0eb805dc0bded5cd98ab2c9.tar.gz
libvt100-6121ce76dc14096ef0eb805dc0bded5cd98ab2c9.zip
avoid copying around scrollback so often
Diffstat (limited to 'src')
-rw-r--r--src/screen.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/screen.c b/src/screen.c
index 388c455..002ebbe 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -548,17 +548,20 @@ void vt100_screen_scroll_up(VT100Screen *vt, int count)
}
else {
int scrollback = vt->scrollback_length;
+ int slack = scrollback / 10;
+ int max_row_buffer_size = scrollback + slack;
+ int overflow = vt->grid->row_count + count - max_row_buffer_size;
- if (vt->grid->row_count + count > scrollback) {
- int overflow = vt->grid->row_count + count - scrollback;
+ if (overflow > 0) {
+ int shift = overflow + slack;
- vt100_screen_ensure_capacity(vt, scrollback);
- for (i = 0; i < overflow; ++i) {
+ vt100_screen_ensure_capacity(vt, max_row_buffer_size);
+ for (i = 0; i < shift; ++i) {
free(vt->grid->rows[i].cells);
}
memmove(
- &vt->grid->rows[0], &vt->grid->rows[overflow],
- (scrollback - overflow) * sizeof(struct vt100_row));
+ &vt->grid->rows[0], &vt->grid->rows[shift],
+ (max_row_buffer_size - shift) * sizeof(struct vt100_row));
for (i = scrollback - count; i < scrollback; ++i) {
vt->grid->rows[i].cells = calloc(
vt->grid->max.col, sizeof(struct vt100_cell));