commit ecc9211afc2bdf6e240cedc1c23f55a537be17d9
parent ab0897072a237121105d924b56a3051790de55bc
Author: Benno Schulenberg <bensberg@telfort.nl>
Date: Thu, 28 Jun 2018 11:52:17 +0200
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.
Diffstat:
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/src/winio.c b/src/winio.c
@@ -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