- /*
- * slide screen to keep cursor where we expect it -
- * tscrollup would work here, but we can optimize to
- * memmove because we're freeing the earlier lines
- */
- for (i = 0; i <= term.c.y - row; i++) {
- free(term.line[i]);
- free(term.alt[i]);
+ /* Shift buffer to keep the cursor where we expect it */
+ if (row <= term.c.y) {
+ term.screen[0].cur = (term.screen[0].cur - row + term.c.y + 1) % term.screen[0].size;
+ }
+
+ /* Resize and clear line buffers as needed */
+ if (linelen > term.linelen) {
+ for (i = 0; i < term.screen[0].size; ++i) {
+ if (term.screen[0].buffer[i]) {
+ term.screen[0].buffer[i] = xrealloc(term.screen[0].buffer[i], linelen * sizeof(Glyph));
+ clearline(term.screen[0].buffer[i], term.c.attr, term.linelen, linelen);
+ }
+ }
+ for (i = 0; i < minrow; ++i) {
+ term.screen[1].buffer[i] = xrealloc(term.screen[1].buffer[i], linelen * sizeof(Glyph));
+ clearline(term.screen[1].buffer[i], term.c.attr, term.linelen, linelen);
+ }