aboutsummaryrefslogtreecommitdiff
path: root/gdb/tui/tui-layout.c
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2019-07-09 15:35:17 -0600
committerTom Tromey <tom@tromey.com>2019-08-15 12:29:28 -0600
commitdb502012fc46b4dd068461aaeafeaa421489c562 (patch)
tree90e36ac3f6252a2d262ba78ad04efe1d23eaa96e /gdb/tui/tui-layout.c
parent3891b65efe614fe2e2f7e75e7f5ec8964f7fd96b (diff)
downloadgdb-db502012fc46b4dd068461aaeafeaa421489c562.zip
gdb-db502012fc46b4dd068461aaeafeaa421489c562.tar.gz
gdb-db502012fc46b4dd068461aaeafeaa421489c562.tar.bz2
TUI window resize should not need invisibility
When resizing a window, the TUI currently first makes it invisible, then changes the size, and then restores its visibility. I think this is done because curses doesn't truly support resizing a window -- there is a "wresize" extension, but the man page says it isn't available in all versions of curses. First, this is probably not a major problem any more. I imagine most of those old systems are gone now. Second, I think it's a better API to have this detail hidden inside of the resize method. This patch changes the code to follow this idea, and changes the ordinary resize method to use wresize when it is available. The special case for the command window is also moved to methods on the command window. gdb/ChangeLog 2019-08-15 Tom Tromey <tom@tromey.com> * tui/tui-layout.c (show_layout, show_source_disasm_command) (show_data): Don't change window visibility. (tui_gen_win_info::resize): Remove special case for command window. Use wresize, when available. (show_source_or_disasm_and_command): Don't change window visibility. * tui/tui-command.h (struct tui_cmd_window) <resize>: Declare. <make_visible>: New method. * tui/tui-command.c (tui_cmd_window::resize): New method.
Diffstat (limited to 'gdb/tui/tui-layout.c')
-rw-r--r--gdb/tui/tui-layout.c44
1 files changed, 21 insertions, 23 deletions
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;
}