From fede52738f3ed3e375d84197380ae1a6cd35c6fe Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 5 Jul 2019 12:46:23 -0600 Subject: [PATCH] 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 * 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/ChangeLog b/gdb/ChangeLog index 5012842..48d3fc5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,14 @@ 2019-08-13 Tom Tromey + * 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 + * tui/tui-disasm.c (tui_show_disassem): Add assertion. Don't call tui_add_win_to_layout. diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c index fd7649b..bb725c1 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 dbae2fb..d3fa036 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 f4f834dc..2715d32 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 c03a867..be01c15 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.7.4