From 7134f2eb9230f86adb8839ac9cc737c7f4b47b59 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 1 Jul 2020 21:21:12 -0600 Subject: Don't derive tui_data_item_window from tui_gen_win_info 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 * 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 longer virtual. * tui/tui-regs.h (struct tui_data_item_window): Don't derive from tui_gen_win_info. : Remove. : Add parameters. : New members. (struct tui_data_window) : Remove. : New member. --- gdb/tui/tui-data.h | 2 +- gdb/tui/tui-regs.c | 79 ++++++++++++++---------------------------------------- gdb/tui/tui-regs.h | 27 +++++++------------ 3 files changed, 30 insertions(+), 78 deletions(-) (limited to 'gdb/tui') diff --git a/gdb/tui/tui-data.h b/gdb/tui/tui-data.h index d96384f..10dd0ae 100644 --- a/gdb/tui/tui-data.h +++ b/gdb/tui/tui-data.h @@ -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 ()); diff --git a/gdb/tui/tui-regs.c b/gdb/tui/tui-regs.c index fcabe73..04d7469 100644 --- a/gdb/tui/tui-regs.c +++ b/gdb/tui/tui-regs.c @@ -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 diff --git a/gdb/tui/tui-regs.h b/gdb/tui/tui-regs.h index 8b5e941..29b54a5 100644 --- a/gdb/tui/tui-regs.h +++ b/gdb/tui/tui-regs.h @@ -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 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 */ -- cgit v1.1