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.
This commit is contained in:
parent
e04caa7090
commit
7a9569281a
|
@ -1,3 +1,9 @@
|
||||||
|
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.
|
||||||
|
|
||||||
2018-10-05 Tom Tromey <tom@tromey.com>
|
2018-10-05 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
* sol-thread.c (sol_thread_target::wait): Rename inner
|
* sol-thread.c (sol_thread_target::wait): Rename inner
|
||||||
|
|
|
@ -412,6 +412,21 @@ tui_mld_beep (const struct match_list_displayer *displayer)
|
||||||
beep ();
|
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.
|
/* Helper function for tui_mld_read_key.
|
||||||
This temporarily replaces tui_getc for use during tab-completion
|
This temporarily replaces tui_getc for use during tab-completion
|
||||||
match list display. */
|
match list display. */
|
||||||
|
@ -420,7 +435,7 @@ static int
|
||||||
tui_mld_getc (FILE *fp)
|
tui_mld_getc (FILE *fp)
|
||||||
{
|
{
|
||||||
WINDOW *w = TUI_CMD_WIN->generic.handle;
|
WINDOW *w = TUI_CMD_WIN->generic.handle;
|
||||||
int c = wgetch (w);
|
int c = gdb_wgetch (w);
|
||||||
|
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
@ -612,7 +627,7 @@ tui_getc (FILE *fp)
|
||||||
tui_readline_output (0, 0);
|
tui_readline_output (0, 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ch = wgetch (w);
|
ch = gdb_wgetch (w);
|
||||||
|
|
||||||
/* The \n must be echoed because it will not be printed by
|
/* The \n must be echoed because it will not be printed by
|
||||||
readline. */
|
readline. */
|
||||||
|
@ -659,7 +674,7 @@ tui_getc (FILE *fp)
|
||||||
int ch_pending;
|
int ch_pending;
|
||||||
|
|
||||||
nodelay (w, TRUE);
|
nodelay (w, TRUE);
|
||||||
ch_pending = wgetch (w);
|
ch_pending = gdb_wgetch (w);
|
||||||
nodelay (w, FALSE);
|
nodelay (w, FALSE);
|
||||||
|
|
||||||
/* If we have pending input following a start sequence, call the stdin
|
/* If we have pending input following a start sequence, call the stdin
|
||||||
|
|
Loading…
Reference in New Issue