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"
|
#include "tmux.h"
|
||||||
|
|
||||||
void screen_write_initctx(struct screen_write_ctx *, struct tty_ctx *, int);
|
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(
|
int screen_write_combine(
|
||||||
struct screen_write_ctx *, const struct utf8_data *);
|
struct screen_write_ctx *, const struct utf8_data *);
|
||||||
|
|
||||||
@ -1020,7 +1020,7 @@ screen_write_cell(struct screen_write_ctx *ctx,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
/* Handle overwriting of UTF-8 characters. */
|
/* 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
|
* If the new character is UTF-8 wide, fill in padding cells. Have
|
||||||
@ -1123,12 +1123,11 @@ screen_write_combine(
|
|||||||
* by the same character.
|
* by the same character.
|
||||||
*/
|
*/
|
||||||
void
|
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 screen *s = ctx->s;
|
||||||
struct grid *gd = s->grid;
|
struct grid *gd = s->grid;
|
||||||
const struct grid_cell *gc;
|
const struct grid_cell *gc;
|
||||||
const struct grid_utf8 *gu;
|
|
||||||
u_int xx;
|
u_int xx;
|
||||||
|
|
||||||
gc = grid_view_peek_cell(gd, s->cx, s->cy);
|
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. */
|
/* Overwrite the character at the start of this padding. */
|
||||||
grid_view_set_cell(gd, xx, s->cy, &grid_default_cell);
|
grid_view_set_cell(gd, xx, s->cy, &grid_default_cell);
|
||||||
|
}
|
||||||
|
|
||||||
/* Overwrite following padding cells. */
|
/*
|
||||||
xx = s->cx;
|
* Overwrite any padding cells that belong to a UTF-8 character
|
||||||
while (++xx < screen_size_x(s)) {
|
* we'll be overwriting with the current character.
|
||||||
gc = grid_view_peek_cell(gd, xx, s->cy);
|
*/
|
||||||
if (!(gc->flags & GRID_FLAG_PADDING))
|
xx = s->cx + width - 1;
|
||||||
break;
|
while (++xx < screen_size_x(s)) {
|
||||||
grid_view_set_cell(gd, xx, s->cy, &grid_default_cell);
|
gc = grid_view_peek_cell(gd, xx, s->cy);
|
||||||
}
|
if (!(gc->flags & GRID_FLAG_PADDING))
|
||||||
} else if (gc->flags & GRID_FLAG_UTF8) {
|
break;
|
||||||
gu = grid_view_peek_utf8(gd, s->cx, s->cy);
|
grid_view_set_cell(gd, xx, s->cy, &grid_default_cell);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user