input: ignore any <Escape>s before a valid command keystroke

Just like an <Esc> before a Ctrl+letter keystroke is ignored, an <Esc>
before an Alt+letter keystroke should be ignored too -- it should not
be interpreted as if the user had typed <Esc> <Esc> letter.

This fixes https://savannah.gnu.org/bugs/?54301.
This commit is contained in:
Benno Schulenberg 2018-06-28 11:52:17 +02:00
parent ab0897072a
commit ecc9211afc

View File

@ -385,7 +385,7 @@ int parse_kbinput(WINDOW *win)
if (escapes > 3)
escapes = 1;
/* Take note when an Esc arrived by itself. */
solitary = (escapes == 1 && key_buffer_len == 0);
solitary = (key_buffer_len == 0);
return ERR;
}
@ -476,12 +476,13 @@ int parse_kbinput(WINDOW *win)
}
} else {
if (digit_count == 0)
/* Two escapes followed by a non-decimal
* digit (or a decimal digit that would
* create a byte sequence greater than 2XX)
* and there aren't any other codes waiting:
* control character sequence mode. */
retval = get_control_kbinput(keycode);
/* Two escapes followed by a non-digit: meta key
* or control character sequence mode. */
if (!solitary) {
meta_key = TRUE;
retval = keycode;
} else
retval = get_control_kbinput(keycode);
else {
/* An invalid digit in the middle of a byte
* sequence: reset the byte sequence counter
@ -505,11 +506,13 @@ int parse_kbinput(WINDOW *win)
}
break;
case 3:
if (key_buffer_len == 0)
if (key_buffer_len == 0) {
if (!solitary)
meta_key = TRUE;
/* Three escapes followed by a non-escape, and no
* other codes are waiting: normal input mode. */
retval = keycode;
else
} else
/* Three escapes followed by a non-escape, and more
* codes are waiting: combined control character and
* escape sequence mode. First interpret the escape