aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--ext/readline/readline.c28
2 files changed, 33 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index ebf1e7d6ae..e0b61df2bb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Tue Jun 21 13:25:35 2011 TAKAO Kouji <kouji@takao7.net>
+
+ * ext/readline/readline.c (readline_getc): applied a patch in
+ #3827 by by Akio Tajima <artonx AT yahoo.co.jp>. (see #3827)
+
Tue Jun 21 13:16:31 2011 TAKAO Kouji <kouji@takao7.net>
* ext/readline/extconf.rb: fixed bug, specify --disable-libedit
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);