Ensure we overwrite UTF-8 wide characters properly, and never overwrite

characters we weren't overlapping.  Fixes "disappearing wide characters"
glitch. From Micah Cowan.
pull/1/head
Nicholas Marriott 2010-06-21 00:11:12 +00:00
parent 278d9bc721
commit 5afb820d23
1 changed files with 14 additions and 28 deletions

View File

@ -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);
}
}