summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2010-06-21 00:11:13 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2010-06-21 00:11:13 +0000
commitbca6b1c1e7ec717e3d4b98f4ab4982ff0cc13396 (patch)
tree386737eac2d511ebdc4b62217fd69a0b48cc1043
parent46f7963d04dfb5291a9f9d922ae8d94990276cb0 (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.c44
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);
}
}