public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Tom Tromey <tom@tromey.com>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tom@tromey.com>
Subject: [PATCH] Fix TUI text centering
Date: Fri,  9 Feb 2024 16:56:47 -0700	[thread overview]
Message-ID: <20240209235647.2163118-1-tom@tromey.com> (raw)

In a couple of spots, the TUI tries to center some text in the window.
Andrew noticed that the calculation is done strangely and the text
ends up somewhat to the left of center.

This patch fixes the problem.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31355
---
 gdb/testsuite/gdb.tui/regs.exp |  5 ++++-
 gdb/tui/tui-data.c             | 20 +++++++++++++++-----
 gdb/tui/tui-data.h             |  6 +++---
 gdb/tui/tui-regs.c             | 12 +-----------
 gdb/tui/tui-winsource.c        | 20 +++-----------------
 5 files changed, 26 insertions(+), 37 deletions(-)

diff --git a/gdb/testsuite/gdb.tui/regs.exp b/gdb/testsuite/gdb.tui/regs.exp
index ea78b57d1a7..183c2ea0f03 100644
--- a/gdb/testsuite/gdb.tui/regs.exp
+++ b/gdb/testsuite/gdb.tui/regs.exp
@@ -46,7 +46,10 @@ Term::check_box "source box in regs layout" 0 7 80 8
 
 # The current frame is main, check that registers are available.
 set re_reg_vals_unavailable \
-    [string_to_regexp {[ Register Values Unavailable ]}]
+    [string_to_regexp \
+	 [string cat \
+	      [string repeat " " 23] \
+	      {[ Register Values Unavailable ]}]]
 gdb_assert \
     { ![Term::check_region_contents_p 0 0 80 8 $re_reg_vals_unavailable] } \
     "Register values available"
diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 38a87a2a6e9..03395d2df09 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -169,13 +169,23 @@ 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
+tui_win_info::center_string (const char *str)
 {
-  int n = width - box_width () - x;
-  if (n <= 0)
-    return;
+  werase (handle.get ());
+  check_and_display_highlight_if_needed ();
+
+  int avail_width = width - box_size ();
+  int len = strlen (str);
+
+  int x_pos = box_width ();
+  if (len < avail_width)
+    x_pos += (avail_width - len) / 2;
+
+  int n = avail_width - x_pos;
+  gdb_assert (n > 0);
 
-  mvwaddnstr (handle.get (), y, x, str, n);
+  mvwaddnstr (handle.get (), height / 2, x_pos, str, n);
+  refresh_window ();
 }
 
 /* See tui-data.h.  */
diff --git a/gdb/tui/tui-data.h b/gdb/tui/tui-data.h
index 1714f5ae455..4a44a0bc6e8 100644
--- a/gdb/tui/tui-data.h
+++ b/gdb/tui/tui-data.h
@@ -167,9 +167,9 @@ 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;
+  /* Clear the window, maybe draw the boarder, and then display string
+     STR centered in the window, abbreviated if necessary.  */
+  void center_string (const char *str);
 
   /* Display string STR in the window at the current cursor position,
      abbreviated if necessary.  */
diff --git a/gdb/tui/tui-regs.c b/gdb/tui/tui-regs.c
index 504aed4b81f..f5c2ec1bb58 100644
--- a/gdb/tui/tui-regs.c
+++ b/gdb/tui/tui-regs.c
@@ -354,17 +354,7 @@ tui_data_window::first_data_item_displayed ()
 void
 tui_data_window::erase_data_content ()
 {
-  werase (handle.get ());
-  check_and_display_highlight_if_needed ();
-
-  const char *prompt = _("[ Register Values Unavailable ]");
-  int half_width = (width - box_size ()) / 2;
-  int x_pos;
-  if (strlen (prompt) >= half_width)
-    x_pos = 1;
-  else
-    x_pos = half_width - strlen (prompt);
-  display_string (height / 2, x_pos, prompt);
+  center_string (_("[ Register Values Unavailable ]"));
 }
 
 /* See tui-regs.h.  */
diff --git a/gdb/tui/tui-winsource.c b/gdb/tui/tui-winsource.c
index 2631714f248..6b8716cd27c 100644
--- a/gdb/tui/tui-winsource.c
+++ b/gdb/tui/tui-winsource.c
@@ -222,23 +222,9 @@ tui_update_source_windows_with_line (struct symtab_and_line sal)
 void
 tui_source_window_base::do_erase_source_content (const char *str)
 {
-  int x_pos;
-  int half_width = (width - box_size ()) / 2;
-
   m_content.clear ();
-  if (handle != NULL)
-    {
-      werase (handle.get ());
-      check_and_display_highlight_if_needed ();
-
-      if (strlen (str) >= half_width)
-	x_pos = 1;
-      else
-	x_pos = half_width - strlen (str);
-      display_string (height / 2, x_pos, str);
-
-      refresh_window ();
-    }
+  if (handle != nullptr)
+    center_string (str);
 }
 
 /* See tui-winsource.h.  */
@@ -714,7 +700,7 @@ tui_source_window_base::update_exec_info (bool refresh_p)
       if (src_element->is_exec_point)
 	element[TUI_EXEC_POS] = '>';
 
-      display_string (i + box_width (), box_width (), element);
+      mvwaddstr (handle.get (), i + box_width (), box_width (), element);
 
       show_line_number (i);
     }
-- 
2.43.0


             reply	other threads:[~2024-02-09 23:56 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-09 23:56 Tom Tromey [this message]
2024-03-02  1:15 ` Tom Tromey

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240209235647.2163118-1-tom@tromey.com \
    --to=tom@tromey.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).