From e49f890906507b49ac81328e1e7b68d2fea59226 Mon Sep 17 00:00:00 2001 From: kouji Date: Tue, 21 Jun 2011 04:30:14 +0000 Subject: * ext/readline/readline.c (readline_getc): applied a patch in #3827 by by Akio Tajima . (see #3827) git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32181 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/readline/readline.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'ext/readline') 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); -- cgit v1.2.3