=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/screen-write.c,v retrieving revision 1.185 retrieving revision 1.186 diff -c -r1.185 -r1.186 *** src/usr.bin/tmux/screen-write.c 2020/06/18 08:41:56 1.185 --- src/usr.bin/tmux/screen-write.c 2020/07/06 10:07:02 1.186 *************** *** 1,4 **** ! /* $OpenBSD: screen-write.c,v 1.185 2020/06/18 08:41:56 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: screen-write.c,v 1.186 2020/07/06 10:07:02 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 25,34 **** static void screen_write_collect_clear(struct screen_write_ctx *, u_int, u_int); ! static int screen_write_collect_clear_end(struct screen_write_ctx *, 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_flush(struct screen_write_ctx *, int, const char *); --- 25,34 ---- static void screen_write_collect_clear(struct screen_write_ctx *, u_int, 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); static void screen_write_collect_scroll(struct screen_write_ctx *); static void screen_write_collect_flush(struct screen_write_ctx *, int, const char *); *************** *** 1127,1139 **** 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)) { ! ci->x = s->cx; ! ci->type = CLEAR_END; ! ci->bg = bg; ! TAILQ_INSERT_TAIL(&ctx->s->write_list[s->cy].items, ci, entry); ! ctx->item = xcalloc(1, sizeof *ctx->item); ! } } /* Clear to start of line from cursor. */ --- 1127,1138 ---- grid_view_clear(s->grid, s->cx, s->cy, sx - s->cx, 1, bg); ! screen_write_collect_clear_end(ctx, s->cy, s->cx); ! ci->x = s->cx; ! ci->type = CLEAR_END; ! ci->bg = bg; ! TAILQ_INSERT_TAIL(&ctx->s->write_list[s->cy].items, ci, entry); ! ctx->item = xcalloc(1, sizeof *ctx->item); } /* Clear to start of line from cursor. */ *************** *** 1154,1166 **** else 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)) { ! ci->x = s->cx; ! ci->type = CLEAR_START; ! ci->bg = bg; ! TAILQ_INSERT_TAIL(&ctx->s->write_list[s->cy].items, ci, entry); ! ctx->item = xcalloc(1, sizeof *ctx->item); ! } } /* Move cursor to px,py. */ --- 1153,1164 ---- else grid_view_clear(s->grid, 0, s->cy, s->cx + 1, 1, bg); ! screen_write_collect_clear_start(ctx, s->cy, s->cx); ! ci->x = s->cx; ! ci->type = CLEAR_START; ! ci->bg = bg; ! TAILQ_INSERT_TAIL(&ctx->s->write_list[s->cy].items, ci, entry); ! ctx->item = xcalloc(1, sizeof *ctx->item); } /* Move cursor to px,py. */ *************** *** 1393,1417 **** } /* Clear to start of a collected line. */ ! static int ! 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; size_t size = 0; u_int items = 0; - int redundant = 0; if (TAILQ_EMPTY(&ctx->s->write_list[y].items)) ! return (0); TAILQ_FOREACH_SAFE(ci, &ctx->s->write_list[y].items, entry, tmp) { switch (ci->type) { case CLEAR_START: - if (ci->x >= x) { - if (ci->bg == bg) - redundant = 1; - continue; - } break; case CLEAR_END: if (ci->x <= x) --- 1391,1408 ---- } /* Clear to start of a collected line. */ ! static void ! screen_write_collect_clear_start(struct screen_write_ctx *ctx, u_int y, u_int x) { struct screen_write_collect_item *ci, *tmp; size_t size = 0; u_int items = 0; if (TAILQ_EMPTY(&ctx->s->write_list[y].items)) ! return; TAILQ_FOREACH_SAFE(ci, &ctx->s->write_list[y].items, entry, tmp) { switch (ci->type) { case CLEAR_START: break; case CLEAR_END: if (ci->x <= x) *************** *** 1430,1450 **** ctx->skipped += size; log_debug("%s: dropped %u items (%zu bytes) (line %u)", __func__, items, size, y); - return (redundant); } /* Clear to end of a collected line. */ ! static int ! 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; size_t size = 0; - int redundant = 0; u_int items = 0; if (TAILQ_EMPTY(&ctx->s->write_list[y].items)) ! return (0); TAILQ_FOREACH_SAFE(ci, &ctx->s->write_list[y].items, entry, tmp) { switch (ci->type) { case CLEAR_START: --- 1421,1438 ---- ctx->skipped += size; log_debug("%s: dropped %u items (%zu bytes) (line %u)", __func__, items, size, y); } /* Clear to end of a collected line. */ ! static void ! screen_write_collect_clear_end(struct screen_write_ctx *ctx, u_int y, u_int x) { struct screen_write_collect_item *ci, *tmp; size_t size = 0; u_int items = 0; if (TAILQ_EMPTY(&ctx->s->write_list[y].items)) ! return; TAILQ_FOREACH_SAFE(ci, &ctx->s->write_list[y].items, entry, tmp) { switch (ci->type) { case CLEAR_START: *************** *** 1452,1462 **** ci->x = x; continue; case CLEAR_END: - if (ci->x <= x) { - if (ci->bg == bg) - redundant = 1; - continue; - } break; case TEXT: if (ci->x < x) --- 1440,1445 ---- *************** *** 1471,1477 **** ctx->skipped += size; log_debug("%s: dropped %u items (%zu bytes) (line %u)", __func__, items, size, y); - return (redundant); } /* Clear collected lines. */ --- 1454,1459 ---- *************** *** 1566,1571 **** --- 1548,1554 ---- TAILQ_FOREACH_SAFE(ci, &cl->items, entry, tmp) { screen_write_set_cursor(ctx, ci->x, y); if (ci->type == CLEAR_END) { + log_debug("XXX %u %u", ci->x, ci->bg); screen_write_initctx(ctx, &ttyctx, 1); ttyctx.bg = ci->bg; tty_write(tty_cmd_clearendofline, &ttyctx);