mirror of
https://github.com/tmux/tmux.git
synced 2024-12-12 17:38:48 +00:00
Ensure we overwrite UTF-8 wide characters properly, and never overwrite
characters we weren't overlapping. Fixes "disappearing wide characters" glitch. From Micah Cowan.
This commit is contained in:
parent
278d9bc721
commit
5afb820d23
@ -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);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user