This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Make sure terminal settings are restored before exiting


When exiting GDB -- whether it's via the "quit" command, via a SIGTERM,
or otherwise -- we should leave the terminal in the state we acquired
it.  To that end, we have to undo any modifications that may have been
made by the TUI (ncurses) or by the CLI (readline).

[ Note that we already take a snapshot of the original tty state and save
  it to inflow.c:initial_gdb_ttystate.  Using this variable we can
  define a new function restore_initial_gdb_ttystate and use it here.
  We can replace the call to rl_deprep_terminal with such a function,
  though it wouldn't hurt to have both around either.  Is this a good
  idea?

  As far as testing goes, I am having trouble figuring out how to
  retrieve the pid of the GDB subprocess in order to kill it via SIGTERM
  with the subshell/stty approach used in
  batch-preserve-term-settings.exp.  Seems non-trivial.  Any ideas?  ]

gdb/ChangeLog:

	* top.c (quit_force): Undo any modifications that may have been
	made the terminal by calling target_terminal_ours, then
	tui_disable, then rl_deprep_terminal.
---
 gdb/top.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/gdb/top.c b/gdb/top.c
index 1e30b1c..55f82ae 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -66,6 +66,7 @@
 #include "cli-out.h"
 #include "tracepoint.h"
 #include "inf-loop.h"
+#include "tui/tui.h"
 
 extern void initialize_all_files (void);
 
@@ -1494,6 +1495,14 @@ quit_force (char *args, int from_tty)
   int exit_code = 0;
   struct qt_args qt;
 
+  /* Make sure that the terminal is left in the state we acquired it.  */
+  target_terminal_ours ();
+#if defined(TUI)
+  tui_disable ();
+#endif
+  if (async_command_editing_p)
+    rl_deprep_terminal ();
+
   /* An optional expression may be used to cause gdb to terminate with the 
      value of that expression.  */
   if (args)
-- 
2.5.0.rc2.22.g69b1679.dirty


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]