From 9e4c5133c8212c8d60c097e5900e6b801f62abfa Mon Sep 17 00:00:00 2001 From: nicm Date: Tue, 21 Feb 2017 10:30:15 +0000 Subject: [PATCH] Scrolling at least needs to be flushed before sending EL to the terminal (but it is simpler to flush everything, so do that instead). --- screen-write.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/screen-write.c b/screen-write.c index f0ea4c14..937870f9 100644 --- a/screen-write.c +++ b/screen-write.c @@ -741,6 +741,7 @@ screen_write_clearline(struct screen_write_ctx *ctx, u_int bg) grid_view_clear(s->grid, 0, s->cy, sx, 1, bg); screen_write_collect_clear(ctx, s->cy, 1); + screen_write_collect_flush(ctx, 0); tty_write(tty_cmd_clearline, &ttyctx); } @@ -764,8 +765,7 @@ screen_write_clearendofline(struct screen_write_ctx *ctx, u_int bg) if (s->cx == 0) screen_write_collect_clear(ctx, s->cy, 1); - else - screen_write_collect_flush(ctx, 0); + screen_write_collect_flush(ctx, 0); tty_write(tty_cmd_clearendofline, &ttyctx); } @@ -787,8 +787,7 @@ screen_write_clearstartofline(struct screen_write_ctx *ctx, u_int bg) if (s->cx > sx - 1) screen_write_collect_clear(ctx, s->cy, 1); - else - screen_write_collect_flush(ctx, 0); + screen_write_collect_flush(ctx, 0); tty_write(tty_cmd_clearstartofline, &ttyctx); } @@ -863,6 +862,9 @@ screen_write_linefeed(struct screen_write_ctx *ctx, int wrapped) else gl->flags &= ~GRID_LINE_WRAPPED; + log_debug("%s: at %u,%u (region %u-%u)", __func__, s->cx, s->cy, + s->rupper, s->rlower); + if (s->cy == s->rlower) { grid_view_scroll_region_up(gd, s->rupper, s->rlower); screen_write_collect_scroll(ctx); @@ -999,7 +1001,7 @@ screen_write_collect_clear(struct screen_write_ctx *ctx, u_int y, u_int n) free(ci); } ctx->skipped += size; - log_debug("discarding %zu bytes on line %u", size, i); + log_debug("%s: dropped %zu bytes (line %u)", __func__, size, i); } } @@ -1011,6 +1013,9 @@ screen_write_collect_scroll(struct screen_write_ctx *ctx) struct screen_write_collect_line *cl; u_int y; + log_debug("%s: at %u,%u (region %u-%u)", __func__, s->cx, s->cy, + s->rupper, s->rlower); + screen_write_collect_clear(ctx, s->rupper, 1); for (y = s->rupper; y < s->rlower; y++) { cl = &ctx->list[y + 1]; @@ -1122,6 +1127,7 @@ screen_write_collect_add(struct screen_write_ctx *ctx, if (s->cx > sx - 1 || ctx->item->used > sx - 1 - s->cx) screen_write_collect_end(ctx); if (s->cx > sx - 1) { + log_debug("%s: wrapped at %u,%u", __func__, s->cx, s->cy); screen_write_linefeed(ctx, 1); s->cx = 0; }