st

simple terminal

git clone https://9o.is/git/st.git

commit 58705b2db6407bb9df5f980b41b9bd8fbaab0d21
parent 92fa4bee6448df2dbe6f8f6efbcd7f826cd03f23
Author: Johannes Altmanninger <aclopte@gmail.com>
Date:   Sun, 26 Jan 2025 13:40:57 +0100

Do not interpret CSI ? u as DECRC

The kitty keyboard protocol docs recommend CSI ? u to query support for
that protocol, see https://sw.kovidgoyal.net/kitty/keyboard-protocol/

For better or worse, fish shell uses this query to work around bugs
in other terminals triggered by requesting that protocol via CSI = 5 u.

Unfortunately, st interprets CSI ? u as DECRC (restore cursor
position). reproduce with 'printf "\x1b[?u"; cat'.

fish could work around this by switching to the alternate screen
before running this query; but that might cause tearing on terminals
that don't support Synchronized Output. I'm not sure.

In the meantime, let's correct our parser.

This adds a redundant else-after-return, for consistency with the
surrounding code.

Diffstat:
Mst.c | 6+++++-
1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/st.c b/st.c @@ -1801,7 +1801,11 @@ csihandle(void) tcursor(CURSOR_SAVE); break; case 'u': /* DECRC -- Restore cursor position (ANSI.SYS) */ - tcursor(CURSOR_LOAD); + if (csiescseq.priv) { + goto unknown; + } else { + tcursor(CURSOR_LOAD); + } break; case ' ': switch (csiescseq.mode[1]) {