diff options
Diffstat (limited to 'ext/readline')
-rw-r--r-- | ext/readline/readline.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/ext/readline/readline.c b/ext/readline/readline.c index c08d88b4f3..65c0c412d0 100644 --- a/ext/readline/readline.c +++ b/ext/readline/readline.c @@ -131,6 +131,34 @@ readline_getc(FILE *input) 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); |