From 97b5962ab1ce08f50001f2bbcd87685e8dcce222 Mon Sep 17 00:00:00 2001 From: nicm Date: Fri, 6 Aug 2021 03:13:05 +0000 Subject: [PATCH] Correctly draw wide characters that are partially obscured. --- tty.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/tty.c b/tty.c index 425d3420..cb179250 100644 --- a/tty.c +++ b/tty.c @@ -1349,7 +1349,7 @@ tty_draw_line(struct tty *tty, struct screen *s, u_int px, u_int py, u_int nx, struct grid_line *gl; struct client *c = tty->client; u_int i, j, ux, sx, width; - int flags, cleared = 0, wrapped = 0; + int flags, cleared = 0, wrapped = 0, hidden; char buf[512]; size_t len; u_int cellsize; @@ -1449,17 +1449,24 @@ tty_draw_line(struct tty *tty, struct screen *s, u_int px, u_int py, u_int nx, screen_select_cell(s, &last, gcp); else memcpy(&last, gcp, sizeof last); - if (!tty_check_overlay(tty, atx + ux, aty)) { - if (~gcp->flags & GRID_FLAG_PADDING) - ux += gcp->data.width; - } else if (ux + gcp->data.width > nx) { - tty_attributes(tty, &last, defaults, palette); - tty_cursor(tty, atx + ux, aty); - for (j = 0; j < gcp->data.width; j++) { - if (ux + j > nx) - break; - tty_putc(tty, ' '); - ux++; + + hidden = 0; + for (j = 0; j < gcp->data.width; j++) { + if (!tty_check_overlay(tty, atx + ux + j, aty)) { + hidden = 1; + break; + } + } + if (hidden || ux + gcp->data.width > nx) { + if (~gcp->flags & GRID_FLAG_PADDING) { + tty_attributes(tty, &last, defaults, palette); + tty_cursor(tty, atx + ux, aty); + for (j = 0; j < gcp->data.width; j++) { + if (ux + j > nx) + break; + tty_putc(tty, ' '); + ux++; + } } } else if (gcp->attr & GRID_ATTR_CHARSET) { tty_attributes(tty, &last, defaults, palette);