diff options
author | Tom Tromey <tom@tromey.com> | 2018-09-03 15:23:48 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2018-10-06 15:51:37 -0600 |
commit | 7a9569281a63e472750e3b7b481e2cdf5c931ed8 (patch) | |
tree | 24ee6e5c881e52c52de13a530b0ce65b80447b06 /gdb/tui/tui-io.c | |
parent | e04caa70901ed44eb9537ccdbd286fe9b0a46ce2 (diff) | |
download | gdb-7a9569281a63e472750e3b7b481e2cdf5c931ed8.zip gdb-7a9569281a63e472750e3b7b481e2cdf5c931ed8.tar.gz gdb-7a9569281a63e472750e3b7b481e2cdf5c931ed8.tar.bz2 |
Call nonl before wgetch in TUI
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-10-06 Tom Tromey <tom@tromey.com>
PR tui/28819:
* tui/tui-io.c (gdb_wgetch): New function.
(tui_mld_getc, tui_getc): Use it.
Diffstat (limited to 'gdb/tui/tui-io.c')
-rw-r--r-- | gdb/tui/tui-io.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c index c7df50a..4476151 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 |