]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Fix PR gdb/393:
authorStephane Carrez <stcarrez@nerim.fr>
Mon, 26 Aug 2002 19:18:33 +0000 (19:18 +0000)
committerStephane Carrez <stcarrez@nerim.fr>
Mon, 26 Aug 2002 19:18:33 +0000 (19:18 +0000)
* inflow.c (terminal_save_ours): New function to save terminal
settings.
* inferior.h (terminal_save_ours): Declare.
* target.c (debug_to_terminal_save_ours): New function.
(cleanup_target): Defaults to_terminal_save_ours.
(update_current_target): Inherit to_terminal_save_ours.
(setup_target_debug): Set to_terminal_save_ours.
* target.h (target_terminal_save_ours): New to save terminal settings.
(target_ops): New member to_terminal_save_ours.
* gnu-nat.c (init_gnu_ops): Set to_terminal_save_ours.
* hpux-thread.c (init_hpux_thread_ops): Likewise.
* inftarg.c (init_child_ops): Likewise.
* m3-nat.c (init_m3_ops): Likewise.
* procfs.c (init_procfs_ops): Likewise.
* wince.c (init_child_ops): Likewise.
* win32-nat.c (init_child_ops): Likewise.
* sol-thread.c (init_sol_thread_ops): Likewise.

14 files changed:
gdb/ChangeLog
gdb/gnu-nat.c
gdb/hpux-thread.c
gdb/inferior.h
gdb/inflow.c
gdb/inftarg.c
gdb/m3-nat.c
gdb/procfs.c
gdb/sol-thread.c
gdb/target.c
gdb/target.h
gdb/win32-nat.c
gdb/wince.c
gdb/windows-nat.c

index 59b2abd6dcb2319882cd612a4359d90419d0ce60..550b6bbdb3849d29b28f69ec183fed84ab9e2a11 100644 (file)
@@ -1,3 +1,24 @@
+2002-08-26  Stephane Carrez  <stcarrez@nerim.fr>
+
+       Fix PR gdb/393:
+       * inflow.c (terminal_save_ours): New function to save terminal
+       settings.
+       * inferior.h (terminal_save_ours): Declare.
+       * target.c (debug_to_terminal_save_ours): New function.
+       (cleanup_target): Defaults to_terminal_save_ours.
+       (update_current_target): Inherit to_terminal_save_ours.
+       (setup_target_debug): Set to_terminal_save_ours.
+       * target.h (target_terminal_save_ours): New to save terminal settings.
+       (target_ops): New member to_terminal_save_ours.
+       * gnu-nat.c (init_gnu_ops): Set to_terminal_save_ours.
+       * hpux-thread.c (init_hpux_thread_ops): Likewise.
+       * inftarg.c (init_child_ops): Likewise.
+       * m3-nat.c (init_m3_ops): Likewise.
+       * procfs.c (init_procfs_ops): Likewise.
+       * wince.c (init_child_ops): Likewise.
+       * win32-nat.c (init_child_ops): Likewise.
+       * sol-thread.c (init_sol_thread_ops): Likewise.
+
 2002-08-26  Mark Kettenis  <kettenis@gnu.org>
 
        * i386-tdep.c (i386_store_return_value): Undeprecate.  Convert to
index a4b8020a04c43eff630d2ed122457101f85168cd..59aad5dd7f328e25bcaf6b9fcfb154963a0e1990 100644 (file)
@@ -2612,6 +2612,7 @@ init_gnu_ops (void)
   gnu_ops.to_terminal_init = gnu_terminal_init_inferior;
   gnu_ops.to_terminal_inferior = terminal_inferior;
   gnu_ops.to_terminal_ours_for_output = terminal_ours_for_output;
+  gnu_ops.to_terminal_save_ours = terminal_save_ours;
   gnu_ops.to_terminal_ours = terminal_ours;
   gnu_ops.to_terminal_info = child_terminal_info;
   gnu_ops.to_kill = gnu_kill_inferior; /* to_kill */
index eec18ffffa5de3fc6d2b9e1faf125d6d2d666ccd..981bb9d5feba855f01eb7e461f9ab8c3ab1ce8ad 100644 (file)
@@ -554,6 +554,7 @@ init_hpux_thread_ops (void)
   hpux_thread_ops.to_terminal_init = terminal_init_inferior;
   hpux_thread_ops.to_terminal_inferior = terminal_inferior;
   hpux_thread_ops.to_terminal_ours_for_output = terminal_ours_for_output;
+  hpux_thread_ops.to_terminal_save_ours = terminal_save_ours;
   hpux_thread_ops.to_terminal_ours = terminal_ours;
   hpux_thread_ops.to_terminal_info = child_terminal_info;
   hpux_thread_ops.to_kill = hpux_thread_kill_inferior;
index e875e9cc1865853be2518b52b56c5dc8f086e3a5..8035ccd98251b220a398b376e383ca66863fed39 100644 (file)
@@ -152,6 +152,8 @@ extern void kill_inferior (void);
 
 extern void generic_mourn_inferior (void);
 
+extern void terminal_save_ours (void);
+
 extern void terminal_ours (void);
 
 extern int run_stack_dummy (CORE_ADDR , struct regcache *);
index 526acdfdc7e20423adea999655d5374daf360698..b37fc541c9181deb089546079684a2b6c3e2c6db 100644 (file)
@@ -200,6 +200,23 @@ terminal_init_inferior_with_pgrp (int pgrp)
     }
 }
 
+/* Save the terminal settings again.  This is necessary for the TUI
+   when it switches to TUI or non-TUI mode;  curses changes the terminal
+   and gdb must be able to restore it correctly.  */
+
+void
+terminal_save_ours ()
+{
+  if (gdb_has_a_terminal ())
+    {
+      /* We could just as well copy our_ttystate (if we felt like adding
+         a new function serial_copy_tty_state).  */
+      if (our_ttystate)
+        xfree (our_ttystate);
+      our_ttystate = serial_get_tty_state (stdin_serial);
+    }
+}
+
 void
 terminal_init_inferior (void)
 {
index 9035310c4947f1f5b9638f534f62f2975c8bff84..e49681192fee4a8ba2fecd80f1d3c8d69fda3331 100644 (file)
@@ -774,6 +774,7 @@ init_child_ops (void)
   child_ops.to_terminal_init = terminal_init_inferior;
   child_ops.to_terminal_inferior = terminal_inferior;
   child_ops.to_terminal_ours_for_output = terminal_ours_for_output;
+  child_ops.to_terminal_save_ours = terminal_save_ours;
   child_ops.to_terminal_ours = terminal_ours;
   child_ops.to_terminal_info = child_terminal_info;
   child_ops.to_kill = kill_inferior;
index c29101b9c363bac41dbde7649f2183dee2d59c00..28e62a87f7638ac790a26a4454454d27b5871dcd 100644 (file)
@@ -4474,6 +4474,7 @@ init_m3_ops (void)
   m3_ops.to_terminal_init = terminal_init_inferior;
   m3_ops.to_terminal_inferior = terminal_inferior;
   m3_ops.to_terminal_ours_for_output = terminal_ours_for_output;
+  m3_ops.to_terminal_save_ours = terminal_save_ours;
   m3_ops.to_terminal_ours = terminal_ours;
   m3_ops.to_terminal_info = child_terminal_info;
   m3_ops.to_kill = m3_kill_inferior;
index 79f55758dfeed3a0f699c9726c2feeee4d8f50aa..ff8a7d3fb25cc35f7eb0a4aec4656f35cf0802ee 100644 (file)
@@ -170,6 +170,7 @@ init_procfs_ops (void)
   procfs_ops.to_terminal_inferior   = terminal_inferior;
   procfs_ops.to_terminal_ours_for_output = terminal_ours_for_output;
   procfs_ops.to_terminal_ours       = terminal_ours;
+  procfs_ops.to_terminal_save_ours  = terminal_save_ours;
   procfs_ops.to_terminal_info       = child_terminal_info;
 
   procfs_ops.to_find_new_threads    = procfs_find_new_threads;
index 50caed39d99a8539b9b2201af37ba0a2f8c92497..35cb5786561d71f4a5dc798266442c173d09b827 100644 (file)
@@ -1556,6 +1556,7 @@ init_sol_thread_ops (void)
   sol_thread_ops.to_terminal_inferior = terminal_inferior;
   sol_thread_ops.to_terminal_ours_for_output = terminal_ours_for_output;
   sol_thread_ops.to_terminal_ours = terminal_ours;
+  sol_thread_ops.to_terminal_save_ours = terminal_save_ours;
   sol_thread_ops.to_terminal_info = child_terminal_info;
   sol_thread_ops.to_kill = sol_thread_kill_inferior;
   sol_thread_ops.to_load = 0;
index ec1979b4f905cee325d892824500a34274d73d60..75d022ff2000f106e2dc2520b15c7c6079236069 100644 (file)
@@ -138,6 +138,8 @@ static void debug_to_terminal_inferior (void);
 
 static void debug_to_terminal_ours_for_output (void);
 
+static void debug_to_terminal_save_ours (void);
+
 static void debug_to_terminal_ours (void);
 
 static void debug_to_terminal_info (char *, int);
@@ -445,6 +447,9 @@ cleanup_target (struct target_ops *t)
   de_fault (to_terminal_ours, 
            (void (*) (void)) 
            target_ignore);
+  de_fault (to_terminal_save_ours, 
+           (void (*) (void)) 
+           target_ignore);
   de_fault (to_terminal_info, 
            default_terminal_info);
   de_fault (to_kill, 
@@ -608,6 +613,7 @@ update_current_target (void)
       INHERIT (to_terminal_inferior, t);
       INHERIT (to_terminal_ours_for_output, t);
       INHERIT (to_terminal_ours, t);
+      INHERIT (to_terminal_save_ours, t);
       INHERIT (to_terminal_info, t);
       INHERIT (to_kill, t);
       INHERIT (to_load, t);
@@ -1979,6 +1985,14 @@ debug_to_terminal_ours (void)
   fprintf_unfiltered (gdb_stdlog, "target_terminal_ours ()\n");
 }
 
+static void
+debug_to_terminal_save_ours (void)
+{
+  debug_target.to_terminal_save_ours ();
+
+  fprintf_unfiltered (gdb_stdlog, "target_terminal_save_ours ()\n");
+}
+
 static void
 debug_to_terminal_info (char *arg, int from_tty)
 {
@@ -2405,6 +2419,7 @@ setup_target_debug (void)
   current_target.to_terminal_inferior = debug_to_terminal_inferior;
   current_target.to_terminal_ours_for_output = debug_to_terminal_ours_for_output;
   current_target.to_terminal_ours = debug_to_terminal_ours;
+  current_target.to_terminal_save_ours = debug_to_terminal_save_ours;
   current_target.to_terminal_info = debug_to_terminal_info;
   current_target.to_kill = debug_to_kill;
   current_target.to_load = debug_to_load;
index c165801bfcc2d16ea96225925353d2a27fc31064..18b95b0cea9e15ffb369a7c74ed278ee3e1df7a8 100644 (file)
@@ -264,6 +264,7 @@ struct target_ops
     void (*to_terminal_inferior) (void);
     void (*to_terminal_ours_for_output) (void);
     void (*to_terminal_ours) (void);
+    void (*to_terminal_save_ours) (void);
     void (*to_terminal_info) (char *, int);
     void (*to_kill) (void);
     void (*to_load) (char *, int);
@@ -626,6 +627,14 @@ extern void print_section_info (struct target_ops *, bfd *);
 #define target_terminal_ours() \
      (*current_target.to_terminal_ours) ()
 
+/* Save our terminal settings.
+   This is called from TUI after entering or leaving the curses
+   mode.  Since curses modifies our terminal this call is here
+   to take this change into account.  */
+
+#define target_terminal_save_ours() \
+     (*current_target.to_terminal_save_ours) ()
+
 /* Print useful information about our terminal status, if such a thing
    exists.  */
 
index e0377c5afe4098a4d5aaeb4a97e3d1fc43c04f2d..781a84126cb37b727c51b8a7115703facd19f1a9 100644 (file)
@@ -1791,6 +1791,7 @@ init_child_ops (void)
   child_ops.to_terminal_inferior = terminal_inferior;
   child_ops.to_terminal_ours_for_output = terminal_ours_for_output;
   child_ops.to_terminal_ours = terminal_ours;
+  child_ops.to_terminal_save_ours = terminal_save_ours;
   child_ops.to_terminal_info = child_terminal_info;
   child_ops.to_kill = child_kill_inferior;
   child_ops.to_load = 0;
index a640bea74b2f09c67ca981680119883bb04f2bbb..92c115820b4f57403ec93a682d03e6f5feaa1cf9 100644 (file)
@@ -1910,6 +1910,7 @@ init_child_ops (void)
   child_ops.to_terminal_inferior = terminal_inferior;
   child_ops.to_terminal_ours_for_output = terminal_ours_for_output;
   child_ops.to_terminal_ours = terminal_ours;
+  child_ops.to_terminal_save_ours = terminal_save_ours;
   child_ops.to_terminal_info = child_terminal_info;
   child_ops.to_kill = child_kill_inferior;
   child_ops.to_load = child_load;
index e0377c5afe4098a4d5aaeb4a97e3d1fc43c04f2d..781a84126cb37b727c51b8a7115703facd19f1a9 100644 (file)
@@ -1791,6 +1791,7 @@ init_child_ops (void)
   child_ops.to_terminal_inferior = terminal_inferior;
   child_ops.to_terminal_ours_for_output = terminal_ours_for_output;
   child_ops.to_terminal_ours = terminal_ours;
+  child_ops.to_terminal_save_ours = terminal_save_ours;
   child_ops.to_terminal_info = child_terminal_info;
   child_ops.to_kill = child_kill_inferior;
   child_ops.to_load = 0;