Fix keys parsing again to correctly accept Unicode when not prefixed

with Escape.
pull/390/head
nicm 2016-04-29 10:42:16 +00:00
parent 7abdfbe20e
commit 97417a1813
1 changed files with 25 additions and 35 deletions

View File

@ -554,13 +554,6 @@ tty_keys_next(struct tty *tty)
first_key: first_key:
/* Handle keys starting with escape. */ /* Handle keys starting with escape. */
if (*buf == '\033') { if (*buf == '\033') {
/* A single escape goes as-is if the timer has expired. */
if (expired && len == 1) {
key = '\033';
size = 1;
goto complete_key;
}
/* Look for a key without the escape. */ /* Look for a key without the escape. */
n = tty_keys_next1(tty, buf + 1, len - 1, &key, &size, expired); n = tty_keys_next1(tty, buf + 1, len - 1, &key, &size, expired);
if (n == 0) { /* found */ if (n == 0) { /* found */
@ -570,8 +563,9 @@ first_key:
} }
if (n == 1) /* partial */ if (n == 1) /* partial */
goto partial_key; goto partial_key;
}
/* Try with the escape. */ /* Try to lookup key. */
n = tty_keys_next1(tty, buf, len, &key, &size, expired); n = tty_keys_next1(tty, buf, len, &key, &size, expired);
if (n == 0) /* found */ if (n == 0) /* found */
goto complete_key; goto complete_key;
@ -580,26 +574,22 @@ first_key:
/* Is this an an xterm(1) key? */ /* Is this an an xterm(1) key? */
n = xterm_keys_find(buf, len, &size, &key); n = xterm_keys_find(buf, len, &size, &key);
if (n == 0) /* found */ if (n == 0)
goto complete_key; goto complete_key;
if (n == 1 && !expired) if (n == 1 && !expired)
goto partial_key; goto partial_key;
/* /*
* If this is at least two keys, then it must be complete - * At this point, we know the key is not partial (with or without
* whether or not the timer has expired - otherwise * escape). So pass it through even if the timer has not expired.
* tty_keys_next1 would have returned a partial.
*/ */
if (len >= 2) { if (*buf == '\033' && len >= 2) {
key = (u_char)buf[1] | KEYC_ESCAPE; key = (u_char)buf[1] | KEYC_ESCAPE;
size = 2; size = 2;
goto complete_key; } else {
} key = (u_char)buf[0];
}
/* No longer key found, use the first character. */
key = (u_char)*buf;
size = 1; size = 1;
}
goto complete_key; goto complete_key;
partial_key: partial_key: