Remove tui_delete_invisible_windows and tui_make_all_invisible
authorTom Tromey <tom@tromey.com>
Sat, 22 Feb 2020 18:48:26 +0000 (11:48 -0700)
committerTom Tromey <tom@tromey.com>
Sat, 22 Feb 2020 18:48:37 +0000 (11:48 -0700)
tui_delete_invisible_windows is only needed after applying a layout,
and tui_make_all_invisible is only needed before applying a layout.

This patch removes these functions, in favor of doing this management
directly in tui_apply_current_layout.  This is needed so that the
lifetimes of non-built-in windows will be properly managed.

gdb/ChangeLog
2020-02-22  Tom Tromey  <tom@tromey.com>

* tui/tui-wingeneral.h (tui_make_all_invisible): Don't declare.
* tui/tui-wingeneral.c (tui_make_all_invisible): Remove.
* tui/tui-win.c (tui_resize_all): Don't call
tui_delete_invisible_windows.
* tui/tui-layout.c (tui_apply_current_layout): Delete windows when
done.
(tui_set_layout): Update.
(tui_add_win_to_layout): Don't call tui_delete_invisible_windows.
* tui/tui-data.h (tui_delete_invisible_windows): Don't declare.
* tui/tui-data.c (tui_delete_invisible_windows): Remove.

Change-Id: Ia3603b021dcb7ec31700a4a32640cd09b00b8f3b

gdb/ChangeLog
gdb/tui/tui-data.c
gdb/tui/tui-data.h
gdb/tui/tui-layout.c
gdb/tui/tui-win.c
gdb/tui/tui-wingeneral.c
gdb/tui/tui-wingeneral.h

index feb58334b00c2f4ec4ab13befd226103700d7a41..31bfb9f680006a0829ceae25bf494013a1801425 100644 (file)
@@ -1,3 +1,16 @@
+2020-02-22  Tom Tromey  <tom@tromey.com>
+
+       * tui/tui-wingeneral.h (tui_make_all_invisible): Don't declare.
+       * tui/tui-wingeneral.c (tui_make_all_invisible): Remove.
+       * tui/tui-win.c (tui_resize_all): Don't call
+       tui_delete_invisible_windows.
+       * tui/tui-layout.c (tui_apply_current_layout): Delete windows when
+       done.
+       (tui_set_layout): Update.
+       (tui_add_win_to_layout): Don't call tui_delete_invisible_windows.
+       * tui/tui-data.h (tui_delete_invisible_windows): Don't declare.
+       * tui/tui-data.c (tui_delete_invisible_windows): Remove.
+
 2020-02-22  Tom Tromey  <tom@tromey.com>
 
        * tui/tui-win.c (tui_partial_win_by_name): Handle ambiguity
index 5d42fafccca3c9bbcc406437eeb106ae96c27cfe..ead8b1043ca3c897f98413666bfe2cce3d57e643 100644 (file)
@@ -129,29 +129,6 @@ tui_prev_win (struct tui_win_info *cur_win)
 }
 
 
-/* See tui-data.h.  */
-
-void
-tui_delete_invisible_windows ()
-{
-  for (int win_type = SRC_WIN; (win_type < MAX_MAJOR_WINDOWS); win_type++)
-    {
-      if (tui_win_list[win_type] != NULL
-         && !tui_win_list[win_type]->is_visible ())
-       {
-         /* This should always be made visible before a call to this
-            function.  */
-         gdb_assert (win_type != CMD_WIN);
-
-         if (win_with_focus == tui_win_list[win_type])
-           win_with_focus = nullptr;
-
-         delete tui_win_list[win_type];
-         tui_win_list[win_type] = NULL;
-       }
-    }
-}
-
 tui_win_info::tui_win_info (enum tui_win_type type)
   : tui_gen_win_info (type)
 {
index a4601373e11459aa4ee127abbb3dac7c96e73f7a..cd62b5758e60d27cbffe9e32e6d8f178c4780d4f 100644 (file)
@@ -263,11 +263,6 @@ extern void tui_set_win_resized_to (bool);
 extern struct tui_win_info *tui_next_win (struct tui_win_info *);
 extern struct tui_win_info *tui_prev_win (struct tui_win_info *);
 
-/* Delete all the invisible windows.  Note that it is an error to call
-   this when the command window is invisible -- we don't allow the
-   command window to be removed from the layout.  */
-extern void tui_delete_invisible_windows ();
-
 extern unsigned int tui_tab_width;
 
 #endif /* TUI_TUI_DATA_H */
index ad0484018e7fdaca8da057569e6bee2183b13db3..c27a8d086e28618de99c968b5926a5e3c8f8fc5c 100644 (file)
@@ -69,8 +69,43 @@ std::vector<tui_win_info *> tui_windows;
 void
 tui_apply_current_layout ()
 {
+  struct gdbarch *gdbarch;
+  CORE_ADDR addr;
+
+  extract_display_start_addr (&gdbarch, &addr);
+
+  std::vector<tui_win_info *> saved_windows = std::move (tui_windows);
   tui_windows.clear ();
+
+  for (tui_win_info *win_info : saved_windows)
+    win_info->make_visible (false);
+
   applied_layout->apply (0, 0, tui_term_width (), tui_term_height ());
+
+  /* Keep the list of internal windows up-to-date.  */
+  for (int win_type = SRC_WIN; (win_type < MAX_MAJOR_WINDOWS); win_type++)
+    if (tui_win_list[win_type] != nullptr
+       && !tui_win_list[win_type]->is_visible ())
+      tui_win_list[win_type] = nullptr;
+
+  /* This should always be made visible by a layout.  */
+  gdb_assert (TUI_CMD_WIN->is_visible ());
+
+  /* Now delete any window that was not re-applied.  */
+  tui_win_info *focus = tui_win_with_focus ();
+  for (tui_win_info *win_info : saved_windows)
+    {
+      if (!win_info->is_visible ())
+       {
+         if (focus == win_info)
+           tui_set_win_focus_to (tui_windows[0]);
+         delete win_info;
+       }
+    }
+
+  if (gdbarch == nullptr && TUI_DISASM_WIN != nullptr)
+    tui_get_begin_asm_address (&gdbarch, &addr);
+  tui_update_source_windows_with_addr (gdbarch, addr);
 }
 
 /* See tui-layout.  */
@@ -86,19 +121,9 @@ tui_adjust_window_height (struct tui_win_info *win, int new_height)
 static void
 tui_set_layout (tui_layout_split *layout)
 {
-  struct gdbarch *gdbarch;
-  CORE_ADDR addr;
-
-  extract_display_start_addr (&gdbarch, &addr);
-  tui_make_all_invisible ();
   applied_skeleton = layout;
   applied_layout = layout->clone ();
   tui_apply_current_layout ();
-  tui_delete_invisible_windows ();
-
-  if (gdbarch == nullptr && TUI_DISASM_WIN != nullptr)
-    tui_get_begin_asm_address (&gdbarch, &addr);
-  tui_update_source_windows_with_addr (gdbarch, addr);
 }
 
 /* See tui-layout.h.  */
@@ -121,7 +146,6 @@ tui_add_win_to_layout (enum tui_win_type type)
   const char *name = type == SRC_WIN ? SRC_NAME : DISASSEM_NAME;
   applied_layout->replace_window (tui_win_list[other]->name (), name);
   tui_apply_current_layout ();
-  tui_delete_invisible_windows ();
 }
 
 /* Find LAYOUT in the "layouts" global and return its index.  */
index ea202757c884917912cf846c03562d559aa1d85b..ac314d7d2ac20e51b81e8a6bcfc3cff5623b3ede 100644 (file)
@@ -550,7 +550,6 @@ tui_resize_all (void)
       erase ();
       clearok (curscr, TRUE);
       tui_apply_current_layout ();
-      tui_delete_invisible_windows ();
       /* Turn keypad back on, unless focus is in the command
         window.  */
       if (win_with_focus != TUI_CMD_WIN)
index e001a4cd97234d8aaf92f00520029027dc61f5c8..35468d43abcd40612fe5a0f7de92246f077b36ac 100644 (file)
@@ -202,15 +202,6 @@ tui_gen_win_info::make_visible (bool visible)
     handle.reset (nullptr);
 }
 
-/* See tui-wingeneral.h.  */
-
-void
-tui_make_all_invisible (void)
-{
-  for (tui_win_info *win_info : all_tui_windows ())
-    win_info->make_visible (false);
-}
-
 /* Function to refresh all the windows currently displayed.  */
 
 void
index a28f27c55144cb8842c4af61751149cddc737ccc..9302342e769c81a2671d04217f3b0d420d873b27 100644 (file)
@@ -26,9 +26,6 @@
 
 struct tui_win_info;
 
-/* Makes all windows invisible.  */
-extern void tui_make_all_invisible (void);
-
 extern void tui_unhighlight_win (struct tui_win_info *);
 extern void tui_highlight_win (struct tui_win_info *);
 extern void tui_refresh_all ();