*** readline.c~ Thu Apr 22 17:04:13 2010 --- readline.c Fri Sep 10 23:41:34 2010 *************** readline_getc(FILE *input) *** 117,122 **** --- 117,150 ---- if (!readline_instream) return rl_getc(input); GetOpenFile(readline_instream, ifp); if (rl_instream != ifp->stdio_file) return rl_getc(input); + #if defined(_WIN32) + { + INPUT_RECORD ir; + int n; + static int prior_key = '0'; + for (;;) { + if (prior_key > 0xff) { + prior_key = rl_getc(ifp->stdio_file); + return prior_key; + } + if (PeekConsoleInput((HANDLE)_get_osfhandle(ifp->fd), &ir, 1, &n)) { + if (n == 1) { + if (ir.EventType == KEY_EVENT && ir.Event.KeyEvent.bKeyDown) { + prior_key = rl_getc(ifp->stdio_file); + return prior_key; + } else { + ReadConsoleInput((HANDLE)_get_osfhandle(ifp->fd), &ir, 1, &n); + } + } else { + HANDLE h = (HANDLE)_get_osfhandle(ifp->fd); + rb_w32_wait_events(&h, 1, INFINITE); + } + } else { + break; + } + } + } + #endif c = rb_funcall(readline_instream, id_getbyte, 0, 0); if (NIL_P(c)) return EOF; return NUM2CHR(c);