[PATCH]: Fix gdb's prompt for continue in TUI SingleKey mode

Stephane Carrez
2012-11-10T13:25:00Z

Hi!

When gdb is in TUI SingleKey mode, if a command calls 'prompt_for_continue',
the readline keymap is using the SingleKey tui keymap and this prevents the user
from typing any useful key (such as Return). Furthermore, typing some SingleKey
command (r, s, n, etc) will execute the command (results are strange).
You can reproduce easily by typing 'info' in SingleKey mode.

In this mode, if you type 'v' (info local), the gdb's prompt is not
displayed at all.

I've committed this patch to fix those issues.

Basically when we execute a gdb command, we must be in TUI_ONE_COMMAND_MODE
(or TUI_COMMAND_MODE). We must restore the TUI_SINGLE_KEY_MODE only
if we are not called from prompt_for_continue (I've used the check on
'immediate_quit'
for that).

Stephane

Index: ChangeLog
===================================================================
RCS file: /cvs/src/src/gdb/ChangeLog,v
retrieving revision 1.14811
diff -u -p -r1.14811 ChangeLog
--- ChangeLog 10 Nov 2012 12:25:02 -0000 1.14811
+++ ChangeLog 10 Nov 2012 13:11:24 -0000
@@ -1,5 +1,13 @@
2012-11-10 Stephane Carrez <Stephane.Carrez@gmail.com>

+ * tui/tui.c (tui_rl_command_key): Switch to TUI_ONE_COMMAND_MODE
+ while executing the gdb command.
+ (tui_rl_startup_hook): Do not switch back to TUI_SINGLE_KEY_MODE if we
+ are called from prompt_for_continue.
+ * tui/tui-io.c (tui_redisplay_readline): Likewise.
+
+2012-11-10 Stephane Carrez <Stephane.Carrez@gmail.com>
+
PR tui/9584

* tui/tui.c (tui_rl_command_key): Do not call execute_command
cvs diff: Diffing tui
Index: tui/tui-io.c
===================================================================
RCS file: /cvs/src/src/gdb/tui/tui-io.c,v
retrieving revision 1.32
diff -u -p -r1.32 tui-io.c
--- tui/tui-io.c 4 Jan 2012 08:27:58 -0000 1.32
+++ tui/tui-io.c 10 Nov 2012 13:11:24 -0000
@@ -211,8 +211,11 @@ tui_redisplay_readline (void)

/* Detect when we temporarily left SingleKey and now the readline
edit buffer is empty, automatically restore the SingleKey
- mode. */
- if (tui_current_key_mode == TUI_ONE_COMMAND_MODE && rl_end == 0)
+ mode. The restore must only be done if the command has finished.
+ The command could call prompt_for_continue and we must not
+ restore SingleKey so that the prompt and normal keymap are used. */
+ if (tui_current_key_mode == TUI_ONE_COMMAND_MODE && rl_end == 0
+ && immediate_quit == 0)
tui_set_key_mode (TUI_SINGLE_KEY_MODE);

if (tui_current_key_mode == TUI_SINGLE_KEY_MODE)
Index: tui/tui.c
===================================================================
RCS file: /cvs/src/src/gdb/tui/tui.c,v
retrieving revision 1.71
diff -u -p -r1.71 tui.c
--- tui/tui.c 10 Nov 2012 12:25:07 -0000 1.71
+++ tui/tui.c 10 Nov 2012 13:11:24 -0000
@@ -247,6 +247,10 @@ tui_rl_command_key (int count, int key)
in the readline history which turns out to be better. */
rl_insert_text (tui_commands[i].cmd);
rl_newline (1, '\n');
+
+ /* Switch to gdb command mode while executing the command.
+ This way the gdb's continue prompty will be displayed. */
+ tui_set_key_mode (TUI_ONE_COMMAND_MODE);
return 0;
}
}
@@ -285,7 +289,7 @@ static int
tui_rl_startup_hook (void)
{
rl_already_prompted = 1;
- if (tui_current_key_mode != TUI_COMMAND_MODE)
+ if (tui_current_key_mode != TUI_COMMAND_MODE && immediate_quit == 0)
tui_set_key_mode (TUI_SINGLE_KEY_MODE);
tui_redisplay_readline ();
return 0;