OSDN Git Service

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.

13 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

index 59b2abd..550b6bb 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 a4b8020..59aad5d 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 eec18ff..981bb9d 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 e875e9c..8035ccd 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 526acdf..b37fc54 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 9035310..e496811 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 c29101b..28e62a8 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 79f5575..ff8a7d3 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 50caed3..35cb578 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 ec1979b..75d022f 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);
@@ -1980,6 +1986,14 @@ debug_to_terminal_ours (void)
 }
 
 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)
 {
   debug_target.to_terminal_info (arg, 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 c165801..18b95b0 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 e0377c5..781a841 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 a640bea..92c1158 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;