From 31522e2e8f8f739fc80e706f532fde1b2760aca4 Mon Sep 17 00:00:00 2001 From: Jocelyn Falempe Date: Thu, 15 Jan 2026 22:59:22 +0100 Subject: [PATCH] Add support to CSI b sequence (repeat last char) This makes nsnake work when TERM is set to xterm-256color Signed-off-by: Jocelyn Falempe --- src/tsm/libtsm-int.h | 1 + src/tsm/tsm-screen.c | 30 ++++++++++++++++++++++++++++++ src/tsm/tsm-vte.c | 6 +++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/tsm/libtsm-int.h b/src/tsm/libtsm-int.h index 2557d54..668ba4a 100644 --- a/src/tsm/libtsm-int.h +++ b/src/tsm/libtsm-int.h @@ -162,6 +162,7 @@ void screen_cell_init(struct tsm_screen *con, struct cell *cell); void tsm_screen_set_opts(struct tsm_screen *scr, unsigned int opts); void tsm_screen_reset_opts(struct tsm_screen *scr, unsigned int opts); unsigned int tsm_screen_get_opts(struct tsm_screen *scr); +void tsm_screen_repeat_char(struct tsm_screen *con, unsigned int num); static inline void screen_inc_age(struct tsm_screen *con) { diff --git a/src/tsm/tsm-screen.c b/src/tsm/tsm-screen.c index 6fcc468..64a459c 100644 --- a/src/tsm/tsm-screen.c +++ b/src/tsm/tsm-screen.c @@ -1550,6 +1550,36 @@ void tsm_screen_insert_chars(struct tsm_screen *con, unsigned int num) screen_cell_init(con, &cells[con->cursor_x + i]); } +void tsm_screen_repeat_char(struct tsm_screen *con, unsigned int num) +{ + struct cell *cells; + unsigned int max, i; + + if (!con || !num || !con->size_y || !con->size_x) + return; + + screen_inc_age(con); + /* TODO: more sophisticated ageing */ + con->age = con->age_cnt; + + if (con->cursor_x >= con->size_x) + con->cursor_x = con->size_x - 1; + if (con->cursor_y >= con->size_y) + con->cursor_y = con->size_y - 1; + + if (!con->cursor_x) + return; + + max = con->size_x - con->cursor_x; + if (num > max) + num = max; + + cells = con->lines[con->cursor_y]->cells; + for (i = 0; i < num; i++) + cells[con->cursor_x + i] = cells[con->cursor_x - 1]; + con->cursor_x += num; +} + SHL_EXPORT void tsm_screen_delete_chars(struct tsm_screen *con, unsigned int num) { diff --git a/src/tsm/tsm-vte.c b/src/tsm/tsm-vte.c index 7827880..0171918 100644 --- a/src/tsm/tsm-vte.c +++ b/src/tsm/tsm-vte.c @@ -2065,7 +2065,11 @@ static void do_csi(struct tsm_vte *vte, uint32_t data) if (vte->csi_argv[0] == 18 || vte->csi_argv[0] == 19) csi_report_window_size(vte); else - llog_debug(vte, "unhandled CSI t sequence %c", data); + llog_debug(vte, "unhandled CSI t sequence %d", vte->csi_argv[0]); + break; + case 'b': /* Repeat last char */ + num = vte->csi_argv[0]; + tsm_screen_repeat_char(vte->con, num); break; default: llog_debug(vte, "unhandled CSI sequence %c", data);