diff options
author | Tom de Vries <tdevries@suse.de> | 2023-12-04 08:48:48 +0100 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2023-12-04 08:48:48 +0100 |
commit | d1a912db7fdf50c28224d20464bfa163d8438980 (patch) | |
tree | b17d70bbfa6bf7f7086c81a5dbdccd4bd7312dce | |
parent | 6497a01d1d38ca033188702068f38cf6dad75d84 (diff) | |
download | binutils-d1a912db7fdf50c28224d20464bfa163d8438980.zip binutils-d1a912db7fdf50c28224d20464bfa163d8438980.tar.gz binutils-d1a912db7fdf50c28224d20464bfa163d8438980.tar.bz2 |
[gdb/tui] Fix wrapping strings
I noticed that after resizing to a narrow window, I got:
...
┌────────────────┐
│ │
│[ No Source Avail
able ] │
│ │
└────────────────┘
...
Fix this by adding two new functions:
- tui_win_info::display_string (int y, int x, const char *str)
- tui_win_info::display_string (const char *str)
that make sure that borders are not overwritten, which get us instead:
...
┌────────────────┐
│ │
│[ No Source Avai│
│ │
│ │
└────────────────┘
...
Tested on x86_64-linux.
-rw-r--r-- | gdb/testsuite/gdb.tui/narrow.exp | 49 | ||||
-rw-r--r-- | gdb/testsuite/lib/tuiterm.exp | 15 | ||||
-rw-r--r-- | gdb/tui/tui-data.c | 30 | ||||
-rw-r--r-- | gdb/tui/tui-data.h | 8 | ||||
-rw-r--r-- | gdb/tui/tui-regs.c | 2 | ||||
-rw-r--r-- | gdb/tui/tui-source.c | 2 | ||||
-rw-r--r-- | gdb/tui/tui-winsource.c | 7 |
7 files changed, 106 insertions, 7 deletions
diff --git a/gdb/testsuite/gdb.tui/narrow.exp b/gdb/testsuite/gdb.tui/narrow.exp new file mode 100644 index 0000000..7407398 --- /dev/null +++ b/gdb/testsuite/gdb.tui/narrow.exp @@ -0,0 +1,49 @@ +# Copyright 2023 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# Test narrow window. + +tuiterm_env + +# We'd like to start out here with a narrow window, but that's currently not +# possible. So instead, we start out with a large one, and resize. +Term::clean_restart 24 80 + +if {![Term::enter_tui]} { + unsupported "TUI not supported" + return +} + +# Disable resize messages. They are long and will cause wrapping. +Term::command "maint set tui-resize-message off" + +# Scroll previous command off screen. It is long and will cause wrapping. +for {set i 0} {$i < 8} {incr i} { + Term::command "echo" +} + +Term::check_box "src box" 0 0 80 15 + +# Resize to narrow screen. +Term::resize 24 20 0 + +# Instead of waiting for the resize messages, wait for the resized box. +Term::wait_for_box "narrow src box" 0 0 20 15 + +Term::command "layout asm" +Term::check_box "narrow asm box" 0 0 20 15 + +Term::command "layout regs" +Term::check_box "narrow regs box" 0 0 20 8 diff --git a/gdb/testsuite/lib/tuiterm.exp b/gdb/testsuite/lib/tuiterm.exp index 854fde5..e668fe2 100644 --- a/gdb/testsuite/lib/tuiterm.exp +++ b/gdb/testsuite/lib/tuiterm.exp @@ -1102,6 +1102,21 @@ namespace eval Term { } } + # Wait until a box appears at the given coordinates. + proc wait_for_box {test_name x y width height} { + while 1 { + if { [accept_gdb_output] == 0 } { + return 0 + } + + set why [_check_box $x $y $width $height] + if {$why == ""} { + pass $test_name + break + } + } + } + # Check whether the text contents of the terminal match the # regular expression. Note that text styling is not considered. proc check_contents {test_name regexp} { diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c index fc90df2..c51bd11 100644 --- a/gdb/tui/tui-data.c +++ b/gdb/tui/tui-data.c @@ -164,6 +164,36 @@ tui_win_info::set_title (std::string &&new_title) } } +/* See tui-data.h. */ + +void +tui_win_info::display_string (int y, int x, const char *str) const +{ + int n = width - box_width () - x; + if (n <= 0) + return; + + mvwaddnstr (handle.get (), y, x, str, n); +} + +/* See tui-data.h. */ + +void +tui_win_info::display_string (const char *str) const +{ + int y, x; + getyx (handle.get (), y, x); + + /* Avoid Wunused-but-set-variable. */ + (void) y; + + int n = width - box_width () - x; + if (n <= 0) + return; + + waddnstr (handle.get (), str, n); +} + void tui_win_info::rerender () { diff --git a/gdb/tui/tui-data.h b/gdb/tui/tui-data.h index 82340e5..76d0de3 100644 --- a/gdb/tui/tui-data.h +++ b/gdb/tui/tui-data.h @@ -167,6 +167,14 @@ public: const std::string &title () const { return m_title; } + /* Display string STR in the window at position (Y,X), abbreviated if + necessary. */ + void display_string (int y, int x, const char *str) const; + + /* Display string STR in the window at the current cursor position, + abbreviated if necessary. */ + void display_string (const char *str) const; + /* Window handle. */ std::unique_ptr<WINDOW, curses_deleter> handle; /* Window width. */ diff --git a/gdb/tui/tui-regs.c b/gdb/tui/tui-regs.c index 01538d4..4c6ea8a 100644 --- a/gdb/tui/tui-regs.c +++ b/gdb/tui/tui-regs.c @@ -407,7 +407,7 @@ tui_data_window::erase_data_content (const char *prompt) x_pos = 1; else x_pos = half_width - strlen (prompt); - mvwaddstr (handle.get (), (height / 2), x_pos, (char *) prompt); + display_string (height / 2, x_pos, prompt); } tui_wrefresh (handle.get ()); } diff --git a/gdb/tui/tui-source.c b/gdb/tui/tui-source.c index 5e9a954..bce381a 100644 --- a/gdb/tui/tui-source.c +++ b/gdb/tui/tui-source.c @@ -253,5 +253,5 @@ tui_source_window::show_line_number (int offset) const tui_left_margin_verbose ? "%0*d%c" : "%*d%c", m_digits - 1, lineno, space); } - waddstr (handle.get (), text); + display_string (text); } diff --git a/gdb/tui/tui-winsource.c b/gdb/tui/tui-winsource.c index ea4ca21..acbaef9 100644 --- a/gdb/tui/tui-winsource.c +++ b/gdb/tui/tui-winsource.c @@ -223,10 +223,7 @@ tui_source_window_base::do_erase_source_content (const char *str) x_pos = 1; else x_pos = half_width - strlen (str); - mvwaddstr (handle.get (), - (height / 2), - x_pos, - (char *) str); + display_string (height / 2, x_pos, str); refresh_window (); } @@ -697,7 +694,7 @@ tui_source_window_base::update_exec_info (bool refresh_p) if (src_element->is_exec_point) element[TUI_EXEC_POS] = '>'; - mvwaddstr (handle.get (), i + box_width (), box_width (), element); + display_string (i + box_width (), box_width (), element); show_line_number (i); } |