diff options
author | Tom Tromey <tom@tromey.com> | 2019-12-27 08:47:41 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2020-01-19 13:08:49 -0700 |
commit | 45bbae5c4b34ef6336cc2a3951f1edf191ff3733 (patch) | |
tree | 7daa2af44651c0455b9101c8a265ce89037a0dc5 /gdb/tui/tui-wingeneral.c | |
parent | 4f13c1c00be32131845ae50aef788d4f2c652dff (diff) | |
download | gdb-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.c | 46 |
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 |