mirror of https://github.com/mpv-player/mpv
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:
parent
007c728ad2
commit
21d434d2db
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue