diff options
author | Nicholas Marriott <nicm@cvs.openbsd.org> | 2010-06-21 00:11:13 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@cvs.openbsd.org> | 2010-06-21 00:11:13 +0000 |
commit | bca6b1c1e7ec717e3d4b98f4ab4982ff0cc13396 (patch) | |
tree | 386737eac2d511ebdc4b62217fd69a0b48cc1043 | |
parent | 46f7963d04dfb5291a9f9d922ae8d94990276cb0 (diff) |
Ensure we overwrite UTF-8 wide characters properly, and never overwrite
characters we weren't overlapping. Fixes "disappearing wide characters"
glitch. From Micah Cowan.
-rw-r--r-- | usr.bin/tmux/screen-write.c | 44 |
1 files changed, 15 insertions, 29 deletions
diff --git a/usr.bin/tmux/screen-write.c b/usr.bin/tmux/screen-write.c index 88d56296396..9ed21d10cb8 100644 --- a/usr.bin/tmux/screen-write.c +++ b/usr.bin/tmux/screen-write.c @@ -1,4 +1,4 @@ -/* $OpenBSD: screen-write.c,v 1.42 2010/04/06 21:35:44 nicm Exp $ */ +/* $OpenBSD: screen-write.c,v 1.43 2010/06/21 00:11:12 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -23,7 +23,7 @@ #include "tmux.h" void screen_write_initctx(struct screen_write_ctx *, struct tty_ctx *, int); -void screen_write_overwrite(struct screen_write_ctx *); +void screen_write_overwrite(struct screen_write_ctx *, u_int); int screen_write_combine( struct screen_write_ctx *, const struct utf8_data *); @@ -1020,7 +1020,7 @@ screen_write_cell(struct screen_write_ctx *ctx, return; /* Handle overwriting of UTF-8 characters. */ - screen_write_overwrite(ctx); + screen_write_overwrite(ctx, width); /* * If the new character is UTF-8 wide, fill in padding cells. Have @@ -1123,12 +1123,11 @@ screen_write_combine( * by the same character. */ void -screen_write_overwrite(struct screen_write_ctx *ctx) +screen_write_overwrite(struct screen_write_ctx *ctx, u_int width) { struct screen *s = ctx->s; struct grid *gd = s->grid; const struct grid_cell *gc; - const struct grid_utf8 *gu; u_int xx; gc = grid_view_peek_cell(gd, s->cx, s->cy); @@ -1148,30 +1147,17 @@ screen_write_overwrite(struct screen_write_ctx *ctx) /* Overwrite the character at the start of this padding. */ grid_view_set_cell(gd, xx, s->cy, &grid_default_cell); + } - /* Overwrite following padding cells. */ - xx = s->cx; - while (++xx < screen_size_x(s)) { - gc = grid_view_peek_cell(gd, xx, s->cy); - if (!(gc->flags & GRID_FLAG_PADDING)) - break; - grid_view_set_cell(gd, xx, s->cy, &grid_default_cell); - } - } else if (gc->flags & GRID_FLAG_UTF8) { - gu = grid_view_peek_utf8(gd, s->cx, s->cy); - if (gu->width > 1) { - /* - * An UTF-8 wide cell; overwrite following padding - * cells only. - */ - xx = s->cx; - while (++xx < screen_size_x(s)) { - gc = grid_view_peek_cell(gd, xx, s->cy); - if (!(gc->flags & GRID_FLAG_PADDING)) - break; - grid_view_set_cell( - gd, xx, s->cy, &grid_default_cell); - } - } + /* + * Overwrite any padding cells that belong to a UTF-8 character + * we'll be overwriting with the current character. + */ + xx = s->cx + width - 1; + while (++xx < screen_size_x(s)) { + gc = grid_view_peek_cell(gd, xx, s->cy); + if (!(gc->flags & GRID_FLAG_PADDING)) + break; + grid_view_set_cell(gd, xx, s->cy, &grid_default_cell); } } |