aboutsummaryrefslogtreecommitdiff
path: root/gdb/target-delegates.c
diff options
context:
space:
mode:
authorPatrick Palka <patrick@parcs.ath.cx>2014-08-25 10:40:32 -0400
committerSergio Durigan Junior <sergiodj@redhat.com>2014-08-27 12:49:54 -0400
commit3278a9f568b197cd754dd056b36803e5bd00872f (patch)
treee7fb1e512052bb233bcbd130895f3996da77c7d8 /gdb/target-delegates.c
parentee92b0dd4e4abc5063f689a084c27ee7d5b08942 (diff)
downloadgdb-3278a9f568b197cd754dd056b36803e5bd00872f.zip
gdb-3278a9f568b197cd754dd056b36803e5bd00872f.tar.gz
gdb-3278a9f568b197cd754dd056b36803e5bd00872f.tar.bz2
Fix terminal state corruption when starting a program from within TUI
The TUI terminal state becomes corrupted (e.g. key sequences such as Alt_F and Alt_B no longer work) when one attaches to an inferior process (via "run" or "attach") from within TUI. This terminal corruption remains until you switch out of TUI mode. This happens because the terminal state is not properly saved when switching to and out from TUI mode. Although the functions tui_enable() and tui_disable() both call the function target_terminal_save_ours() to save the terminal state, this function is a no-op unless GDB has already attached to an inferior process. This is because only the "native" target has a useful implementation of target_terminal_save_ours() (namely child_terminal_save_ours()) and we only have the "native" target in our target vector if GDB has already attached to an inferior process. So without an inferior process, switching to and from TUI mode does not actually save the terminal state. Therefore when you attach to an inferior process from within TUI mode, the proper terminal state is not restored (after swapping from the inferior's terminal back to the GDB terminal). To fix this we just have to ensure that the terminal state is always being properly saved when switching from and to TUI mode. To achieve this, this patch removes the polymorphic function target_terminal_save_ours() and replaces it with a regular function gdb_save_tty_state() that always saves the terminal state. Tested on x86_64-unknown-linux-gnu by running "make check", no new regressions. gdb/ChangeLog: * target.h (struct target_ops::to_terminal_save_ours): Remove declaration. (target_terminal_save_ours): Remove macro. * target-delegates.c: Regenerate. * inf-child.c (inf_child_target): Don't set the nonexistent field to_terminal_save_ours. * inferior.h (child_terminal_save_ours): Remove declaration. * terminal.h (gdb_save_tty_state): New declaration. * inflow.c (child_terminal_save_ours): Rename to ... (gdb_save_tty_state): ... this. * tui/tui.c: Include terminal.h. (tui_enable): Use gdb_save_tty_state instead of target_terminal_save_ours. (tui_disable): Likewise.
Diffstat (limited to 'gdb/target-delegates.c')
-rw-r--r--gdb/target-delegates.c26
1 files changed, 0 insertions, 26 deletions
diff --git a/gdb/target-delegates.c b/gdb/target-delegates.c
index 843a954..fe989ff 100644
--- a/gdb/target-delegates.c
+++ b/gdb/target-delegates.c
@@ -813,28 +813,6 @@ debug_terminal_ours (struct target_ops *self)
}
static void
-delegate_terminal_save_ours (struct target_ops *self)
-{
- self = self->beneath;
- self->to_terminal_save_ours (self);
-}
-
-static void
-tdefault_terminal_save_ours (struct target_ops *self)
-{
-}
-
-static void
-debug_terminal_save_ours (struct target_ops *self)
-{
- fprintf_unfiltered (gdb_stdlog, "-> %s->to_terminal_save_ours (...)\n", debug_target.to_shortname);
- debug_target.to_terminal_save_ours (&debug_target);
- fprintf_unfiltered (gdb_stdlog, "<- %s->to_terminal_save_ours (", debug_target.to_shortname);
- target_debug_print_struct_target_ops_p (&debug_target);
- fputs_unfiltered (")\n", gdb_stdlog);
-}
-
-static void
delegate_terminal_info (struct target_ops *self, const char *arg1, int arg2)
{
self = self->beneath;
@@ -3814,8 +3792,6 @@ install_delegators (struct target_ops *ops)
ops->to_terminal_ours_for_output = delegate_terminal_ours_for_output;
if (ops->to_terminal_ours == NULL)
ops->to_terminal_ours = delegate_terminal_ours;
- if (ops->to_terminal_save_ours == NULL)
- ops->to_terminal_save_ours = delegate_terminal_save_ours;
if (ops->to_terminal_info == NULL)
ops->to_terminal_info = delegate_terminal_info;
if (ops->to_kill == NULL)
@@ -4068,7 +4044,6 @@ install_dummy_methods (struct target_ops *ops)
ops->to_terminal_inferior = tdefault_terminal_inferior;
ops->to_terminal_ours_for_output = tdefault_terminal_ours_for_output;
ops->to_terminal_ours = tdefault_terminal_ours;
- ops->to_terminal_save_ours = tdefault_terminal_save_ours;
ops->to_terminal_info = default_terminal_info;
ops->to_kill = tdefault_kill;
ops->to_load = tdefault_load;
@@ -4212,7 +4187,6 @@ init_debug_target (struct target_ops *ops)
ops->to_terminal_inferior = debug_terminal_inferior;
ops->to_terminal_ours_for_output = debug_terminal_ours_for_output;
ops->to_terminal_ours = debug_terminal_ours;
- ops->to_terminal_save_ours = debug_terminal_save_ours;
ops->to_terminal_info = debug_terminal_info;
ops->to_kill = debug_kill;
ops->to_load = debug_load;