aboutsummaryrefslogtreecommitdiff
path: root/gdb/tui/tui-wingeneral.c
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2019-12-27 08:47:41 -0700
committerTom Tromey <tom@tromey.com>2020-01-19 13:08:49 -0700
commit45bbae5c4b34ef6336cc2a3951f1edf191ff3733 (patch)
tree7daa2af44651c0455b9101c8a265ce89037a0dc5 /gdb/tui/tui-wingeneral.c
parent4f13c1c00be32131845ae50aef788d4f2c652dff (diff)
downloadgdb-45bbae5c4b34ef6336cc2a3951f1edf191ff3733.zip
gdb-45bbae5c4b34ef6336cc2a3951f1edf191ff3733.tar.gz
gdb-45bbae5c4b34ef6336cc2a3951f1edf191ff3733.tar.bz2
Remove flickering from the TUI
In some cases, the TUI flickers when redrawing. This can be seen mostly easily when switching layouts. This patch fixes the problem by exploiting the double buffering that curses already does. In some spots, the TUI will now disable flushing the curses buffers to the screen; and then flush them all at once when the rendering is complete. gdb/ChangeLog 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. Change-Id: Icb832ae100b861de3af3307488e636fa928d5c9f
Diffstat (limited to 'gdb/tui/tui-wingeneral.c')
-rw-r--r--gdb/tui/tui-wingeneral.c46
1 files changed, 44 insertions, 2 deletions
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