From 2192a9d3b31a595eb7add928221d49334f32c06d Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 9 Oct 2019 16:35:41 -0600 Subject: [PATCH] First use of tui_layout This patch introduces the first use of tui_layout, by changing show_layout to clone and use the appropriate tui_layout. This resulted in one minor layout change, and also in the unintended -- but good -- side effect that the title of each boxed window is now visible. gdb/ChangeLog 2019-12-11 Tom Tromey * tui/tui-layout.h (tui_apply_current_layout): Declare. * tui/tui-layout.c (standard_layouts, applied_layout): New globals. (tui_apply_current_layout): New function. (show_layout): Set applied_layout. Call tui_apply_current_layout. (show_source_command, show_disasm_command) (show_source_disasm_command, show_data) (show_source_or_disasm_and_command): Remove. (initialize_layouts): New function. (_initialize_tui_layout): Call initialize_layouts. gdb/testsuite/ChangeLog 2019-12-11 Tom Tromey * gdb.tui/regs.exp: Update. * gdb.tui/empty.exp (layouts): Update. * gdb.tui/basic.exp: Update. * lib/tuiterm.exp (_check_box): Don't check bottom border. Change-Id: If1ee06ee58f4803e8c213f4ab0f5bb59f4650ec2 --- gdb/ChangeLog | 14 +++ gdb/testsuite/ChangeLog | 7 ++ gdb/testsuite/gdb.tui/basic.exp | 4 +- gdb/testsuite/gdb.tui/empty.exp | 8 +- gdb/testsuite/gdb.tui/regs.exp | 4 +- gdb/testsuite/lib/tuiterm.exp | 10 +- gdb/tui/tui-layout.c | 216 ++++++++------------------------ gdb/tui/tui-layout.h | 3 + 8 files changed, 84 insertions(+), 182 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 595b98743d6..4c98df34d83 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,17 @@ +2019-12-11 Tom Tromey + + * tui/tui-layout.h (tui_apply_current_layout): Declare. + * tui/tui-layout.c (standard_layouts, applied_layout): New + globals. + (tui_apply_current_layout): New function. + (show_layout): Set applied_layout. Call + tui_apply_current_layout. + (show_source_command, show_disasm_command) + (show_source_disasm_command, show_data) + (show_source_or_disasm_and_command): Remove. + (initialize_layouts): New function. + (_initialize_tui_layout): Call initialize_layouts. + 2019-12-11 Tom Tromey * tui/tui-layout.h (class tui_layout_base) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 17d49938885..9b7a81ec986 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2019-12-11 Tom Tromey + + * gdb.tui/regs.exp: Update. + * gdb.tui/empty.exp (layouts): Update. + * gdb.tui/basic.exp: Update. + * lib/tuiterm.exp (_check_box): Don't check bottom border. + 2019-12-11 Philippe Waroquiers * gdb.base/options.exp: Add -raw-values in the print completion list. diff --git a/gdb/testsuite/gdb.tui/basic.exp b/gdb/testsuite/gdb.tui/basic.exp index 716c52f68a6..f9d57d1cf6d 100644 --- a/gdb/testsuite/gdb.tui/basic.exp +++ b/gdb/testsuite/gdb.tui/basic.exp @@ -45,5 +45,5 @@ Term::check_box "asm box" 0 0 80 15 Term::command "layout split" Term::check_contents "split layout contents" "21 *return 0.*$hex
" -Term::check_box "source box in split layout" 0 0 80 8 -Term::check_box "asm box in split layout" 0 7 80 8 +Term::check_box "source box in split layout" 0 0 80 7 +Term::check_box "asm box in split layout" 0 6 80 9 diff --git a/gdb/testsuite/gdb.tui/empty.exp b/gdb/testsuite/gdb.tui/empty.exp index b6ee3505490..861f56437ed 100644 --- a/gdb/testsuite/gdb.tui/empty.exp +++ b/gdb/testsuite/gdb.tui/empty.exp @@ -34,7 +34,7 @@ if {![Term::enter_tui]} { set layouts { {src src {{0 0 80 15}} {{0 0 90 23}} {{"no source" "No Source Available"}}} - {regs src-regs {{0 0 80 8} {0 7 80 8}} {{0 0 90 13} {0 12 90 13}} + {regs src-regs {{0 0 80 7} {0 6 80 9}} {{0 0 90 12} {0 11 90 14}} { {"no source" "No Source Available"} {"no regs" "Register Values Unavailable"} @@ -43,17 +43,17 @@ set layouts { { {"no asm" "No Assembly Available"} }} - {regs asm-regs {{0 0 80 8} {0 7 80 8}} {{0 0 90 13} {0 12 90 13}} + {regs asm-regs {{0 0 80 7} {0 6 80 9}} {{0 0 90 12} {0 11 90 14}} { {"no asm" "No Assembly Available"} {"no regs" "Register Values Unavailable"} }} - {split split {{0 0 80 8} {0 7 80 8}} {{0 0 90 13} {0 12 90 13}} + {split split {{0 0 80 7} {0 6 80 9}} {{0 0 90 12} {0 11 90 14}} { {"no source" "No Source Available"} {"no asm" "No Assembly Available"} }} - {regs split-regs {{0 0 80 8} {0 7 80 8}} {{0 0 90 13} {0 12 90 13}} + {regs split-regs {{0 0 80 7} {0 6 80 9}} {{0 0 90 12} {0 11 90 14}} { {"no asm" "No Assembly Available"} {"no regs" "Register Values Unavailable"} diff --git a/gdb/testsuite/gdb.tui/regs.exp b/gdb/testsuite/gdb.tui/regs.exp index 1af943dd152..dcecd03af9a 100644 --- a/gdb/testsuite/gdb.tui/regs.exp +++ b/gdb/testsuite/gdb.tui/regs.exp @@ -37,8 +37,8 @@ if {![Term::enter_tui]} { Term::check_contents "source at startup" ">|21 *return 0" Term::command "layout regs" -Term::check_box "register box" 0 0 80 8 -Term::check_box "source box in regs layout" 0 7 80 8 +Term::check_box "register box" 0 0 80 7 +Term::check_box "source box in regs layout" 0 6 80 9 set text [Term::get_line 1] # Just check for any register window content at all. diff --git a/gdb/testsuite/lib/tuiterm.exp b/gdb/testsuite/lib/tuiterm.exp index dcba02889ec..81247d5d9a4 100644 --- a/gdb/testsuite/lib/tuiterm.exp +++ b/gdb/testsuite/lib/tuiterm.exp @@ -555,13 +555,9 @@ namespace eval Term { return "lr corner" } - for {set i [expr {$x + 1}]} {$i < $x2 - 1} {incr i} { - # Note we do not check the top border of the box, because - # it will contain a title. - if {[get_char $i $y2] != "-"} { - return "bottom border $i" - } - } + # Note we do not check the horizonal borders of the box. The + # top will contain a title, and the bottom may as well, if it + # is overlapped by some other border. for {set i [expr {$y + 1}]} {$i < $y2 - 1} {incr i} { if {[get_char $x $i] != "|"} { return "left side $i" diff --git a/gdb/tui/tui-layout.c b/gdb/tui/tui-layout.c index 91f270dcfc3..1884c2add7b 100644 --- a/gdb/tui/tui-layout.c +++ b/gdb/tui/tui-layout.c @@ -41,17 +41,18 @@ #include "gdb_curses.h" static void show_layout (enum tui_layout_type); -static void show_source_or_disasm_and_command (enum tui_layout_type); -static void show_source_command (void); -static void show_disasm_command (void); -static void show_source_disasm_command (void); -static void show_data (enum tui_layout_type); static enum tui_layout_type next_layout (void); static enum tui_layout_type prev_layout (void); static void tui_layout_command (const char *, int); static void extract_display_start_addr (struct gdbarch **, CORE_ADDR *); +/* The pre-defined layouts. */ +static tui_layout_split *standard_layouts[UNDEFINED_LAYOUT]; + +/* The layout that is currently applied. */ +static std::unique_ptr applied_layout; + static enum tui_layout_type current_layout = UNDEFINED_LAYOUT; /* Accessor for the current layout. */ @@ -61,6 +62,13 @@ tui_current_layout (void) return current_layout; } +/* See tui-layout.h. */ + +void +tui_apply_current_layout () +{ + applied_layout->apply (0, 0, tui_term_width (), tui_term_height ()); +} /* Show the screen layout defined. */ static void @@ -71,26 +79,8 @@ show_layout (enum tui_layout_type layout) if (layout != cur_layout) { tui_make_all_invisible (); - switch (layout) - { - case SRC_DATA_COMMAND: - case DISASSEM_DATA_COMMAND: - show_data (layout); - break; - /* Now show the new layout. */ - case SRC_COMMAND: - show_source_command (); - break; - case DISASSEM_COMMAND: - show_disasm_command (); - break; - case SRC_DISASSEM_COMMAND: - show_source_disasm_command (); - break; - default: - break; - } - + applied_layout = standard_layouts[layout]->clone (); + tui_apply_current_layout (); current_layout = layout; tui_delete_invisible_windows (); } @@ -364,105 +354,6 @@ prev_layout (void) return (enum tui_layout_type) new_layout; } -/* Show the Source/Command layout. */ -static void -show_source_command (void) -{ - show_source_or_disasm_and_command (SRC_COMMAND); -} - - -/* Show the Dissassem/Command layout. */ -static void -show_disasm_command (void) -{ - show_source_or_disasm_and_command (DISASSEM_COMMAND); -} - - -/* Show the Source/Disassem/Command layout. */ -static void -show_source_disasm_command (void) -{ - int cmd_height, src_height, asm_height; - - if (TUI_CMD_WIN != NULL) - cmd_height = TUI_CMD_WIN->height; - else - cmd_height = tui_term_height () / 3; - - src_height = (tui_term_height () - cmd_height) / 2; - asm_height = tui_term_height () - (src_height + cmd_height); - - if (TUI_SRC_WIN == NULL) - tui_win_list[SRC_WIN] = new tui_source_window (); - TUI_SRC_WIN->resize (src_height, - tui_term_width (), - 0, - 0); - - struct tui_locator_window *locator = tui_locator_win_info_ptr (); - gdb_assert (locator != nullptr); - - if (TUI_DISASM_WIN == NULL) - tui_win_list[DISASSEM_WIN] = new tui_disasm_window (); - TUI_DISASM_WIN->resize (asm_height, - tui_term_width (), - 0, - src_height - 1); - locator->resize (1, tui_term_width (), - 0, (src_height + asm_height) - 1); - - if (TUI_CMD_WIN == NULL) - tui_win_list[CMD_WIN] = new tui_cmd_window (); - TUI_CMD_WIN->resize (cmd_height, - tui_term_width (), - 0, - tui_term_height () - cmd_height); -} - - -/* Show the Source/Data/Command or the Dissassembly/Data/Command - layout. */ -static void -show_data (enum tui_layout_type new_layout) -{ - int total_height = (tui_term_height () - TUI_CMD_WIN->height); - int src_height, data_height; - enum tui_win_type win_type; - - struct tui_locator_window *locator = tui_locator_win_info_ptr (); - gdb_assert (locator != nullptr); - - data_height = total_height / 2; - src_height = total_height - data_height; - 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); - - if (new_layout == SRC_DATA_COMMAND) - win_type = SRC_WIN; - else - win_type = DISASSEM_WIN; - - if (tui_win_list[win_type] == NULL) - { - if (win_type == SRC_WIN) - tui_win_list[win_type] = new tui_source_window (); - else - tui_win_list[win_type] = new tui_disasm_window (); - } - - tui_win_list[win_type]->resize (src_height, - tui_term_width (), - 0, - data_height - 1); - locator->resize (1, tui_term_width (), - 0, total_height - 1); - TUI_CMD_WIN->resize (TUI_CMD_WIN->height, tui_term_width (), - 0, total_height); -} - void tui_gen_win_info::resize (int height_, int width_, int origin_x_, int origin_y_) @@ -498,49 +389,6 @@ tui_gen_win_info::resize (int height_, int width_, rerender (); } -/* Show the Source/Command or the Disassem layout. */ -static void -show_source_or_disasm_and_command (enum tui_layout_type layout_type) -{ - struct tui_source_window_base *win_info; - int src_height, cmd_height; - struct tui_locator_window *locator = tui_locator_win_info_ptr (); - gdb_assert (locator != nullptr); - - if (TUI_CMD_WIN != NULL) - cmd_height = TUI_CMD_WIN->height; - else - cmd_height = tui_term_height () / 3; - src_height = tui_term_height () - cmd_height; - - if (layout_type == SRC_COMMAND) - { - if (tui_win_list[SRC_WIN] == nullptr) - tui_win_list[SRC_WIN] = new tui_source_window (); - win_info = TUI_SRC_WIN; - } - else - { - if (tui_win_list[DISASSEM_WIN] == nullptr) - tui_win_list[DISASSEM_WIN] = new tui_disasm_window (); - win_info = TUI_DISASM_WIN; - } - - locator->resize (1, tui_term_width (), - 0, src_height - 1); - win_info->resize (src_height - 1, - tui_term_width (), - 0, - 0); - - if (TUI_CMD_WIN == NULL) - tui_win_list[CMD_WIN] = new tui_cmd_window (); - TUI_CMD_WIN->resize (cmd_height, - tui_term_width (), - 0, - src_height); -} - /* Helper function that returns a TUI window, given its name. */ @@ -901,6 +749,38 @@ tui_layout_split::apply (int x_, int y_, int width_, int height_) m_applied = true; } +static void +initialize_layouts () +{ + standard_layouts[SRC_COMMAND] = new tui_layout_split (); + standard_layouts[SRC_COMMAND]->add_window ("src", 2); + standard_layouts[SRC_COMMAND]->add_window ("locator", 0); + standard_layouts[SRC_COMMAND]->add_window ("cmd", 1); + + standard_layouts[DISASSEM_COMMAND] = new tui_layout_split (); + standard_layouts[DISASSEM_COMMAND]->add_window ("asm", 2); + standard_layouts[DISASSEM_COMMAND]->add_window ("locator", 0); + standard_layouts[DISASSEM_COMMAND]->add_window ("cmd", 1); + + standard_layouts[SRC_DATA_COMMAND] = new tui_layout_split (); + standard_layouts[SRC_DATA_COMMAND]->add_window ("regs", 1); + standard_layouts[SRC_DATA_COMMAND]->add_window ("src", 1); + standard_layouts[SRC_DATA_COMMAND]->add_window ("locator", 0); + standard_layouts[SRC_DATA_COMMAND]->add_window ("cmd", 1); + + standard_layouts[DISASSEM_DATA_COMMAND] = new tui_layout_split (); + standard_layouts[DISASSEM_DATA_COMMAND]->add_window ("regs", 1); + standard_layouts[DISASSEM_DATA_COMMAND]->add_window ("asm", 1); + standard_layouts[DISASSEM_DATA_COMMAND]->add_window ("locator", 0); + standard_layouts[DISASSEM_DATA_COMMAND]->add_window ("cmd", 1); + + standard_layouts[SRC_DISASSEM_COMMAND] = new tui_layout_split (); + standard_layouts[SRC_DISASSEM_COMMAND]->add_window ("src", 1); + standard_layouts[SRC_DISASSEM_COMMAND]->add_window ("asm", 1); + standard_layouts[SRC_DISASSEM_COMMAND]->add_window ("locator", 0); + standard_layouts[SRC_DISASSEM_COMMAND]->add_window ("cmd", 1); +} + /* Function to initialize gdb commands, for tui window layout @@ -925,4 +805,6 @@ Layout names are:\n\ the register window is displayed with \n\ the window that has current logical focus.")); set_cmd_completer (cmd, layout_completer); + + initialize_layouts (); } diff --git a/gdb/tui/tui-layout.h b/gdb/tui/tui-layout.h index d7f0731e312..a9346ef504b 100644 --- a/gdb/tui/tui-layout.h +++ b/gdb/tui/tui-layout.h @@ -174,4 +174,7 @@ private: extern void tui_add_win_to_layout (enum tui_win_type); extern void tui_set_layout (enum tui_layout_type); +/* Apply the current layout. */ +extern void tui_apply_current_layout (); + #endif /* TUI_TUI_LAYOUT_H */ -- 2.30.2