Sync OpenBSD patchset 1094:

Handle partial keys properly by making sure the timer has actually
expired, fixes problems with mintty reported by Michael Simpson.
This commit is contained in:
Tiago Cunha 2012-04-24 16:17:57 +00:00
parent e65c5ad56c
commit bdfbb52951

View File

@ -476,7 +476,6 @@ tty_keys_next(struct tty *tty)
goto partial_key; goto partial_key;
} }
/* Is this a mouse key press? */ /* Is this a mouse key press? */
switch (tty_keys_mouse(tty, buf, len, &size, &mouse)) { switch (tty_keys_mouse(tty, buf, len, &size, &mouse)) {
case 0: /* yes */ case 0: /* yes */
@ -532,10 +531,11 @@ tty_keys_next(struct tty *tty)
partial_key: partial_key:
/* /*
* Escape but no key string. If have already seen an escape, then the * Escape but no key string. If have already seen an escape and the
* timer must have expired, so give up waiting and send the escape. * timer has expired, give up waiting and send the escape.
*/ */
if (tty->flags & TTY_ESCAPE) { if ((tty->flags & TTY_ESCAPE) &&
!evtimer_pending(&tty->key_timer, NULL)) {
evbuffer_drain(tty->event->input, 1); evbuffer_drain(tty->event->input, 1);
key = '\033'; key = '\033';
goto handle_key; goto handle_key;
@ -544,6 +544,10 @@ partial_key:
/* Fall through to start the timer. */ /* Fall through to start the timer. */
start_timer: start_timer:
/* If already waiting for timer, do nothing. */
if (evtimer_pending(&tty->key_timer, NULL))
return (0);
/* Start the timer and wait for expiry or more data. */ /* Start the timer and wait for expiry or more data. */
delay = options_get_number(&global_options, "escape-time"); delay = options_get_number(&global_options, "escape-time");
tv.tv_sec = delay / 1000; tv.tv_sec = delay / 1000;