Do not eliminate redundant clears, the code is wrong and doing it

correctly wouldn't be worth it. GitHub issue 2298.
This commit is contained in:
nicm 2020-07-06 10:07:02 +00:00
parent 66d5e5de7a
commit 2aa177d102

View File

@ -25,10 +25,10 @@
static void screen_write_collect_clear(struct screen_write_ctx *, u_int, static void screen_write_collect_clear(struct screen_write_ctx *, u_int,
u_int); u_int);
static int screen_write_collect_clear_end(struct screen_write_ctx *, u_int, static void screen_write_collect_clear_end(struct screen_write_ctx *, u_int,
u_int);
static void screen_write_collect_clear_start(struct screen_write_ctx *,
u_int, u_int); u_int, u_int);
static int screen_write_collect_clear_start(struct screen_write_ctx *,
u_int, u_int, u_int);
static void screen_write_collect_scroll(struct screen_write_ctx *); static void screen_write_collect_scroll(struct screen_write_ctx *);
static void screen_write_collect_flush(struct screen_write_ctx *, int, static void screen_write_collect_flush(struct screen_write_ctx *, int,
const char *); const char *);
@ -1127,14 +1127,13 @@ screen_write_clearendofline(struct screen_write_ctx *ctx, u_int bg)
grid_view_clear(s->grid, s->cx, s->cy, sx - s->cx, 1, bg); grid_view_clear(s->grid, s->cx, s->cy, sx - s->cx, 1, bg);
if (!screen_write_collect_clear_end(ctx, s->cy, s->cx, bg)) { screen_write_collect_clear_end(ctx, s->cy, s->cx);
ci->x = s->cx; ci->x = s->cx;
ci->type = CLEAR_END; ci->type = CLEAR_END;
ci->bg = bg; ci->bg = bg;
TAILQ_INSERT_TAIL(&ctx->s->write_list[s->cy].items, ci, entry); TAILQ_INSERT_TAIL(&ctx->s->write_list[s->cy].items, ci, entry);
ctx->item = xcalloc(1, sizeof *ctx->item); ctx->item = xcalloc(1, sizeof *ctx->item);
} }
}
/* Clear to start of line from cursor. */ /* Clear to start of line from cursor. */
void void
@ -1154,14 +1153,13 @@ screen_write_clearstartofline(struct screen_write_ctx *ctx, u_int bg)
else else
grid_view_clear(s->grid, 0, s->cy, s->cx + 1, 1, bg); grid_view_clear(s->grid, 0, s->cy, s->cx + 1, 1, bg);
if (!screen_write_collect_clear_start(ctx, s->cy, s->cx, bg)) { screen_write_collect_clear_start(ctx, s->cy, s->cx);
ci->x = s->cx; ci->x = s->cx;
ci->type = CLEAR_START; ci->type = CLEAR_START;
ci->bg = bg; ci->bg = bg;
TAILQ_INSERT_TAIL(&ctx->s->write_list[s->cy].items, ci, entry); TAILQ_INSERT_TAIL(&ctx->s->write_list[s->cy].items, ci, entry);
ctx->item = xcalloc(1, sizeof *ctx->item); ctx->item = xcalloc(1, sizeof *ctx->item);
} }
}
/* Move cursor to px,py. */ /* Move cursor to px,py. */
void void
@ -1393,25 +1391,18 @@ screen_write_clearhistory(struct screen_write_ctx *ctx)
} }
/* Clear to start of a collected line. */ /* Clear to start of a collected line. */
static int static void
screen_write_collect_clear_start(struct screen_write_ctx *ctx, u_int y, u_int x, screen_write_collect_clear_start(struct screen_write_ctx *ctx, u_int y, u_int x)
u_int bg)
{ {
struct screen_write_collect_item *ci, *tmp; struct screen_write_collect_item *ci, *tmp;
size_t size = 0; size_t size = 0;
u_int items = 0; u_int items = 0;
int redundant = 0;
if (TAILQ_EMPTY(&ctx->s->write_list[y].items)) if (TAILQ_EMPTY(&ctx->s->write_list[y].items))
return (0); return;
TAILQ_FOREACH_SAFE(ci, &ctx->s->write_list[y].items, entry, tmp) { TAILQ_FOREACH_SAFE(ci, &ctx->s->write_list[y].items, entry, tmp) {
switch (ci->type) { switch (ci->type) {
case CLEAR_START: case CLEAR_START:
if (ci->x >= x) {
if (ci->bg == bg)
redundant = 1;
continue;
}
break; break;
case CLEAR_END: case CLEAR_END:
if (ci->x <= x) if (ci->x <= x)
@ -1430,21 +1421,18 @@ screen_write_collect_clear_start(struct screen_write_ctx *ctx, u_int y, u_int x,
ctx->skipped += size; ctx->skipped += size;
log_debug("%s: dropped %u items (%zu bytes) (line %u)", __func__, items, log_debug("%s: dropped %u items (%zu bytes) (line %u)", __func__, items,
size, y); size, y);
return (redundant);
} }
/* Clear to end of a collected line. */ /* Clear to end of a collected line. */
static int static void
screen_write_collect_clear_end(struct screen_write_ctx *ctx, u_int y, u_int x, screen_write_collect_clear_end(struct screen_write_ctx *ctx, u_int y, u_int x)
u_int bg)
{ {
struct screen_write_collect_item *ci, *tmp; struct screen_write_collect_item *ci, *tmp;
size_t size = 0; size_t size = 0;
int redundant = 0;
u_int items = 0; u_int items = 0;
if (TAILQ_EMPTY(&ctx->s->write_list[y].items)) if (TAILQ_EMPTY(&ctx->s->write_list[y].items))
return (0); return;
TAILQ_FOREACH_SAFE(ci, &ctx->s->write_list[y].items, entry, tmp) { TAILQ_FOREACH_SAFE(ci, &ctx->s->write_list[y].items, entry, tmp) {
switch (ci->type) { switch (ci->type) {
case CLEAR_START: case CLEAR_START:
@ -1452,11 +1440,6 @@ screen_write_collect_clear_end(struct screen_write_ctx *ctx, u_int y, u_int x,
ci->x = x; ci->x = x;
continue; continue;
case CLEAR_END: case CLEAR_END:
if (ci->x <= x) {
if (ci->bg == bg)
redundant = 1;
continue;
}
break; break;
case TEXT: case TEXT:
if (ci->x < x) if (ci->x < x)
@ -1471,7 +1454,6 @@ screen_write_collect_clear_end(struct screen_write_ctx *ctx, u_int y, u_int x,
ctx->skipped += size; ctx->skipped += size;
log_debug("%s: dropped %u items (%zu bytes) (line %u)", __func__, items, log_debug("%s: dropped %u items (%zu bytes) (line %u)", __func__, items,
size, y); size, y);
return (redundant);
} }
/* Clear collected lines. */ /* Clear collected lines. */
@ -1566,6 +1548,7 @@ screen_write_collect_flush(struct screen_write_ctx *ctx, int scroll_only,
TAILQ_FOREACH_SAFE(ci, &cl->items, entry, tmp) { TAILQ_FOREACH_SAFE(ci, &cl->items, entry, tmp) {
screen_write_set_cursor(ctx, ci->x, y); screen_write_set_cursor(ctx, ci->x, y);
if (ci->type == CLEAR_END) { if (ci->type == CLEAR_END) {
log_debug("XXX %u %u", ci->x, ci->bg);
screen_write_initctx(ctx, &ttyctx, 1); screen_write_initctx(ctx, &ttyctx, 1);
ttyctx.bg = ci->bg; ttyctx.bg = ci->bg;
tty_write(tty_cmd_clearendofline, &ttyctx); tty_write(tty_cmd_clearendofline, &ttyctx);