diff options
author | Tom Tromey <tom@tromey.com> | 2020-07-01 21:21:12 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2020-07-01 21:21:15 -0600 |
commit | 7134f2eb9230f86adb8839ac9cc737c7f4b47b59 (patch) | |
tree | 5beb2778dee4f284d05d5a6988b96e745031ecf2 /gdb/tui | |
parent | 22b7b0412bceb80ecd5de39a8e05742eb3cbb324 (diff) | |
download | binutils-7134f2eb9230f86adb8839ac9cc737c7f4b47b59.zip binutils-7134f2eb9230f86adb8839ac9cc737c7f4b47b59.tar.gz binutils-7134f2eb9230f86adb8839ac9cc737c7f4b47b59.tar.bz2 |
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 <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.
Diffstat (limited to 'gdb/tui')
-rw-r--r-- | gdb/tui/tui-data.h | 2 | ||||
-rw-r--r-- | gdb/tui/tui-regs.c | 79 | ||||
-rw-r--r-- | gdb/tui/tui-regs.h | 27 |
3 files changed, 30 insertions, 78 deletions
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<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 */ |