summaryrefslogtreecommitdiffstats
path: root/screen-write.c
diff options
context:
space:
mode:
authornicm <nicm>2021-01-18 10:27:54 +0000
committernicm <nicm>2021-01-18 10:27:54 +0000
commit91d112bf12789da07e25ed001f7961b1d6bd7a76 (patch)
treeab49fb6c0c384221466c910061afc622e1e59231 /screen-write.c
parent71c590a37f98d82c72279eddae74f9b8be146202 (diff)
There is no need to clear every line entirely before drawing to it, this
means moving the cursor and messes up wrapping. Better to just clear the sections that aren't written over. GitHub issue 2537.
Diffstat (limited to 'screen-write.c')
-rw-r--r--screen-write.c32
1 files changed, 25 insertions, 7 deletions
diff --git a/screen-write.c b/screen-write.c
index 92f1aa39..7df5cd92 100644
--- a/screen-write.c
+++ b/screen-write.c
@@ -259,7 +259,6 @@ screen_write_start_callback(struct screen_write_ctx *ctx, struct screen *s,
}
}
-
/* Initialize writing. */
void
screen_write_start(struct screen_write_ctx *ctx, struct screen *s)
@@ -1517,6 +1516,7 @@ screen_write_collect_flush(struct screen_write_ctx *ctx, int scroll_only,
struct screen_write_collect_item *ci, *tmp;
struct screen_write_collect_line *cl;
u_int y, cx, cy, items = 0;
+ int clear = 0;
struct tty_ctx ttyctx;
size_t written = 0;
@@ -1540,22 +1540,29 @@ screen_write_collect_flush(struct screen_write_ctx *ctx, int scroll_only,
cx = s->cx; cy = s->cy;
for (y = 0; y < screen_size_y(s); y++) {
cl = &ctx->s->write_list[y];
- if (cl->bg != 0) {
- screen_write_set_cursor(ctx, 0, y);
- screen_write_initctx(ctx, &ttyctx, 1);
- ttyctx.bg = cl->bg - 1;
- tty_write(tty_cmd_clearline, &ttyctx);
- }
TAILQ_FOREACH_SAFE(ci, &cl->items, entry, tmp) {
+ if (clear != -1 &&
+ (u_int)clear != ci->x &&
+ cl->bg != 0) {
+ screen_write_set_cursor(ctx, clear, y);
+ screen_write_initctx(ctx, &ttyctx, 1);
+ ttyctx.bg = cl->bg - 1;
+ ttyctx.num = ci->x - clear;
+ log_debug("clear %u at %u", ttyctx.num, clear);
+ tty_write(tty_cmd_clearcharacter, &ttyctx);
+ }
+
screen_write_set_cursor(ctx, ci->x, y);
if (ci->type == CLEAR_END) {
screen_write_initctx(ctx, &ttyctx, 1);
ttyctx.bg = ci->bg;
tty_write(tty_cmd_clearendofline, &ttyctx);
+ clear = -1;
} else if (ci->type == CLEAR_START) {
screen_write_initctx(ctx, &ttyctx, 1);
ttyctx.bg = ci->bg;
tty_write(tty_cmd_clearstartofline, &ttyctx);
+ clear = ci->x + 1;
} else {
screen_write_initctx(ctx, &ttyctx, 0);
ttyctx.cell = &ci->gc;
@@ -1563,6 +1570,7 @@ screen_write_collect_flush(struct screen_write_ctx *ctx, int scroll_only,
ttyctx.ptr = cl->data + ci->x;
ttyctx.num = ci->used;
tty_write(tty_cmd_cells, &ttyctx);
+ clear = ci->x + ci->used;
}
items++;
@@ -1571,6 +1579,16 @@ screen_write_collect_flush(struct screen_write_ctx *ctx, int scroll_only,
TAILQ_REMOVE(&cl->items, ci, entry);
free(ci);
}
+ if (clear != -1 &&
+ (u_int)clear != screen_size_x(s) - 1 &&
+ cl->bg != 0) {
+ screen_write_set_cursor(ctx, clear, y);
+ screen_write_initctx(ctx, &ttyctx, 1);
+ ttyctx.bg = cl->bg - 1;
+ log_debug("clear to end at %u", clear);
+ tty_write(tty_cmd_clearendofline, &ttyctx);
+ }
+ clear = 0;
cl->bg = 0;
}
s->cx = cx; s->cy = cy;