diff options
Diffstat (limited to 'gdb/tui')
-rw-r--r-- | gdb/tui/tui-command.c | 35 | ||||
-rw-r--r-- | gdb/tui/tui-command.h | 7 | ||||
-rw-r--r-- | gdb/tui/tui-layout.c | 44 |
3 files changed, 63 insertions, 23 deletions
diff --git a/gdb/tui/tui-command.c b/gdb/tui/tui-command.c index 034abd5..ddbd8bc 100644 --- a/gdb/tui/tui-command.c +++ b/gdb/tui/tui-command.c @@ -25,6 +25,7 @@ #include "tui/tui-win.h" #include "tui/tui-io.h" #include "tui/tui-command.h" +#include "tui/tui-wingeneral.h" #include "gdb_curses.h" @@ -48,6 +49,40 @@ tui_cmd_window::max_height () const return tui_term_height () - 4; } +void +tui_cmd_window::resize (int height_, int width_, int origin_x, int origin_y) +{ + width = width_; + height = height_; + if (height > 1) + { + /* Note this differs from the base class implementation, because + this window can't be boxed. */ + viewport_height = height - 1; + } + else + viewport_height = 1; + origin.x = origin_x; + origin.y = origin_y; + + if (handle == nullptr) + tui_make_window (this); + else + { + /* Another reason we don't call the base class method here is + that for the command window in particular, we want to avoid + destroying the underlying handle. We don't currently track + the contents of this window, and so have no way to re-render + it. However we can at least move it and keep the old size if + wresize isn't available. */ +#ifdef HAVE_WRESIZE + wresize (handle, height, width); +#endif + mvwin (handle, origin.y, origin.x); + wmove (handle, 0, 0); + } +} + /* See tui-command.h. */ void diff --git a/gdb/tui/tui-command.h b/gdb/tui/tui-command.h index 1892956..1fce0a1 100644 --- a/gdb/tui/tui-command.h +++ b/gdb/tui/tui-command.h @@ -56,6 +56,13 @@ struct tui_cmd_window : public tui_win_info return false; } + void resize (int height, int width, int origin_x, int origin_y) override; + + void make_visible (bool visible) override + { + /* The command window can't be made invisible. */ + } + int start_line = 0; protected: diff --git a/gdb/tui/tui-layout.c b/gdb/tui/tui-layout.c index 4ea604a..e0e804b 100644 --- a/gdb/tui/tui-layout.c +++ b/gdb/tui/tui-layout.c @@ -76,9 +76,7 @@ show_layout (enum tui_layout_type layout) if (layout != cur_layout) { - /* First make the current layout be invisible. */ tui_make_all_invisible (); - tui_locator_win_info_ptr ()->make_visible (false); switch (layout) { case SRC_DATA_COMMAND: @@ -506,7 +504,6 @@ show_source_disasm_command (void) tui_term_width (), 0, 0); - TUI_SRC_WIN->make_visible (true); TUI_SRC_WIN->m_has_locator = false; struct tui_locator_window *locator = tui_locator_win_info_ptr (); @@ -519,14 +516,12 @@ show_source_disasm_command (void) tui_term_width (), 0, src_height - 1); - TUI_DISASM_WIN->make_visible (true); locator->resize (2 /* 1 */ , tui_term_width (), 0, (src_height + asm_height) - 1); TUI_SRC_WIN->m_has_locator = false; TUI_DISASM_WIN->m_has_locator = true; - locator->make_visible (true); tui_show_locator_content (); TUI_DISASM_WIN->show_source_content (); @@ -536,7 +531,6 @@ show_source_disasm_command (void) tui_term_width (), 0, tui_term_height () - cmd_height); - TUI_CMD_WIN->make_visible (true); current_layout = SRC_DISASSEM_COMMAND; } @@ -558,7 +552,6 @@ show_data (enum tui_layout_type new_layout) if (tui_win_list[DATA_WIN] == nullptr) tui_win_list[DATA_WIN] = new tui_data_window (); tui_win_list[DATA_WIN]->resize (data_height, tui_term_width (), 0, 0); - tui_win_list[DATA_WIN]->make_visible (true); if (new_layout == SRC_DATA_COMMAND) win_type = SRC_WIN; @@ -583,11 +576,11 @@ show_data (enum tui_layout_type new_layout) tui_term_width (), 0, total_height - 1); - base->make_visible (true); + TUI_CMD_WIN->resize (TUI_CMD_WIN->height, tui_term_width (), + 0, total_height); + base->m_has_locator = true; - locator->make_visible (true); tui_show_locator_content (); - TUI_CMD_WIN->make_visible (true); current_layout = new_layout; } @@ -595,20 +588,29 @@ void tui_gen_win_info::resize (int height_, int width_, int origin_x_, int origin_y_) { - int h = height_; - width = width_; - height = h; - if (h > 1) - { - viewport_height = h - 1; - if (type != CMD_WIN) - viewport_height--; - } + height = height_; + if (height > 1) + viewport_height = height - 2; else viewport_height = 1; origin.x = origin_x_; origin.y = origin_y_; + + if (handle != nullptr) + { +#ifdef HAVE_WRESIZE + wresize (handle, height, width); + mvwin (handle, origin.y, origin.x); + wmove (handle, 0, 0); +#else + tui_delete_win (handle); + handle = NULL; +#endif + } + + if (handle == nullptr) + tui_make_window (this); } /* Show the Source/Command or the Disassem layout. */ @@ -647,11 +649,8 @@ show_source_or_disasm_and_command (enum tui_layout_type layout_type) tui_term_width (), 0, 0); - win_info->make_visible (true); - win_info->m_has_locator = true; - locator->make_visible (true); tui_show_locator_content (); win_info->show_source_content (); @@ -661,6 +660,5 @@ show_source_or_disasm_and_command (enum tui_layout_type layout_type) tui_term_width (), 0, src_height); - TUI_CMD_WIN->make_visible (true); current_layout = layout_type; } |