+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):
{
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
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. */
if (new_layout != cur_layout)
{
+ tui_suppress_output suppress;
+
show_layout (new_layout);
/* Now determine where focus should be. */
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. */
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. */
windows, which according to the ncurses man pages aren't well
supported. */
touchwin (handle.get ());
- wrefresh (handle.get ());
+ tui_wrefresh (handle.get ());
}
}
/* 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. */
void refresh_window () override;
+ void no_refresh () override;
+
const char *name () const override
{
return DATA_NAME;
#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. */
{
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
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 */
#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"
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);
}