diff --git a/input.c b/input.c index e70b28f9..3a4cf65d 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); } @@ -1574,12 +1575,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); @@ -1649,7 +1650,7 @@ input_csi_dispatch(struct input_ctx *ictx) } - ictx->last = -1; + ictx->flags &= ~INPUT_LAST; return (0); } @@ -2284,7 +2285,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. */ @@ -2341,7 +2342,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. */ @@ -2436,7 +2437,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. */ @@ -2465,7 +2466,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. */ @@ -2509,7 +2510,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) @@ -2535,6 +2536,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); } 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;