terminal-unix: identify and ignore unknown CSI sequences

If an unknown ESC sequence is detected where an ASCII char <X> follows
the ESC, mpv interprets it as ALT+<X>, which is the traditional
terminal encoding of ALT+letter.

However, if <X> is '[' then it's a CSI sequence which continues after
the '[', and has its own termination rules (can be many chars).

Previously, mpv interpreted unknown CSI sequences as (incorrect) ALT+[
followed by (incorrect) "keys" from the rest of the sequence.

In this commit, if a unknown CSI sequence is detected, mpv ignores
exactly the complete sequence.
This commit is contained in:
Avi Halachmi (:avih) 2021-08-19 01:19:55 +03:00 committed by avih
parent 007c728ad2
commit 21d434d2db
1 changed files with 11 additions and 0 deletions

View File

@ -221,6 +221,17 @@ static void process_input(struct input_ctx *input_ctx, bool timeout)
if (!match) { // normal or unknown key if (!match) { // normal or unknown key
int mods = 0; int mods = 0;
if (buf.b[0] == '\033') { if (buf.b[0] == '\033') {
if (buf.len > 1 && buf.b[1] == '[') {
// unknown CSI sequence. wait till it completes
for (int i = 2; i < buf.len; i++) {
if (buf.b[i] >= 0x40 && buf.b[i] <= 0x7E) {
skip_buf(&buf, i+1);
continue; // complete - throw it away
}
}
goto read_more; // not yet complete
}
// non-CSI esc sequence
skip_buf(&buf, 1); skip_buf(&buf, 1);
if (buf.len > 0 && buf.b[0] > 0 && buf.b[0] < 127) { if (buf.len > 0 && buf.b[0] > 0 && buf.b[0] < 127) {
// meta+normal key // meta+normal key