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)