From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-out2.suse.de (smtp-out2.suse.de [IPv6:2a07:de40:b251:101:10:150:64:2]) by sourceware.org (Postfix) with ESMTPS id 27FB0386183A for ; Mon, 4 Dec 2023 07:52:11 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 27FB0386183A Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 27FB0386183A Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a07:de40:b251:101:10:150:64:2 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1701676333; cv=none; b=ggPMZMuSyWOBv4PSpBlN5VPaiFKGiP9Ej/76+GJSA0LwcJn3+leFGD0cKpEjcQEDIFa+r/7LCpU1WDdD6W3NKHmlAdceEzkXdB/2PnqpvLWOiuxMlrmhS+u0ELw9RYxO1Cyz6g7jVkYpSQtWfUNeipslPiRmcyRwA0gyXNPHVBo= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1701676333; c=relaxed/simple; bh=Ma1q0K2LP+eBTDsenez7UNSD1AIbCYPVR1aV9V281wM=; h=DKIM-Signature:DKIM-Signature:Message-ID:Date:MIME-Version: Subject:From:To; b=LwDzlIMbVY6/sp7N521BzBksX/bV3b9IwierOlTEi1hISRM9sI64nBNFP/Pas+eONHeRbuPjcr5GcjBt9FOUt2zm1EiEMhWTuTeZQoTBz0Ks9lMlcVg2AERYPJrLvcfdZRoa6U5UnZ0p8ee1/I4gnkpndXw91RBzmUEBwO69RNY= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from imap1.dmz-prg2.suse.org (imap1.dmz-prg2.suse.org [10.150.64.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 09CA91FE4F for ; Mon, 4 Dec 2023 07:52:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1701676330; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=T24n4juMTqLmhpb7br+6+clNRiaym+pmdRytb6Wl3BI=; b=iUCDkNr9dg9rzsq+9Mnp90H1GpWpDglGiVySNFQ6kqWjhBQTkE0daBJ60uUbgd+JmIk+rS BZxy2bgyO29hpzWBxG7QUtfOQl4s+HbknlBFiecOETmWJDNGHquHtoGQHPH3J344EZsrCO d0nfa5W4wpFinxo2aw0gXHf9XVBiU0E= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1701676330; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=T24n4juMTqLmhpb7br+6+clNRiaym+pmdRytb6Wl3BI=; b=/S8ksxtcoSIG7Q3EKV5UsuCrBWb7S1P6IfzlveBSbuGibW5cLtaL5e66zYYvNKnTwo/Pkc jGPacFYGQRzA1TDg== Received: from imap1.dmz-prg2.suse.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id EAE0D139AA for ; Mon, 4 Dec 2023 07:52:09 +0000 (UTC) Received: from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167]) by imap1.dmz-prg2.suse.org with ESMTPSA id L+yKNymFbWVgGQAAD6G6ig (envelope-from ) for ; Mon, 04 Dec 2023 07:52:09 +0000 Message-ID: Date: Mon, 4 Dec 2023 08:52:09 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH] [gdb/tui] Fix wrapping strings From: Tom de Vries To: gdb-patches@sourceware.org References: <20231124062725.19129-1-tdevries@suse.de> Content-Language: en-US In-Reply-To: <20231124062725.19129-1-tdevries@suse.de> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Authentication-Results: smtp-out2.suse.de; none X-Spam-Score: 3.82 X-Spamd-Result: default: False [3.82 / 50.00]; ARC_NA(0.00)[]; RCVD_VIA_SMTP_AUTH(0.00)[]; XM_UA_NO_VERSION(0.01)[]; FROM_HAS_DN(0.00)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; NEURAL_HAM_LONG(-1.00)[-1.000]; MIME_GOOD(-0.10)[text/plain]; PREVIOUSLY_DELIVERED(0.00)[gdb-patches@sourceware.org]; TO_DN_NONE(0.00)[]; RCPT_COUNT_ONE(0.00)[1]; RCVD_COUNT_THREE(0.00)[3]; BAYES_SPAM(5.10)[100.00%]; DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519]; NEURAL_HAM_SHORT(-0.19)[-0.946]; FUZZY_BLOCKED(0.00)[rspamd.com]; FROM_EQ_ENVFROM(0.00)[]; MIME_TRACE(0.00)[0:+]; RCVD_TLS_ALL(0.00)[]; MID_RHS_MATCH_FROM(0.00)[] X-Spam-Status: No, score=-10.9 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On 11/24/23 07:27, Tom de Vries wrote: > 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│ > │ │ > │ │ > └────────────────┘ > ... > Committed with this formatting mistake fixed: ... - (void)y; + (void) y; ... Thanks, - Tom > Tested on x86_64-linux. > --- > gdb/testsuite/gdb.tui/narrow.exp | 49 ++++++++++++++++++++++++++++++++ > gdb/testsuite/lib/tuiterm.exp | 15 ++++++++++ > gdb/tui/tui-data.c | 30 +++++++++++++++++++ > gdb/tui/tui-data.h | 8 ++++++ > gdb/tui/tui-regs.c | 2 +- > gdb/tui/tui-source.c | 2 +- > gdb/tui/tui-winsource.c | 7 ++--- > 7 files changed, 106 insertions(+), 7 deletions(-) > create mode 100644 gdb/testsuite/gdb.tui/narrow.exp > > diff --git a/gdb/testsuite/gdb.tui/narrow.exp b/gdb/testsuite/gdb.tui/narrow.exp > new file mode 100644 > index 00000000000..7407398799d > --- /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 . > + > +# 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 854fde56393..e668fe207e3 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 fc90df25ddd..5cc4894401c 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 82340e594ee..76d0de3a3f0 100644 > --- a/gdb/tui/tui-data.h > +++ b/gdb/tui/tui-data.h > @@ -167,6 +167,14 @@ struct tui_win_info > 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 handle; > /* Window width. */ > diff --git a/gdb/tui/tui-regs.c b/gdb/tui/tui-regs.c > index 01538d49961..4c6ea8aff0d 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 5e9a954f7c2..bce381add28 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 ea4ca219292..acbaef95e0c 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); > } > > base-commit: dd5516bf98fdb8acf242dbeabe8f6b20aafd842f