From: Mark Mitchell Date: Mon, 25 Jul 2005 15:09:31 +0000 (+0000) Subject: * input.c (rl_getc): Use getch to read console input on X-Git-Url: http://git.efficios.com/?a=commitdiff_plain;h=fd8be987f8334e9530be6ca571c54695892aa871;p=deliverable%2Fbinutils-gdb.git * 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. --- diff --git a/readline/ChangeLog.gdb b/readline/ChangeLog.gdb index 62fa1b6613..cdf268648a 100644 --- a/readline/ChangeLog.gdb +++ b/readline/ChangeLog.gdb @@ -1,3 +1,12 @@ +2005-07-25 Mark Mitchell + + * 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 From Martin Simmons: diff --git a/readline/input.c b/readline/input.c index 841f05d1af..9120dfa8a8 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 aed0235bf3..07fb58fd21 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 4a28bd1e49..b80db8cffe 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 ad17904347..2ccb9d1a56 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 () {