[PATCH 09/19] Delete invisible TUI windows

Tom Tromey tom@tromey.com
Sat Aug 3 13:29:00 GMT 2019


This changes the TUI so that when the layout changes, any windows that
are invisible are now deleted.  This makes it simpler to understand
window lifetimes.

gdb/ChangeLog
2019-08-03  Tom Tromey  <tom@tromey.com>

	* tui/tui-win.c (tui_resize_all): Call
	tui_delete_invisible_windows.
	* tui/tui-layout.c (show_layout): Call
	tui_delete_invisible_windows.
	* tui/tui-data.h (tui_delete_invisible_windows): Declare.
	* tui/tui-data.c (tui_delete_invisible_windows): New function.
---
 gdb/ChangeLog        |  9 +++++++++
 gdb/tui/tui-data.c   | 22 ++++++++++++++++++++++
 gdb/tui/tui-data.h   |  5 +++++
 gdb/tui/tui-layout.c |  3 +++
 gdb/tui/tui-win.c    | 15 ++-------------
 5 files changed, 41 insertions(+), 13 deletions(-)

diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index fd7649bdeab..bb725c199cc 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -269,6 +269,28 @@ tui_initialize_static_data ()
   win->title = 0;
 }
 
+/* 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)
diff --git a/gdb/tui/tui-data.h b/gdb/tui/tui-data.h
index dbae2fb3b00..d3fa03657c5 100644
--- a/gdb/tui/tui-data.h
+++ b/gdb/tui/tui-data.h
@@ -399,6 +399,11 @@ extern void tui_set_win_resized_to (int);
 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 */
diff --git a/gdb/tui/tui-layout.c b/gdb/tui/tui-layout.c
index f4f834dc83e..2715d322dc7 100644
--- a/gdb/tui/tui-layout.c
+++ b/gdb/tui/tui-layout.c
@@ -107,6 +107,8 @@ show_layout (enum tui_layout_type layout)
 	default:
 	  break;
 	}
+
+      tui_delete_invisible_windows ();
     }
 }
 
@@ -596,6 +598,7 @@ show_data (enum tui_layout_type new_layout)
   locator->make_visible (true);
   tui_show_locator_content ();
   tui_add_to_source_windows (base);
+  TUI_CMD_WIN->make_visible (true);
   current_layout = new_layout;
 }
 
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 785c623b7e2..0e64db3e7a1 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -537,7 +537,6 @@ tui_resize_all (void)
       struct tui_win_info *second_win;
       tui_source_window_base *src_win;
       struct tui_locator_window *locator = tui_locator_win_info_ptr ();
-      int win_type;
       int new_height, split_diff, cmd_split_diff, num_wins_displayed = 2;
 
 #ifdef HAVE_RESIZE_TERM
@@ -663,18 +662,8 @@ tui_resize_all (void)
 	    tui_erase_source_content (src_win);
 	  break;
 	}
-      /* Now remove all invisible windows, and their content so that
-         they get created again when called for with the new size.  */
-      for (win_type = SRC_WIN; (win_type < MAX_MAJOR_WINDOWS); win_type++)
-	{
-	  if (win_type != CMD_WIN 
-	      && (tui_win_list[win_type] != NULL)
-	      && !tui_win_list[win_type]->is_visible)
-	    {
-	      delete tui_win_list[win_type];
-	      tui_win_list[win_type] = NULL;
-	    }
-	}
+
+      tui_delete_invisible_windows ();
       /* Turn keypad back on, unless focus is in the command
 	 window.  */
       if (win_with_focus != TUI_CMD_WIN)
-- 
2.17.2



More information about the Gdb-patches mailing list