From: Tom Tromey Date: Fri, 5 Jul 2019 18:46:23 +0000 (-0600) Subject: Delete invisible TUI windows X-Git-Tag: binutils-2_33~248 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fede52738f3ed3e375d84197380ae1a6cd35c6fe;p=thirdparty%2Fbinutils-gdb.git 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 50128426f0c..48d3fc595fb 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +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 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 c03a8672fca..be01c150973 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)