diff mbox

Call nonl before wgetch in TUI

Message ID 20180903212942.26324-1-tom@tromey.com
State New
Headers show

Commit Message

Tom Tromey Sept. 3, 2018, 9:29 p.m. UTC
PR tui/28819 points out that, in the TUI, the C-j and C-m keys cannot
be bound differently in one's ~/.inputrc.  However, this works in
other readline applications.

The bug is that the TUI uses curses' "nl" mode, which causes wgetch to
return the same value for both keys.  There is a "nonl" mode, but it
also affects output.

This patch fixes the bug by arranging to call nonl before reading a
key and then nl afterward.  This avoids any potential problem with
changing the output if gdb was to use nonl globally.

gdb/ChangeLog
2018-09-03  Tom Tromey  <tom@tromey.com>

	PR tui/28819:
	* tui/tui-io.c (gdb_wgetch): New function.
	(tui_mld_getc, tui_getc): Use it.
---
 gdb/ChangeLog    |  6 ++++++
 gdb/tui/tui-io.c | 21 ++++++++++++++++++---
 2 files changed, 24 insertions(+), 3 deletions(-)

Comments

Tom Tromey Oct. 6, 2018, 9:52 p.m. UTC | #1
>>>>> "Tom" == Tom Tromey <tom@tromey.com> writes:

Tom> gdb/ChangeLog
Tom> 2018-09-03  Tom Tromey  <tom@tromey.com>

Tom> 	PR tui/28819:
Tom> 	* tui/tui-io.c (gdb_wgetch): New function.
Tom> 	(tui_mld_getc, tui_getc): Use it.

I'm checking this in now.

Tom
diff mbox

Patch

diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index c7df50a4f24..44761514099 100644
--- a/gdb/tui/tui-io.c
+++ b/gdb/tui/tui-io.c
@@ -412,6 +412,21 @@  tui_mld_beep (const struct match_list_displayer *displayer)
   beep ();
 }
 
+/* A wrapper for wgetch that enters nonl mode.  We We normally want
+  curses' "nl" mode, but when reading from the user, we'd like to
+  differentiate between C-j and C-m, because some users bind these
+  keys differently in their .inputrc.  So, put curses into nonl mode
+  just when reading from the user.  See PR tui/20819.  */
+
+static int
+gdb_wgetch (WINDOW *win)
+{
+  nonl ();
+  int r = wgetch (win);
+  nl ();
+  return r;
+}
+
 /* Helper function for tui_mld_read_key.
    This temporarily replaces tui_getc for use during tab-completion
    match list display.  */
@@ -420,7 +435,7 @@  static int
 tui_mld_getc (FILE *fp)
 {
   WINDOW *w = TUI_CMD_WIN->generic.handle;
-  int c = wgetch (w);
+  int c = gdb_wgetch (w);
 
   return c;
 }
@@ -612,7 +627,7 @@  tui_getc (FILE *fp)
   tui_readline_output (0, 0);
 #endif
 
-  ch = wgetch (w);
+  ch = gdb_wgetch (w);
 
   /* The \n must be echoed because it will not be printed by
      readline.  */
@@ -659,7 +674,7 @@  tui_getc (FILE *fp)
       int ch_pending;
 
       nodelay (w, TRUE);
-      ch_pending = wgetch (w);
+      ch_pending = gdb_wgetch (w);
       nodelay (w, FALSE);
 
       /* If we have pending input following a start sequence, call the stdin