Don't derive tui_data_item_window from tui_gen_win_info
authorTom Tromey <tom@tromey.com>
Thu, 2 Jul 2020 03:21:12 +0000 (21:21 -0600)
committerTom Tromey <tom@tromey.com>
Thu, 2 Jul 2020 03:21:15 +0000 (21:21 -0600)
There's no deep reason that tui_data_item_window should derive from
tui_gen_win_info -- it currently uses a curses window to render, but
that isn't truly needed, and it adds some hacks to other parts of the
TUI.

This patch changes tui_data_item_window so that it doesn't have a base
class, and updates the register window.  This simplifies the code and
enables a subsequent cleanup.

gdb/ChangeLog
2020-07-01  Tom Tromey  <tom@tromey.com>

* tui/tui-regs.c (tui_data_window::display_registers_from)
(tui_data_window::display_registers_from)
(tui_data_window::first_data_item_displayed)
(tui_data_window::delete_data_content_windows): Update.
(tui_data_window::refresh_window, tui_data_window::no_refresh):
Remove.
(tui_data_window::check_register_values): Update.
(tui_data_item_window::rerender): Add parameters.  Update.
(tui_data_item_window::refresh_window): Remove.
* tui/tui-data.h (struct tui_gen_win_info) <no_refresh>: No longer
virtual.
* tui/tui-regs.h (struct tui_data_item_window): Don't derive from
tui_gen_win_info.
<refresh_window, max_height, min_height>: Remove.
<rerender>: Add parameters.
<x, y, visible>: New members.
(struct tui_data_window) <refresh_window, no_refresh>: Remove.
<m_item_width>: New member.

gdb/ChangeLog
gdb/tui/tui-data.h
gdb/tui/tui-regs.c
gdb/tui/tui-regs.h

index 22910344560969e1bf46311618afbbff05d31718..37484e402ff68e4faf9421b916285827315d7321 100644 (file)
@@ -1,3 +1,24 @@
+2020-07-01  Tom Tromey  <tom@tromey.com>
+
+       * tui/tui-regs.c (tui_data_window::display_registers_from)
+       (tui_data_window::display_registers_from)
+       (tui_data_window::first_data_item_displayed)
+       (tui_data_window::delete_data_content_windows): Update.
+       (tui_data_window::refresh_window, tui_data_window::no_refresh):
+       Remove.
+       (tui_data_window::check_register_values): Update.
+       (tui_data_item_window::rerender): Add parameters.  Update.
+       (tui_data_item_window::refresh_window): Remove.
+       * tui/tui-data.h (struct tui_gen_win_info) <no_refresh>: No longer
+       virtual.
+       * tui/tui-regs.h (struct tui_data_item_window): Don't derive from
+       tui_gen_win_info.
+       <refresh_window, max_height, min_height>: Remove.
+       <rerender>: Add parameters.
+       <x, y, visible>: New members.
+       (struct tui_data_window) <refresh_window, no_refresh>: Remove.
+       <m_item_width>: New member.
+
 2020-07-01  Tom Tromey  <tom@tromey.com>
 
        * tui/tui-regs.c (tui_data_window::show_register_group)
index d96384f6ce7121d986e47912e1ed15b6d19d3f58..10dd0aedcff861c7539798164ed351489a619d37 100644 (file)
@@ -102,7 +102,7 @@ public:
   }
 
   /* Disable output until the next call to doupdate.  */
-  virtual void no_refresh ()
+  void no_refresh ()
   {
     if (handle != nullptr)
       wnoutrefresh (handle.get ());
index fcabe73a5ea026d48e8f5ee9f5d5d922375be0d5..04d7469de5ab2f18a8d0d39316d057db106c2203 100644 (file)
@@ -272,8 +272,6 @@ tui_data_window::show_register_group (struct reggroup *group,
 void
 tui_data_window::display_registers_from (int start_element_no)
 {
-  int j, item_win_width, cur_y;
-
   int max_len = 0;
   for (auto &&data_item_win : m_regs_content)
     {
@@ -282,26 +280,28 @@ tui_data_window::display_registers_from (int start_element_no)
       if (len > max_len)
        max_len = len;
     }
-  item_win_width = max_len + 1;
+  m_item_width = max_len + 1;
   int i = start_element_no;
 
-  m_regs_column_count = (width - 2) / item_win_width;
+  m_regs_column_count = (width - 2) / m_item_width;
   if (m_regs_column_count == 0)
     m_regs_column_count = 1;
-  item_win_width = (width - 2) / m_regs_column_count;
+  m_item_width = (width - 2) / m_regs_column_count;
 
   /* Now create each data "sub" window, and write the display into
      it.  */
-  cur_y = 1;
+  int cur_y = 1;
   while (i < m_regs_content.size () && cur_y <= height - 2)
     {
-      for (j = 0;
+      for (int j = 0;
           j < m_regs_column_count && i < m_regs_content.size ();
           j++)
        {
          /* Create the window if necessary.  */
-         m_regs_content[i].resize (1, item_win_width,
-                                   x + (item_win_width * j) + 1, y + cur_y);
+         m_regs_content[i].x = (m_item_width * j) + 1;
+         m_regs_content[i].y = cur_y;
+         m_regs_content[i].visible = true;
+         m_regs_content[i].rerender (handle.get (), m_item_width);
          i++;          /* Next register.  */
        }
       cur_y++;         /* Next row.  */
@@ -372,10 +372,7 @@ tui_data_window::first_data_item_displayed ()
 {
   for (int i = 0; i < m_regs_content.size (); i++)
     {
-      struct tui_gen_win_info *data_item_win;
-
-      data_item_win = &m_regs_content[i];
-      if (data_item_win->is_visible ())
+      if (m_regs_content[i].visible)
        return i;
     }
 
@@ -387,8 +384,8 @@ tui_data_window::first_data_item_displayed ()
 void
 tui_data_window::delete_data_content_windows ()
 {
-  for (auto &&win : m_regs_content)
-    win.handle.reset (nullptr);
+  for (auto &win : m_regs_content)
+    win.visible = false;
 }
 
 
@@ -451,24 +448,6 @@ tui_data_window::do_scroll_vertical (int num_to_scroll)
     }
 }
 
-/* See tui-regs.h.  */
-
-void
-tui_data_window::refresh_window ()
-{
-  tui_gen_win_info::refresh_window ();
-  for (auto &&win : m_regs_content)
-    win.refresh_window ();
-}
-
-void
-tui_data_window::no_refresh ()
-{
-  tui_gen_win_info::no_refresh ();
-  for (auto &&win : m_regs_content)
-    win.no_refresh ();
-}
-
 /* This function check all displayed registers for changes in values,
    given a particular frame.  If the values have changed, they are
    updated with the new value and highlighted.  */
@@ -490,32 +469,28 @@ tui_data_window::check_register_values (struct frame_info *frame)
                            &data_item_win.highlight);
 
          if (data_item_win.highlight || was_hilighted)
-           data_item_win.rerender ();
+           data_item_win.rerender (handle.get (), m_item_width);
        }
     }
+
+  tui_wrefresh (handle.get ());
 }
 
 /* Display a register in a window.  If hilite is TRUE, then the value
    will be displayed in reverse video.  */
 void
-tui_data_item_window::rerender ()
+tui_data_item_window::rerender (WINDOW *handle, int field_width)
 {
-  int i;
-
-  scrollok (handle.get (), FALSE);
   if (highlight)
     /* We ignore the return value, casting it to void in order to avoid
        a compiler warning.  The warning itself was introduced by a patch
        to ncurses 5.7 dated 2009-08-29, changing this macro to expand
        to code that causes the compiler to generate an unused-value
        warning.  */
-    (void) wstandout (handle.get ());
+    (void) wstandout (handle);
       
-  wmove (handle.get (), 0, 0);
-  for (i = 1; i < width; i++)
-    waddch (handle.get (), ' ');
-  wmove (handle.get (), 0, 0);
-  waddstr (handle.get (), content.c_str ());
+  mvwaddnstr (handle, y, x, content.c_str (), field_width - 1);
+  waddstr (handle, n_spaces (field_width - content.size ()));
 
   if (highlight)
     /* We ignore the return value, casting it to void in order to avoid
@@ -523,21 +498,7 @@ tui_data_item_window::rerender ()
        to ncurses 5.7 dated 2009-08-29, changing this macro to expand
        to code that causes the compiler to generate an unused-value
        warning.  */
-    (void) wstandend (handle.get ());
-  refresh_window ();
-}
-
-void
-tui_data_item_window::refresh_window ()
-{
-  if (handle != nullptr)
-    {
-      /* This seems to be needed because the data items are nested
-        windows, which according to the ncurses man pages aren't well
-        supported.  */
-      touchwin (handle.get ());
-      tui_wrefresh (handle.get ());
-    }
+    (void) wstandend (handle);
 }
 
 /* Helper for "tui reg next", wraps a call to REGGROUP_NEXT, but adds wrap
index 8b5e941a0a0a61b8bb2a47cd2a3c9f28d0788c74..29b54a53ef324d77c68fd0c267d500a546395804 100644 (file)
@@ -26,7 +26,7 @@
 
 /* A data item window.  */
 
-struct tui_data_item_window : public tui_gen_win_info
+struct tui_data_item_window
 {
   tui_data_item_window () = default;
 
@@ -34,23 +34,15 @@ struct tui_data_item_window : public tui_gen_win_info
 
   tui_data_item_window (tui_data_item_window &&) = default;
 
-  void rerender () override;
-
-  void refresh_window () override;
-
-  int max_height () const override
-  {
-    return 1;
-  }
-
-  int min_height () const override
-  {
-    return 1;
-  }
+  void rerender (WINDOW *handle, int field_width);
 
+  /* Location.  */
+  int x = 0;
+  int y = 0;
   /* The register number.  */
   int regno = -1;
   bool highlight = false;
+  bool visible = false;
   std::string content;
 };
 
@@ -61,10 +53,6 @@ struct tui_data_window : public tui_win_info
 
   DISABLE_COPY_AND_ASSIGN (tui_data_window);
 
-  void refresh_window () override;
-
-  void no_refresh () override;
-
   const char *name () const override
   {
     return DATA_NAME;
@@ -138,6 +126,9 @@ private:
   std::vector<tui_data_item_window> m_regs_content;
   int m_regs_column_count = 0;
   struct reggroup *m_current_group = nullptr;
+
+  /* Width of each register's display area.  */
+  int m_item_width = 0;
 };
 
 #endif /* TUI_TUI_REGS_H */