Fix GDB busy loop when interrupting non-stop program (PR 26199)
[deliverable/binutils-gdb.git] / gdb / tui / tui.c
index f73ef7d58bf7c6356953abb8505612bc71ebd3ee..828e42bccf7a263da40648699f967f1aabcbec60 100644 (file)
@@ -1,6 +1,6 @@
 /* General functions for the WDB TUI.
 
-   Copyright (C) 1998-2019 Free Software Foundation, Inc.
+   Copyright (C) 1998-2020 Free Software Foundation, Inc.
 
    Contributed by Hewlett-Packard Company.
 
@@ -30,6 +30,7 @@
 #include "tui/tui-regs.h"
 #include "tui/tui-stack.h"
 #include "tui/tui-win.h"
+#include "tui/tui-wingeneral.h"
 #include "tui/tui-winsource.h"
 #include "tui/tui-source.h"
 #include "target.h"
@@ -139,8 +140,7 @@ tui_rl_switch_mode (int notused1, int notused2)
 /* TUI readline command.
    Change the TUI layout to show a next layout.
    This function is bound to CTRL-X 2.  It is intended to provide
-   a functionality close to the Emacs split-window command.  We
-   always show two windows (src+asm), (src+regs) or (asm+regs).  */
+   a functionality close to the Emacs split-window command.  */
 static int
 tui_rl_change_windows (int notused1, int notused2)
 {
@@ -148,41 +148,8 @@ tui_rl_change_windows (int notused1, int notused2)
     tui_rl_switch_mode (0 /* notused */, 0 /* notused */);
 
   if (tui_active)
-    {
-      enum tui_layout_type new_layout;
-
-      new_layout = tui_current_layout ();
+    tui_next_layout ();
 
-      /* Select a new layout to have a rolling layout behavior with
-        always two windows (except when undefined).  */
-      switch (new_layout)
-       {
-       case SRC_COMMAND:
-         new_layout = SRC_DISASSEM_COMMAND;
-         break;
-
-       case DISASSEM_COMMAND:
-         new_layout = SRC_DISASSEM_COMMAND;
-         break;
-
-       case SRC_DATA_COMMAND:
-         new_layout = SRC_DISASSEM_COMMAND;
-         break;
-
-       case SRC_DISASSEM_COMMAND:
-         new_layout = DISASSEM_DATA_COMMAND;
-         break;
-         
-       case DISASSEM_DATA_COMMAND:
-         new_layout = SRC_DATA_COMMAND;
-         break;
-
-       default:
-         new_layout = SRC_COMMAND;
-         break;
-       }
-      tui_set_layout (new_layout);
-    }
   return 0;
 }
 
@@ -195,28 +162,8 @@ tui_rl_delete_other_windows (int notused1, int notused2)
     tui_rl_switch_mode (0 /* notused */, 0 /* notused */);
 
   if (tui_active)
-    {
-      enum tui_layout_type new_layout;
-
-      new_layout = tui_current_layout ();
+    tui_remove_some_windows ();
 
-      /* Kill one window.  */
-      switch (new_layout)
-       {
-       case SRC_COMMAND:
-       case SRC_DATA_COMMAND:
-       case SRC_DISASSEM_COMMAND:
-       default:
-         new_layout = SRC_COMMAND;
-         break;
-
-       case DISASSEM_COMMAND:
-       case DISASSEM_DATA_COMMAND:
-         new_layout = DISASSEM_COMMAND;
-         break;
-       }
-      tui_set_layout (new_layout);
-    }
   return 0;
 }
 
@@ -321,8 +268,14 @@ tui_set_key_mode (enum tui_key_mode mode)
 /* Initialize readline and configure the keymap for the switching
    key shortcut.  */
 void
-tui_initialize_readline (void)
+tui_ensure_readline_initialized ()
 {
+  static bool initialized;
+
+  if (initialized)
+    return;
+  initialized = true;
+
   int i;
   Keymap tui_ctlx_keymap;
 
@@ -378,6 +331,9 @@ tui_initialize_readline (void)
   rl_bind_key_in_map ('q', tui_rl_next_keymap, tui_keymap);
   rl_bind_key_in_map ('s', tui_rl_next_keymap, emacs_ctlx_keymap);
   rl_bind_key_in_map ('s', tui_rl_next_keymap, tui_ctlx_keymap);
+
+  /* Initialize readline after the above.  */
+  rl_initialize ();
 }
 
 /* Return the TERM variable from the environment, or "<unset>"
@@ -424,7 +380,7 @@ tui_enable (void)
 
       /* Don't try to setup curses (and print funny control
         characters) if we're not outputting to a terminal.  */
-      if (!ui_file_isatty (gdb_stdout))
+      if (!gdb_stderr->isatty ())
        error (_("Cannot enable the TUI when output is not a terminal"));
 
       s = newterm (NULL, stdout, stdin);
@@ -475,7 +431,7 @@ tui_enable (void)
       def_prog_mode ();
 
       tui_show_frame_info (0);
-      tui_set_layout (SRC_COMMAND);
+      tui_set_initial_layout ();
       tui_set_win_focus_to (TUI_SRC_WIN);
       keypad (TUI_CMD_WIN->handle.get (), TRUE);
       wrefresh (TUI_CMD_WIN->handle.get ());
@@ -489,10 +445,6 @@ tui_enable (void)
      clearok (stdscr, TRUE);
    }
 
-  /* Install the TUI specific hooks.  */
-  tui_install_hooks ();
-  rl_startup_hook = tui_rl_startup_hook;
-
   if (tui_update_variables ())
     tui_rehighlight_all ();
 
@@ -513,6 +465,12 @@ tui_enable (void)
   else
     tui_display_main ();
 
+  /* Install the TUI specific hooks.  This must be done after the call to
+     tui_display_main so that we don't detect the symtab changed event it
+     can cause.  */
+  tui_install_hooks ();
+  rl_startup_hook = tui_rl_startup_hook;
+
   /* Restore TUI keymap.  */
   tui_set_key_mode (tui_current_key_mode);
 
@@ -575,6 +533,7 @@ tui_disable_command (const char *args, int from_tty)
 void
 tui_show_assembly (struct gdbarch *gdbarch, CORE_ADDR addr)
 {
+  tui_suppress_output suppress;
   tui_add_win_to_layout (DISASSEM_WIN);
   tui_update_source_windows_with_addr (gdbarch, addr);
 }
@@ -603,17 +562,20 @@ tui_get_command_dimension (unsigned int *width,
   return true;
 }
 
+void _initialize_tui ();
 void
-_initialize_tui (void)
+_initialize_tui ()
 {
   struct cmd_list_element **tuicmd;
 
   tuicmd = tui_get_cmd_list ();
 
   add_cmd ("enable", class_tui, tui_enable_command,
-          _("Enable TUI display mode."),
+          _("Enable TUI display mode.\n\
+Usage: tui enable"),
           tuicmd);
   add_cmd ("disable", class_tui, tui_disable_command,
-          _("Disable TUI display mode."),
+          _("Disable TUI display mode.\n\
+Usage: tui disable"),
           tuicmd);
 }
This page took 0.044326 seconds and 4 git commands to generate.