From 937ba1d8dd9ed6b42a61cef7d9fab761ca6f9dbb Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 19 Aug 2024 08:29:16 +0000 Subject: [PATCH 1/2] Both terminators \007 and \033\\ leave the index pointing to the final character of the terminator, so correct the size calculation to always add one. GitHub issue 4082. --- tty-keys.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tty-keys.c b/tty-keys.c index 17fe47ad..a04d951d 100644 --- a/tty-keys.c +++ b/tty-keys.c @@ -1212,7 +1212,7 @@ tty_keys_clipboard(struct tty *tty, const char *buf, size_t len, size_t *size) } if (end == len) return (1); - *size = end + terminator; + *size = end + 1; /* Skip the initial part. */ buf += 5; From de6bce057a27fe3d1ac804c87cfe50846f75eb10 Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 19 Aug 2024 08:31:36 +0000 Subject: [PATCH 2/2] Allow REP to work with Unicode characters, GitHub issue 3687. --- input.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/input.c b/input.c index 788f0edb..70caff47 100644 --- a/input.c +++ b/input.c @@ -109,10 +109,11 @@ struct input_ctx { int utf8started; int ch; - int last; + struct utf8_data last; int flags; #define INPUT_DISCARD 0x1 +#define INPUT_LAST 0x2 const struct input_state *state; @@ -867,8 +868,6 @@ input_reset(struct input_ctx *ictx, int clear) input_clear(ictx); - ictx->last = -1; - ictx->state = &input_state_ground; ictx->flags = 0; } @@ -1149,7 +1148,9 @@ input_print(struct input_ctx *ictx) utf8_set(&ictx->cell.cell.data, ictx->ch); screen_write_collect_add(sctx, &ictx->cell.cell); - ictx->last = ictx->ch; + + utf8_copy(&ictx->last, &ictx->cell.cell.data); + ictx->flags |= INPUT_LAST; ictx->cell.cell.attr &= ~GRID_ATTR_CHARSET; @@ -1261,7 +1262,7 @@ input_c0_dispatch(struct input_ctx *ictx) break; } - ictx->last = -1; + ictx->flags &= ~INPUT_LAST; return (0); } @@ -1337,7 +1338,7 @@ input_esc_dispatch(struct input_ctx *ictx) break; } - ictx->last = -1; + ictx->flags &= ~INPUT_LAST; return (0); } @@ -1570,12 +1571,12 @@ input_csi_dispatch(struct input_ctx *ictx) if (n > m) n = m; - if (ictx->last == -1) + if (~ictx->flags & INPUT_LAST) break; - ictx->ch = ictx->last; + utf8_copy(&ictx->cell.cell.data, &ictx->last); for (i = 0; i < n; i++) - input_print(ictx); + screen_write_collect_add(sctx, &ictx->cell.cell); break; case INPUT_CSI_RCP: input_restore_state(ictx); @@ -1645,7 +1646,7 @@ input_csi_dispatch(struct input_ctx *ictx) } - ictx->last = -1; + ictx->flags &= ~INPUT_LAST; return (0); } @@ -2266,7 +2267,7 @@ input_enter_dcs(struct input_ctx *ictx) input_clear(ictx); input_start_timer(ictx); - ictx->last = -1; + ictx->flags &= ~INPUT_LAST; } /* DCS terminator (ST) received. */ @@ -2310,7 +2311,7 @@ input_enter_osc(struct input_ctx *ictx) input_clear(ictx); input_start_timer(ictx); - ictx->last = -1; + ictx->flags &= ~INPUT_LAST; } /* OSC terminator (ST) received. */ @@ -2405,7 +2406,7 @@ input_enter_apc(struct input_ctx *ictx) input_clear(ictx); input_start_timer(ictx); - ictx->last = -1; + ictx->flags &= ~INPUT_LAST; } /* APC terminator (ST) received. */ @@ -2434,7 +2435,7 @@ input_enter_rename(struct input_ctx *ictx) input_clear(ictx); input_start_timer(ictx); - ictx->last = -1; + ictx->flags &= ~INPUT_LAST; } /* Rename terminator (ST) received. */ @@ -2478,7 +2479,7 @@ input_top_bit_set(struct input_ctx *ictx) struct screen_write_ctx *sctx = &ictx->ctx; struct utf8_data *ud = &ictx->utf8data; - ictx->last = -1; + ictx->flags &= ~INPUT_LAST; if (!ictx->utf8started) { if (utf8_open(ud, ictx->ch) != UTF8_MORE) @@ -2504,6 +2505,9 @@ input_top_bit_set(struct input_ctx *ictx) utf8_copy(&ictx->cell.cell.data, ud); screen_write_collect_add(sctx, &ictx->cell.cell); + utf8_copy(&ictx->last, &ictx->cell.cell.data); + ictx->flags |= INPUT_LAST; + return (0); }