{
 #define ESCAPE_UDELAY 1000
 #define ESCAPE_DELAY (2*1000000/ESCAPE_UDELAY) /* 2 seconds worth of udelays */
-       char escape_data[5];    /* longest vt100 escape sequence is 4 bytes */
-       char *ped = escape_data;
+       char buf[4];    /* longest vt100 escape sequence is 4 bytes */
+       char *pbuf = buf;
        int escape_delay = 0;
-       get_char_func *f, *f_escape = NULL;
+       get_char_func *f, *f_prev = NULL;
        int key;
 
        for (f = &kdb_poll_funcs[0]; ; ++f) {
                        continue;
                }
 
-               if (escape_delay == 0 && key == '\e') {
+               /*
+                * When the first character is received (or we get a change
+                * input source) we set ourselves up to handle an escape
+                * sequences (just in case).
+                */
+               if (f_prev != f) {
+                       f_prev = f;
+                       pbuf = buf;
                        escape_delay = ESCAPE_DELAY;
-                       ped = escape_data;
-                       f_escape = f;
-               }
-               if (escape_delay) {
-                       if (f_escape != f)
-                               return '\e';
-
-                       *ped++ = key;
-                       key = kdb_handle_escape(escape_data, ped - escape_data);
-                       if (key < 0)
-                               return '\e';
-                       if (key == 0)
-                               continue;
                }
 
-               break;  /* A key to process */
+               *pbuf++ = key;
+               key = kdb_handle_escape(buf, pbuf - buf);
+               if (key < 0) /* no escape sequence; return first character */
+                       return buf[0];
+               if (key > 0)
+                       return key;
        }
-       return key;
+
+       unreachable();
 }
 
 /*