From e8963bd757bce1a58d5c5b081f53a873857d25df Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 11 Jul 2014 16:58:02 +0300 Subject: [PATCH] Implement echo suppression in non-interactive mode for MS-Windows. src/minibuf.c (read_minibuf_noninteractive): Finish reading on '\r', not only on '\n'. src/sysdep.c (emacs_get_tty, emacs_set_tty, suppress_echo_on_tty) [DOS_NT]: Implement for WINDOWSNT. src/systty.h (struct emacs_tty) [DOS_NT]: The struct member is now unsigned. Fixes: debbugs:17839 --- src/ChangeLog | 11 +++++++++++ src/minibuf.c | 4 ++-- src/sysdep.c | 37 +++++++++++++++++++++++++++++++++---- src/systty.h | 2 +- 4 files changed, 47 insertions(+), 7 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index a5debc00acf..a016f3cadc2 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,14 @@ +2014-07-11 Eli Zaretskii + + * minibuf.c (read_minibuf_noninteractive): Finish reading on '\r', + not only on '\n'. + + * sysdep.c (emacs_get_tty, emacs_set_tty, suppress_echo_on_tty) + [DOS_NT]: Implement for WINDOWSNT. + + * systty.h (struct emacs_tty) [DOS_NT]: The struct member is now + unsigned. + 2014-07-11 Michael Albinus * sysdep.c (suppress_echo_on_tty): New function. diff --git a/src/minibuf.c b/src/minibuf.c index 44d319c5e67..c77f5955d86 100644 --- a/src/minibuf.c +++ b/src/minibuf.c @@ -251,7 +251,7 @@ read_minibuf_noninteractive (Lisp_Object map, Lisp_Object initial, len = 0; line = xmalloc (size); - while ((c = getchar ()) != '\n') + while ((c = getchar ()) != '\n' && c != '\r') { if (c == EOF) { @@ -280,7 +280,7 @@ read_minibuf_noninteractive (Lisp_Object map, Lisp_Object initial, emacs_set_tty (fileno (stdin), &etty, 0); } - if (len || c == '\n') + if (len || c == '\n' || c == '\r') { val = make_string (line, len); xfree (line); diff --git a/src/sysdep.c b/src/sysdep.c index 46078807b43..c5b3c43ea6d 100644 --- a/src/sysdep.c +++ b/src/sysdep.c @@ -783,9 +783,20 @@ void emacs_get_tty (int fd, struct emacs_tty *settings) { /* Retrieve the primary parameters - baud rate, character size, etcetera. */ -#ifndef DOS_NT - /* We have those nifty POSIX tcmumbleattr functions. */ memset (&settings->main, 0, sizeof (settings->main)); +#ifdef DOS_NT +#ifdef WINDOWSNT + HANDLE h = (HANDLE)_get_osfhandle (fd); + DWORD console_mode; + + if (h && h != INVALID_HANDLE_VALUE) + { + if (GetConsoleMode (h, &console_mode)) + settings->main = console_mode; + } +#endif /* WINDOWSNT */ +#else /* !DOS_NT */ + /* We have those nifty POSIX tcmumbleattr functions. */ tcgetattr (fd, &settings->main); #endif } @@ -799,7 +810,22 @@ int emacs_set_tty (int fd, struct emacs_tty *settings, bool flushp) { /* Set the primary parameters - baud rate, character size, etcetera. */ -#ifndef DOS_NT +#ifdef DOS_NT +#ifdef WINDOWSNT + HANDLE h = (HANDLE)_get_osfhandle (fd); + + if (h && h != INVALID_HANDLE_VALUE) + { + DWORD new_mode; + + /* Assume the handle is open for input. */ + if (flushp) + FlushConsoleInputBuffer (h); + new_mode = settings->main; + SetConsoleMode (h, new_mode); + } +#endif /* WINDOWSNT */ +#else /* !DOS_NT */ int i; /* We have those nifty POSIX tcmumbleattr functions. William J. Smith writes: @@ -1149,7 +1175,10 @@ suppress_echo_on_tty (int fd) struct emacs_tty etty; emacs_get_tty (fd, &etty); -#ifndef WINDOWSNT +#ifdef DOS_NT + /* Set raw input mode. */ + etty.main = 0; +#else etty.main.c_lflag &= ~ICANON; /* Disable buffering */ etty.main.c_lflag &= ~ECHO; /* Disable echoing */ #endif /* ! WINDOWSNT */ diff --git a/src/systty.h b/src/systty.h index 6eb0c11ef6e..dd4c07d32d9 100644 --- a/src/systty.h +++ b/src/systty.h @@ -74,7 +74,7 @@ struct emacs_tty { #ifndef DOS_NT struct termios main; #else /* DOS_NT */ - int main; + unsigned main; #endif /* DOS_NT */ }; -- 2.39.2