mirror of
https://github.com/tmux/tmux.git
synced 2024-10-31 22:58:49 +00:00
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:
parent
66d5e5de7a
commit
2aa177d102
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user