There is no point allocating a new item and putting it on the list when

the whole line is cleared line, there is never any point in doing it
more than once. Instead store the background colour alone.
This commit is contained in:
nicm 2020-04-17 15:44:58 +00:00
parent 282a7a8d96
commit bbd6e899a8

View File

@ -46,7 +46,7 @@ struct screen_write_collect_item {
u_int x;
int wrapped;
enum { TEXT, CLEAR, CLEAR_END, CLEAR_START } type;
enum { TEXT, CLEAR_END, CLEAR_START } type;
u_int used;
union {
u_int bg;
@ -58,6 +58,7 @@ struct screen_write_collect_item {
TAILQ_ENTRY(screen_write_collect_item) entry;
};
struct screen_write_collect_line {
u_int bg;
TAILQ_HEAD(, screen_write_collect_item) items;
};
@ -932,10 +933,9 @@ screen_write_deleteline(struct screen_write_ctx *ctx, u_int ny, u_int bg)
void
screen_write_clearline(struct screen_write_ctx *ctx, u_int bg)
{
struct screen *s = ctx->s;
struct grid_line *gl;
u_int sx = screen_size_x(s);
struct screen_write_collect_item *ci = ctx->item;
struct screen *s = ctx->s;
struct grid_line *gl;
u_int sx = screen_size_x(s);
gl = grid_get_line(s->grid, s->grid->hsize + s->cy);
if (gl->cellsize == 0 && COLOUR_DEFAULT(bg))
@ -944,11 +944,8 @@ 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);
ci->x = 0;
ci->type = CLEAR;
ci->bg = bg;
TAILQ_INSERT_TAIL(&ctx->list[s->cy].items, ci, entry);
ctx->item = xcalloc(1, sizeof *ctx->item);
ctx->list[s->cy].bg = 1 + bg;
ctx->item->used = 0;
}
/* Clear to end of line from cursor. */
@ -1250,8 +1247,6 @@ screen_write_collect_clear_start(struct screen_write_ctx *ctx, u_int y, u_int x,
return (0);
TAILQ_FOREACH_SAFE(ci, &ctx->list[y].items, entry, tmp) {
switch (ci->type) {
case CLEAR:
continue;
case CLEAR_START:
if (ci->x >= x) {
if (ci->bg == bg)
@ -1293,8 +1288,6 @@ screen_write_collect_clear_end(struct screen_write_ctx *ctx, u_int y, u_int x,
return (0);
TAILQ_FOREACH_SAFE(ci, &ctx->list[y].items, entry, tmp) {
switch (ci->type) {
case CLEAR:
continue;
case CLEAR_START:
if (ci->x >= x)
ci->x = x;
@ -1395,13 +1388,15 @@ 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++) {
if (ctx->list[y].bg != 0) {
screen_write_set_cursor(ctx, 0, y);
screen_write_initctx(ctx, &ttyctx, 1);
ttyctx.bg = ctx->list[y].bg - 1;
tty_write(tty_cmd_clearline, &ttyctx);
}
TAILQ_FOREACH_SAFE(ci, &ctx->list[y].items, entry, tmp) {
screen_write_set_cursor(ctx, ci->x, y);
if (ci->type == CLEAR) {
screen_write_initctx(ctx, &ttyctx, 1);
ttyctx.bg = ci->bg;
tty_write(tty_cmd_clearline, &ttyctx);
} else if (ci->type == CLEAR_END) {
if (ci->type == CLEAR_END) {
screen_write_initctx(ctx, &ttyctx, 1);
ttyctx.bg = ci->bg;
tty_write(tty_cmd_clearendofline, &ttyctx);