From: Tom Tromey <tom@tromey.com>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tom@tromey.com>
Subject: [PATCH 07/11] Don't derive tui_data_item_window from tui_gen_win_info
Date: Wed, 17 Jun 2020 20:15:19 -0600 [thread overview]
Message-ID: <20200618021523.10681-8-tom@tromey.com> (raw)
In-Reply-To: <20200618021523.10681-1-tom@tromey.com>
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.
2020-06-15 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 | 21 ++++++++++++
gdb/tui/tui-data.h | 2 +-
gdb/tui/tui-regs.c | 79 ++++++++++++----------------------------------
gdb/tui/tui-regs.h | 27 ++++++----------
4 files changed, 51 insertions(+), 78 deletions(-)
diff --git a/gdb/tui/tui-data.h b/gdb/tui/tui-data.h
index d96384f6ce7..10dd0aedcff 100644
--- a/gdb/tui/tui-data.h
+++ b/gdb/tui/tui-data.h
@@ -102,7 +102,7 @@ struct tui_gen_win_info
}
/* 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 fcabe73a5ea..04d7469de5a 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 8b5e941a0a0..29b54a53ef3 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 @@ struct tui_data_window : public tui_win_info
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 */
--
2.17.2
next prev parent reply other threads:[~2020-06-18 2:15 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-18 2:15 [PATCH 00/11] TUI cleanups Tom Tromey
2020-06-18 2:15 ` [PATCH 01/11] Use complete_on_enum in tui_reggroup_completer Tom Tromey
2020-06-18 2:15 ` [PATCH 02/11] Remove tui_expand_tabs Tom Tromey
2020-06-18 2:15 ` [PATCH 03/11] Move some code out of tui-data.h Tom Tromey
2020-06-18 2:15 ` [PATCH 04/11] Remove tui_data_window::name Tom Tromey
2020-06-18 2:15 ` [PATCH 05/11] Remove useless "if' from tui-regs.c Tom Tromey
2020-06-18 2:15 ` [PATCH 06/11] Rename tui_data_item_window::item_no Tom Tromey
2020-06-18 2:15 ` Tom Tromey [this message]
2020-06-18 2:15 ` [PATCH 08/11] Remove body of tui_locator_window constructor Tom Tromey
2020-06-18 2:15 ` [PATCH 09/11] Derive tui_locator_window from tui_win_info Tom Tromey
2020-09-20 0:58 ` Simon Marchi
2020-06-18 2:15 ` [PATCH 10/11] Remove tui_gen_win_info Tom Tromey
2020-06-18 2:15 ` [PATCH 11/11] Make tui_win_info::name pure virtual Tom Tromey
2020-07-02 3:24 ` [PATCH 00/11] TUI cleanups 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=20200618021523.10681-8-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).