diff options
-rw-r--r-- | gdb/ChangeLog | 23 | ||||
-rw-r--r-- | gdb/tui/tui-command.c | 2 | ||||
-rw-r--r-- | gdb/tui/tui-data.h | 7 | ||||
-rw-r--r-- | gdb/tui/tui-layout.c | 2 | ||||
-rw-r--r-- | gdb/tui/tui-regs.c | 14 | ||||
-rw-r--r-- | gdb/tui/tui-regs.h | 2 | ||||
-rw-r--r-- | gdb/tui/tui-wingeneral.c | 46 | ||||
-rw-r--r-- | gdb/tui/tui-wingeneral.h | 23 | ||||
-rw-r--r-- | gdb/tui/tui.c | 2 |
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); } |