This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 09/19] Delete invisible TUI windows


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]