mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-27 04:52:05 +08:00
45bbae5c4b
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
80 lines
2.1 KiB
C
80 lines
2.1 KiB
C
/* Specific command window processing.
|
|
|
|
Copyright (C) 1998-2020 Free Software Foundation, Inc.
|
|
|
|
Contributed by Hewlett-Packard Company.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#include "defs.h"
|
|
#include "tui/tui.h"
|
|
#include "tui/tui-data.h"
|
|
#include "tui/tui-win.h"
|
|
#include "tui/tui-io.h"
|
|
#include "tui/tui-command.h"
|
|
#include "tui/tui-wingeneral.h"
|
|
|
|
#include "gdb_curses.h"
|
|
|
|
/* See tui-command.h. */
|
|
|
|
int
|
|
tui_cmd_window::max_height () const
|
|
{
|
|
return tui_term_height () - 4;
|
|
}
|
|
|
|
void
|
|
tui_cmd_window::resize (int height_, int width_, int origin_x, int origin_y)
|
|
{
|
|
width = width_;
|
|
height = height_;
|
|
x = origin_x;
|
|
y = origin_y;
|
|
|
|
if (handle == nullptr)
|
|
make_window ();
|
|
else
|
|
{
|
|
/* Another reason we don't call the base class method here is
|
|
that for the command window in particular, we want to avoid
|
|
destroying the underlying handle. We don't currently track
|
|
the contents of this window, and so have no way to re-render
|
|
it. However we can at least move it and keep the old size if
|
|
wresize isn't available. */
|
|
#ifdef HAVE_WRESIZE
|
|
wresize (handle.get (), height, width);
|
|
#endif
|
|
mvwin (handle.get (), y, x);
|
|
wmove (handle.get (), 0, 0);
|
|
}
|
|
}
|
|
|
|
/* See tui-command.h. */
|
|
|
|
void
|
|
tui_refresh_cmd_win (void)
|
|
{
|
|
WINDOW *w = TUI_CMD_WIN->handle.get ();
|
|
|
|
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
|
|
not introduce some subtle breakage. */
|
|
fflush (stdout);
|
|
}
|