diff -urp elinks-0.12pre5.orig/src/terminal/kbd.c elinks-0.12pre5/src/terminal/kbd.c --- elinks-0.12pre5.orig/src/terminal/kbd.c 2009-07-07 14:23:17.000000000 +0200 +++ elinks-0.12pre5/src/terminal/kbd.c 2011-06-06 02:29:58.000000000 +0200 @@ -765,6 +765,11 @@ decode_terminal_escape_sequence(struct i int v; int el; + if (itrm->in.queue.len == 2 && itrm->in.queue.data[1] == ASCII_ESC) { + kbd.key = KBD_ESC; + set_kbd_interlink_event(ev, kbd.key, kbd.modifier); + return 2; + } if (itrm->in.queue.len < 3) return -1; if (itrm->in.queue.data[2] == '[') { @@ -1108,8 +1113,7 @@ process_queue(struct itrm *itrm) * beginning of e.g. ESC ESC 0x5B 0x41, * which we should parse as Esc Up. */ if (itrm->in.queue.len < 3) { - /* Need more data to figure it out. */ - el = -1; + el = decode_terminal_escape_sequence(itrm, &ev); } else if (itrm->in.queue.data[2] == 0x5B || itrm->in.queue.data[2] == 0x4F) { /* The first ESC appears to be followed