mirror of
https://github.com/tmux/tmux.git
synced 2025-09-01 04:27:00 +00:00
Replace invalid UTF-8 with the placeholder instead of ignoring them
(this is what most terminals do), GitHub issue 4514.
This commit is contained in:
24
input.c
24
input.c
@ -747,6 +747,20 @@ input_table_compare(const void *key, const void *value)
|
||||
return (strcmp(ictx->interm_buf, entry->interm));
|
||||
}
|
||||
|
||||
/* Stop UTF-8 and enter an invalid character. */
|
||||
static void
|
||||
input_stop_utf8(struct input_ctx *ictx)
|
||||
{
|
||||
struct screen_write_ctx *sctx = &ictx->ctx;
|
||||
static struct utf8_data rc = { "\357\277\275", 3, 3, 1 };
|
||||
|
||||
if (ictx->utf8started) {
|
||||
utf8_copy(&ictx->cell.cell.data, &rc);
|
||||
screen_write_collect_add(sctx, &ictx->cell.cell);
|
||||
}
|
||||
ictx->utf8started = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Timer - if this expires then have been waiting for a terminator for too
|
||||
* long, so reset to ground.
|
||||
@ -1144,7 +1158,7 @@ input_print(struct input_ctx *ictx)
|
||||
struct screen_write_ctx *sctx = &ictx->ctx;
|
||||
int set;
|
||||
|
||||
ictx->utf8started = 0; /* can't be valid UTF-8 */
|
||||
input_stop_utf8(ictx); /* can't be valid UTF-8 */
|
||||
|
||||
set = ictx->cell.set == 0 ? ictx->cell.g0set : ictx->cell.g1set;
|
||||
if (set == 1)
|
||||
@ -1224,7 +1238,7 @@ input_c0_dispatch(struct input_ctx *ictx)
|
||||
u_int width;
|
||||
int has_content = 0;
|
||||
|
||||
ictx->utf8started = 0; /* can't be valid UTF-8 */
|
||||
input_stop_utf8(ictx); /* can't be valid UTF-8 */
|
||||
|
||||
log_debug("%s: '%c'", __func__, ictx->ch);
|
||||
|
||||
@ -2551,9 +2565,9 @@ input_top_bit_set(struct input_ctx *ictx)
|
||||
ictx->flags &= ~INPUT_LAST;
|
||||
|
||||
if (!ictx->utf8started) {
|
||||
if (utf8_open(ud, ictx->ch) != UTF8_MORE)
|
||||
return (0);
|
||||
ictx->utf8started = 1;
|
||||
if (utf8_open(ud, ictx->ch) != UTF8_MORE)
|
||||
input_stop_utf8(ictx);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@ -2561,7 +2575,7 @@ input_top_bit_set(struct input_ctx *ictx)
|
||||
case UTF8_MORE:
|
||||
return (0);
|
||||
case UTF8_ERROR:
|
||||
ictx->utf8started = 0;
|
||||
input_stop_utf8(ictx);
|
||||
return (0);
|
||||
case UTF8_DONE:
|
||||
break;
|
||||
|
Reference in New Issue
Block a user