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-13  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.
This commit is contained in:
Tom Tromey 2019-07-05 12:46:23 -06:00
parent 22c3f4909a
commit fede52738f
5 changed files with 41 additions and 13 deletions

View File

@ -1,3 +1,12 @@
2019-08-13 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.
2019-08-13 Tom Tromey <tom@tromey.com>
* tui/tui-disasm.c (tui_show_disassem): Add assertion. Don't call

View File

@ -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)

View File

@ -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 */

View File

@ -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;
}

View File

@ -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)