aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--readline/ChangeLog.gdb9
-rw-r--r--readline/input.c7
-rw-r--r--readline/readline.c16
-rw-r--r--readline/rldefs.h4
-rw-r--r--readline/rltty.c35
5 files changed, 68 insertions, 3 deletions
diff --git a/readline/ChangeLog.gdb b/readline/ChangeLog.gdb
index 62fa1b6..cdf2686 100644
--- a/readline/ChangeLog.gdb
+++ b/readline/ChangeLog.gdb
@@ -1,3 +1,12 @@
+2005-07-25 Mark Mitchell <mark@codesourcery.com>
+
+ * input.c (rl_getc): Use getch to read console input on
+ Windows.
+ * readline.c (bind_arrow_keys_internal): Translate
+ Windows keysequences into POSIX key sequences.
+ * rldefs.h (NO_TTY_DRIVER): Define on MinGW.
+ * rltty.c: Conditionalize on NO_TTY_DRIVER throughout.
+
2005-07-03 Mark Kettenis <kettenis@gnu.org>
From Martin Simmons:
diff --git a/readline/input.c b/readline/input.c
index 841f05d..9120dfa 100644
--- a/readline/input.c
+++ b/readline/input.c
@@ -424,6 +424,13 @@ rl_getc (stream)
while (1)
{
+#ifdef __MINGW32__
+ /* On Windows, use a special routine to read a single character
+ from the console. (Otherwise, no characters are available
+ until the user hits the return key.) */
+ if (isatty (fileno (stream)))
+ return getch ();
+#endif
result = read (fileno (stream), &c, sizeof (unsigned char));
if (result == sizeof (unsigned char))
diff --git a/readline/readline.c b/readline/readline.c
index aed0235..07fb58f 100644
--- a/readline/readline.c
+++ b/readline/readline.c
@@ -868,6 +868,22 @@ bind_arrow_keys_internal (map)
_rl_bind_if_unbound ("\033[0D", rl_get_next_history);
#endif
+#ifdef __MINGW32__
+ /* Under Windows, when an extend key (like an arrow key) is
+ pressed, getch() will return 340 (octal) followed by a code for
+ the extended key. We use macros to transform those into the
+ normal ANSI terminal sequences for these keys. */
+
+ /* Up arrow. */
+ rl_macro_bind ("\340H", "\033[A", map);
+ /* Left arrow. */
+ rl_macro_bind ("\340K", "\033[D", map);
+ /* Right arrow. */
+ rl_macro_bind ("\340M", "\033[C", map);
+ /* Down arrow. */
+ rl_macro_bind ("\340P", "\033[B", map);
+#endif
+
_rl_bind_if_unbound ("\033[A", rl_get_previous_history);
_rl_bind_if_unbound ("\033[B", rl_get_next_history);
_rl_bind_if_unbound ("\033[C", rl_forward_char);
diff --git a/readline/rldefs.h b/readline/rldefs.h
index 4a28bd1..b80db8c 100644
--- a/readline/rldefs.h
+++ b/readline/rldefs.h
@@ -32,7 +32,9 @@
#include "rlstdc.h"
-#if defined (_POSIX_VERSION) && !defined (TERMIOS_MISSING)
+#if defined (__MINGW32__)
+# define NO_TTY_DRIVER
+#elif defined (_POSIX_VERSION) && !defined (TERMIOS_MISSING)
# define TERMIOS_TTY_DRIVER
#else
# if defined (HAVE_TERMIO_H)
diff --git a/readline/rltty.c b/readline/rltty.c
index ad17904..2ccb9d1 100644
--- a/readline/rltty.c
+++ b/readline/rltty.c
@@ -152,7 +152,9 @@ set_winsize (tty)
#endif /* TIOCGWINSZ */
}
-#if defined (NEW_TTY_DRIVER)
+#if defined (NO_TTY_DRIVER)
+/* Nothing */
+#elif defined (NEW_TTY_DRIVER)
/* Values for the `flags' field of a struct bsdtty. This tells which
elements of the struct bsdtty have been fetched from the system and
@@ -632,6 +634,22 @@ prepare_terminal_settings (meta_flag, oldtio, tiop)
}
#endif /* NEW_TTY_DRIVER */
+/* Put the terminal in CBREAK mode so that we can detect key
+ presses. */
+#if defined (NO_TTY_DRIVER)
+void
+rl_prep_terminal (meta_flag)
+ int meta_flag;
+{
+ readline_echoing_p = 1;
+}
+
+void
+rl_deprep_terminal ()
+{
+}
+
+#else /* ! NO_TTY_DRIVER */
/* Put the terminal in CBREAK mode so that we can detect key presses. */
void
rl_prep_terminal (meta_flag)
@@ -706,6 +724,7 @@ rl_deprep_terminal ()
release_sigint ();
}
+#endif /* !NO_TTY_DRIVER */
/* **************************************************************** */
/* */
@@ -717,6 +736,10 @@ int
rl_restart_output (count, key)
int count, key;
{
+#if defined (__MINGW32__)
+ return 0;
+#else /* !__MING32__ */
+
int fildes = fileno (rl_outstream);
#if defined (TIOCSTART)
#if defined (apollo)
@@ -744,12 +767,17 @@ rl_restart_output (count, key)
#endif /* !TIOCSTART */
return 0;
+#endif /* !__MINGW32__ */
}
int
rl_stop_output (count, key)
int count, key;
{
+#if defined (__MINGW32__)
+ return 0;
+#else
+
int fildes = fileno (rl_instream);
#if defined (TIOCSTOP)
@@ -772,6 +800,7 @@ rl_stop_output (count, key)
#endif /* !TIOCSTOP */
return 0;
+#endif /* !__MINGW32__ */
}
/* **************************************************************** */
@@ -786,6 +815,7 @@ void
rltty_set_default_bindings (kmap)
Keymap kmap;
{
+#if !defined (NO_TTY_DRIVER)
TIOTYPE ttybuff;
int tty = fileno (rl_instream);
@@ -844,6 +874,7 @@ rltty_set_default_bindings (kmap)
# endif /* VWERASE && TERMIOS_TTY_DRIVER */
}
#endif /* !NEW_TTY_DRIVER */
+#endif
}
/* New public way to set the system default editing chars to their readline
@@ -857,7 +888,7 @@ rl_tty_set_default_bindings (kmap)
#if defined (HANDLE_SIGNALS)
-#if defined (NEW_TTY_DRIVER)
+#if defined (NEW_TTY_DRIVER) || defined (NO_TTY_DRIVER)
int
_rl_disable_tty_signals ()
{