[gdb/tui] Add tui_win_info::{box_width,box_size}
authorTom de Vries <tdevries@suse.de>
Mon, 13 Nov 2023 20:22:50 +0000 (21:22 +0100)
committerTom de Vries <tdevries@suse.de>
Mon, 13 Nov 2023 20:22:50 +0000 (21:22 +0100)
In tui_source_window::set_contents we have:
...
  /* Take hilite (window border) into account, when
     calculating the number of lines.  */
  int nlines = height - 2;
...

The '2' represents the total size of the window border (or box, in can_box
terms), in this case one line at the top and one line at the bottom.

Likewise, '1' is used to represent the width of the window border.

Introduce new functions:
- tui_win_info::box_width () and
- tui_win_info::box_size ()
that can be used instead instead of these hardcoded constants.

Implement these such that they return 0 when can_box () == false.

Tested patch completeness by making all windows unboxed:
...
@@ -85,7 +85,7 @@ struct tui_win_info
   /* Return true if this window can be boxed.  */
   virtual bool can_box () const
   {
-    return true;
+    return false;
   }

   int box_width () const
...
and test-driving TUI.

This required eliminating an assert in
tui_source_window_base::show_source_content, I've included that part as well.

Tested on x86_64-linux.

Approved-By: Tom Tromey <tom@tromey.com>
gdb/tui/tui-data.h
gdb/tui/tui-disasm.c
gdb/tui/tui-regs.c
gdb/tui/tui-source.c
gdb/tui/tui-wingeneral.c
gdb/tui/tui-winsource.c
gdb/tui/tui-winsource.h

index a1e44f77cc1b5b74639aa62d294f77b8a5ca76b5..5bb5ef9d94180ad05841f390def6f449c7a8126a 100644 (file)
@@ -88,6 +88,18 @@ public:
     return true;
   }
 
+  /* Return the width of the box.  */
+  int box_width () const
+  {
+    return can_box () ? 1 : 0;
+  }
+
+  /* Return the size of the box.  */
+  int box_size () const
+  {
+    return 2 * box_width ();
+  }
+
   /* Resize this window.  The parameters are used to set the window's
      size and position.  */
   virtual void resize (int height, int width,
index dcafbfbb802f8dfbba242ad762615b73f73f94b2..ffcb95bb635fb6cf62c3aa9f7aa2cd39b1dac411 100644 (file)
@@ -341,7 +341,7 @@ tui_disasm_window::set_contents (struct gdbarch *arch,
   cur_pc = tui_location.addr ();
 
   /* Window size, excluding highlight box.  */
-  max_lines = height - 2;
+  max_lines = height - box_size ();
 
   /* Get temporary table that will hold all strings (addr & insn).  */
   std::vector<tui_asm_line> asm_lines;
index 1a351e60cee9e7c6dd5aed159e1dace603b952ee..01538d499611f44503f861a8b91e09b47e99358c 100644 (file)
@@ -281,15 +281,15 @@ tui_data_window::display_registers_from (int start_element_no)
   for (i = 0; i < start_element_no; i++)
     m_regs_content[i].y = 0;
 
-  m_regs_column_count = (width - 2) / m_item_width;
+  m_regs_column_count = (width - box_size ()) / m_item_width;
   if (m_regs_column_count == 0)
     m_regs_column_count = 1;
-  m_item_width = (width - 2) / m_regs_column_count;
+  m_item_width = (width - box_size ()) / m_regs_column_count;
 
   /* Now create each data "sub" window, and write the display into
      it.  */
   int cur_y = 1;
-  while (i < m_regs_content.size () && cur_y <= height - 2)
+  while (i < m_regs_content.size () && cur_y <= height - box_size ())
     {
       for (int j = 0;
           j < m_regs_column_count && i < m_regs_content.size ();
@@ -325,7 +325,7 @@ tui_data_window::display_reg_element_at_line (int start_element_no,
       int last_line_no, first_line_on_last_page;
 
       last_line_no = last_regs_line_no ();
-      first_line_on_last_page = last_line_no - (height - 2);
+      first_line_on_last_page = last_line_no - (height - box_size ());
       if (first_line_on_last_page < 0)
        first_line_on_last_page = 0;
 
@@ -400,7 +400,7 @@ tui_data_window::erase_data_content (const char *prompt)
   check_and_display_highlight_if_needed ();
   if (prompt != NULL)
     {
-      int half_width = (width - 2) / 2;
+      int half_width = (width - box_size ()) / 2;
       int x_pos;
 
       if (strlen (prompt) >= half_width)
index 6625f0cf0885686fb38a57958358d411aea7a72c..5e9a954f7c2eecd15c8fe55af9b83b6172419014 100644 (file)
@@ -53,7 +53,7 @@ tui_source_window::set_contents (struct gdbarch *arch,
 
   /* Take hilite (window border) into account, when
      calculating the number of lines.  */
-  int nlines = height - 2;
+  int nlines = height - box_size ();
 
   std::string srclines;
   const std::vector<off_t> *offsets;
@@ -201,7 +201,7 @@ tui_source_window::line_is_displayed (int line) const
 void
 tui_source_window::maybe_update (frame_info_ptr fi, symtab_and_line sal)
 {
-  int start_line = (sal.line - ((height - 2) / 2)) + 1;
+  int start_line = (sal.line - ((height - box_size ()) / 2)) + 1;
   if (start_line <= 0)
     start_line = 1;
 
index 5e1b3d2e62e17f6914c448c9994cf42ab1042e62..af4fc746cba780fdab581953284711d020ca81ca 100644 (file)
@@ -106,7 +106,7 @@ box_win (struct tui_win_info *win_info,
     {
       /* Emit "+-TITLE-+" -- so 2 characters on the right and 2 on
         the left.  */
-      int max_len = win_info->width - 2 - 2;
+      int max_len = win_info->width - win_info->box_size () - 2;
 
       if (win_info->title ().size () <= max_len)
        mvwaddstr (win, 0, 2, win_info->title ().c_str ());
index 7eabc522d850251e49b1731094aca36291f88220..83ce48090a0b073e5272a66956219251de88162b 100644 (file)
@@ -211,7 +211,7 @@ void
 tui_source_window_base::do_erase_source_content (const char *str)
 {
   int x_pos;
-  int half_width = (width - 2) / 2;
+  int half_width = (width - box_size ()) / 2;
 
   m_content.clear ();
   if (handle != NULL)
@@ -347,7 +347,7 @@ tui_source_window_base::refresh_window ()
   gdb_assert (pad_width > 0 || m_pad.get () == nullptr);
   gdb_assert (pad_x + view_width <= pad_width || m_pad.get () == nullptr);
 
-  int sminrow = y + 1;
+  int sminrow = y + box_width ();
   int smincol = x + left_margin;
   int smaxrow = sminrow + m_content.size () - 1;
   int smaxcol = smincol + view_width - 1;
@@ -412,11 +412,15 @@ tui_source_window_base::show_source_content ()
   for (int lineno = 0; lineno < m_content.size (); lineno++)
     show_source_line (lineno);
 
-  /* Calling check_and_display_highlight_if_needed will call refresh_window
-     (so long as the current window can be boxed), which will ensure that
-     the newly loaded window content is copied to the screen.  */
-  gdb_assert (can_box ());
-  check_and_display_highlight_if_needed ();
+  if (can_box ())
+    {
+      /* Calling check_and_display_highlight_if_needed will call refresh_window
+        (so long as the current window can be boxed), which will ensure that
+        the newly loaded window content is copied to the screen.  */
+      check_and_display_highlight_if_needed ();
+    }
+  else
+    refresh_window ();
 }
 
 tui_source_window_base::tui_source_window_base ()
@@ -693,7 +697,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 + 1, 1, element);
+      mvwaddstr (handle.get (), i + box_width (), box_width (), element);
 
       show_line_number (i);
     }
index 4a35512190626c0c8917494ab31a5fbc9cf87c43..dccce0efca175153d1663973f6f6fd0a769ebf54 100644 (file)
@@ -206,13 +206,13 @@ private:
   /* Return the size of the left margin space, this is the space used to
      display things like breakpoint markers.  */
   int left_margin () const
-  { return 1 + TUI_EXECINFO_SIZE + extra_margin (); }
+  { return box_width () + TUI_EXECINFO_SIZE + extra_margin (); }
 
   /* Return the width of the area that is available for window content.
      This is the window width minus the borders and the left margin, which
      is used for displaying things like breakpoint markers.  */
   int view_width () const
-  { return width - left_margin () - 1; }
+  { return width - left_margin () - box_width (); }
 
   void show_source_content ();