aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog23
-rw-r--r--gdb/tui/tui-command.c2
-rw-r--r--gdb/tui/tui-data.h7
-rw-r--r--gdb/tui/tui-layout.c2
-rw-r--r--gdb/tui/tui-regs.c14
-rw-r--r--gdb/tui/tui-regs.h2
-rw-r--r--gdb/tui/tui-wingeneral.c46
-rw-r--r--gdb/tui/tui-wingeneral.h23
-rw-r--r--gdb/tui/tui.c2
9 files changed, 116 insertions, 5 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index d8482aa..a25f721 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,28 @@
2020-01-19 Tom Tromey <tom@tromey.com>
+ * tui/tui.c (tui_show_assembly): Use tui_suppress_output.
+ * tui/tui-wingeneral.h (class tui_suppress_output): New.
+ (tui_wrefresh): Declare.
+ * tui/tui-wingeneral.c (suppress_output): New global.
+ (tui_suppress_output, ~tui_suppress_output): New constructor and
+ destructor.
+ (tui_wrefresh): New function.
+ (tui_gen_win_info::refresh_window): Use tui_wrefresh.
+ (tui_gen_win_info::make_window): Call wnoutrefresh when needed.
+ * tui/tui-regs.h (struct tui_data_window) <no_refresh>: Declare
+ method.
+ * tui/tui-regs.c (tui_data_window::erase_data_content): Call
+ tui_wrefresh.
+ (tui_data_window::no_refresh): New method.
+ (tui_data_item_window::refresh_window): Call tui_wrefresh.
+ (tui_reg_command): Use tui_suppress_output
+ * tui/tui-layout.c (tui_set_layout): Use tui_suppress_output.
+ * tui/tui-data.h (struct tui_gen_win_info) <no_refresh>: New
+ method.
+ * tui/tui-command.c (tui_refresh_cmd_win): Call tui_wrefresh.
+
+2020-01-19 Tom Tromey <tom@tromey.com>
+
* tui/tui-winsource.c (tui_update_source_windows_with_line):
Handle case where symtab is null.
diff --git a/gdb/tui/tui-command.c b/gdb/tui/tui-command.c
index ba2a802..42fc59a 100644
--- a/gdb/tui/tui-command.c
+++ b/gdb/tui/tui-command.c
@@ -70,7 +70,7 @@ tui_refresh_cmd_win (void)
{
WINDOW *w = TUI_CMD_WIN->handle.get ();
- wrefresh (w);
+ tui_wrefresh (w);
/* FIXME: It's not clear why this is here.
It was present in the original tui_puts code and is kept in order to
diff --git a/gdb/tui/tui-data.h b/gdb/tui/tui-data.h
index ffdd5e3..6f86122 100644
--- a/gdb/tui/tui-data.h
+++ b/gdb/tui/tui-data.h
@@ -99,6 +99,13 @@ public:
return handle != nullptr;
}
+ /* Disable output until the next call to doupdate. */
+ virtual void no_refresh ()
+ {
+ if (handle != nullptr)
+ wnoutrefresh (handle.get ());
+ }
+
/* Window handle. */
std::unique_ptr<WINDOW, curses_deleter> handle;
/* Type of window. */
diff --git a/gdb/tui/tui-layout.c b/gdb/tui/tui-layout.c
index 01961f5..3d1e349 100644
--- a/gdb/tui/tui-layout.c
+++ b/gdb/tui/tui-layout.c
@@ -113,6 +113,8 @@ tui_set_layout (enum tui_layout_type layout_type)
if (new_layout != cur_layout)
{
+ tui_suppress_output suppress;
+
show_layout (new_layout);
/* Now determine where focus should be. */
diff --git a/gdb/tui/tui-regs.c b/gdb/tui/tui-regs.c
index 80d1a27..bedf55c 100644
--- a/gdb/tui/tui-regs.c
+++ b/gdb/tui/tui-regs.c
@@ -381,7 +381,7 @@ tui_data_window::erase_data_content (const char *prompt)
x_pos = half_width - strlen (prompt);
mvwaddstr (handle.get (), (height / 2), x_pos, (char *) prompt);
}
- wrefresh (handle.get ());
+ tui_wrefresh (handle.get ());
}
/* See tui-regs.h. */
@@ -434,6 +434,14 @@ tui_data_window::refresh_window ()
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. */
@@ -502,7 +510,7 @@ tui_data_item_window::refresh_window ()
windows, which according to the ncurses man pages aren't well
supported. */
touchwin (handle.get ());
- wrefresh (handle.get ());
+ tui_wrefresh (handle.get ());
}
}
@@ -574,6 +582,8 @@ tui_reg_command (const char *args, int from_tty)
/* Make sure the curses mode is enabled. */
tui_enable ();
+ tui_suppress_output suppress;
+
/* Make sure the register window is visible. If not, select an
appropriate layout. We need to do this before trying to run the
'next' or 'prev' commands. */
diff --git a/gdb/tui/tui-regs.h b/gdb/tui/tui-regs.h
index 97e02b1..eee3689 100644
--- a/gdb/tui/tui-regs.h
+++ b/gdb/tui/tui-regs.h
@@ -70,6 +70,8 @@ struct tui_data_window : public tui_win_info
void refresh_window () override;
+ void no_refresh () override;
+
const char *name () const override
{
return DATA_NAME;
diff --git a/gdb/tui/tui-wingeneral.c b/gdb/tui/tui-wingeneral.c
index 4331f63..e001a4c 100644
--- a/gdb/tui/tui-wingeneral.c
+++ b/gdb/tui/tui-wingeneral.c
@@ -30,13 +30,51 @@
#include "gdb_curses.h"
+/* This is true if we're currently suppressing output, via
+ wnoutrefresh. This is needed in case we create a new window while
+ in this mode. */
+
+static bool suppress_output;
+
+/* See tui-data.h. */
+
+tui_suppress_output::tui_suppress_output ()
+ : m_saved_suppress (suppress_output)
+{
+ suppress_output = true;
+
+ for (const auto &win : all_tui_windows ())
+ win->no_refresh ();
+}
+
+/* See tui-data.h. */
+
+tui_suppress_output::~tui_suppress_output ()
+{
+ suppress_output = m_saved_suppress;
+ if (!suppress_output)
+ doupdate ();
+
+ for (const auto &win : all_tui_windows ())
+ win->refresh_window ();
+}
+
+/* See tui-data.h. */
+
+void
+tui_wrefresh (WINDOW *win)
+{
+ if (!suppress_output)
+ wrefresh (win);
+}
+
/* See tui-data.h. */
void
tui_gen_win_info::refresh_window ()
{
if (handle != NULL)
- wrefresh (handle.get ());
+ tui_wrefresh (handle.get ());
}
/* Draw a border arround the window. */
@@ -134,7 +172,11 @@ tui_gen_win_info::make_window ()
{
handle.reset (newwin (height, width, y, x));
if (handle != NULL)
- scrollok (handle.get (), TRUE);
+ {
+ if (suppress_output)
+ wnoutrefresh (handle.get ());
+ scrollok (handle.get (), TRUE);
+ }
}
void
diff --git a/gdb/tui/tui-wingeneral.h b/gdb/tui/tui-wingeneral.h
index e32dbed..a28f27c 100644
--- a/gdb/tui/tui-wingeneral.h
+++ b/gdb/tui/tui-wingeneral.h
@@ -33,4 +33,27 @@ extern void tui_unhighlight_win (struct tui_win_info *);
extern void tui_highlight_win (struct tui_win_info *);
extern void tui_refresh_all ();
+/* An RAII class that suppresses output on construction (calling
+ wnoutrefresh on the existing windows), and then flushes the output
+ (via doupdate) when destroyed. */
+
+class tui_suppress_output
+{
+public:
+
+ tui_suppress_output ();
+ ~tui_suppress_output ();
+
+ DISABLE_COPY_AND_ASSIGN (tui_suppress_output);
+
+private:
+
+ /* Save the state of the suppression global. */
+ bool m_saved_suppress;
+};
+
+/* Call wrefresh on the given window. However, if output is being
+ suppressed via tui_suppress_output, do not call wrefresh. */
+extern void tui_wrefresh (WINDOW *win);
+
#endif /* TUI_TUI_WINGENERAL_H */
diff --git a/gdb/tui/tui.c b/gdb/tui/tui.c
index be19ef7..ae3b9f6 100644
--- a/gdb/tui/tui.c
+++ b/gdb/tui/tui.c
@@ -30,6 +30,7 @@
#include "tui/tui-regs.h"
#include "tui/tui-stack.h"
#include "tui/tui-win.h"
+#include "tui/tui-wingeneral.h"
#include "tui/tui-winsource.h"
#include "tui/tui-source.h"
#include "target.h"
@@ -577,6 +578,7 @@ tui_disable_command (const char *args, int from_tty)
void
tui_show_assembly (struct gdbarch *gdbarch, CORE_ADDR addr)
{
+ tui_suppress_output suppress;
tui_add_win_to_layout (DISASSEM_WIN);
tui_update_source_windows_with_addr (gdbarch, addr);
}