diff options
author | Jesse Luehrs <doy@tozt.net> | 2015-08-20 01:07:56 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2015-08-20 01:07:56 -0400 |
commit | 7a8324949027d7ece88af525f8ae7fe67b379e72 (patch) | |
tree | a46f20eb7e8bff3468b097fc49998d8c4233585f | |
parent | c396fa054186763feeae3bb0de0ab82dde53e40f (diff) | |
download | libvt100-7a8324949027d7ece88af525f8ae7fe67b379e72.tar.gz libvt100-7a8324949027d7ece88af525f8ae7fe67b379e72.zip |
keep track of scrollback when scrolling
-rw-r--r-- | src/screen.c | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/src/screen.c b/src/screen.c index 8da88d6..336f2f1 100644 --- a/src/screen.c +++ b/src/screen.c @@ -531,11 +531,34 @@ void vt100_screen_scroll_down(VT100Screen *vt, int count) } } else { - for (i = 0; i < bottom - top + 1; ++i) { - row = vt100_screen_row_at(vt, top + i); - memset( - row->cells, 0, vt->grid->max.col * sizeof(struct vt100_cell)); - row->wrapped = 0; + int scrollback = vt->scrollback_length; + + if (vt->grid->row_count + count > scrollback) { + int overflow = vt->grid->row_count + count - scrollback; + + vt100_screen_ensure_capacity(vt, scrollback); + for (i = 0; i < overflow; ++i) { + free(vt->grid->rows[i].cells); + } + memmove( + &vt->grid->rows[0], &vt->grid->rows[overflow], + (scrollback - overflow) * 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)); + } + vt->grid->row_count = scrollback; + vt->grid->row_top = scrollback - vt->grid->max.row; + } + else { + vt100_screen_ensure_capacity(vt, vt->grid->row_count + count); + for (i = 0; i < count; ++i) { + row = vt100_screen_row_at(vt, i + vt->grid->max.row); + row->cells = calloc( + vt->grid->max.col, sizeof(struct vt100_cell)); + } + vt->grid->row_count += count; + vt->grid->row_top += count; } } |