From b73dd8779c0530e91c6e5067eab4cb7ca3f794d5 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 28 Jun 2019 14:48:45 -0600 Subject: [PATCH] Make source windows be self-updating This changes the TUI source window to register itself on the source_styling_changed observable, and removes a bit of code from tui-hooks.c. This reduces the number of uses of the TUI_SRC_WIN global. gdb/ChangeLog 2019-07-17 Tom Tromey * tui/tui-source.c (tui_source_window): New constructor. Add observer. (~tui_source_window): New destructor. (tui_source_window::style_changed): New method. * tui/tui-hooks.c (tui_redisplay_source): Remove. (tui_attach_detach_observers): Update. * tui/tui-data.h (struct tui_source_window): Make constructor not inline. Add destructor. (struct tui_source_window) : New method. : New member. --- gdb/ChangeLog | 13 +++++++++++++ gdb/tui/tui-data.h | 14 ++++++++++---- gdb/tui/tui-hooks.c | 14 -------------- gdb/tui/tui-source.c | 20 ++++++++++++++++++++ 4 files changed, 43 insertions(+), 18 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c7318267a1f..1235b1a382d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,16 @@ +2019-07-17 Tom Tromey + + * tui/tui-source.c (tui_source_window): New constructor. Add + observer. + (~tui_source_window): New destructor. + (tui_source_window::style_changed): New method. + * tui/tui-hooks.c (tui_redisplay_source): Remove. + (tui_attach_detach_observers): Update. + * tui/tui-data.h (struct tui_source_window): Make constructor not + inline. Add destructor. + (struct tui_source_window) : New method. + : New member. + 2019-07-17 Tom Tromey * tui/tui-data.c (tui_clear_source_windows_detail): Fix typo. diff --git a/gdb/tui/tui-data.h b/gdb/tui/tui-data.h index bd22f9eec69..be951b4c840 100644 --- a/gdb/tui/tui-data.h +++ b/gdb/tui/tui-data.h @@ -24,6 +24,7 @@ #include "tui/tui.h" /* For enum tui_win_type. */ #include "gdb_curses.h" /* For WINDOW. */ +#include "observable.h" /* This is a point definition. */ struct tui_point @@ -424,10 +425,8 @@ public: struct tui_source_window : public tui_source_window_base { - tui_source_window () - : tui_source_window_base (SRC_WIN) - { - } + tui_source_window (); + ~tui_source_window (); DISABLE_COPY_AND_ASSIGN (tui_source_window); @@ -439,6 +438,13 @@ struct tui_source_window : public tui_source_window_base protected: void do_scroll_vertical (int num_to_scroll) override; + +private: + + void style_changed (); + + /* A token used to register and unregister an observer. */ + gdb::observers::token m_observable; }; /* A TUI disassembly window. */ diff --git a/gdb/tui/tui-hooks.c b/gdb/tui/tui-hooks.c index 71010530749..84acd3ac2e6 100644 --- a/gdb/tui/tui-hooks.c +++ b/gdb/tui/tui-hooks.c @@ -204,18 +204,6 @@ tui_normal_stop (struct bpstats *bs, int print_frame) tui_refresh_frame_and_register_information (/*registers_too_p=*/1); } -/* Observer for source_cache_cleared. */ - -static void -tui_redisplay_source () -{ - if (tui_is_window_visible (SRC_WIN)) - { - /* Force redisplay. */ - TUI_SRC_WIN->refill (); - } -} - /* Token associated with observers registered while TUI hooks are installed. */ static const gdb::observers::token tui_observers_token {}; @@ -251,8 +239,6 @@ tui_attach_detach_observers (bool attach) tui_normal_stop, attach); attach_or_detach (gdb::observers::register_changed, tui_register_changed, attach); - attach_or_detach (gdb::observers::source_styling_changed, - tui_redisplay_source, attach); } /* Install the TUI specific hooks. */ diff --git a/gdb/tui/tui-source.c b/gdb/tui/tui-source.c index e62ee4ea5f9..34cb38b31af 100644 --- a/gdb/tui/tui-source.c +++ b/gdb/tui/tui-source.c @@ -325,3 +325,23 @@ tui_source_window::do_scroll_vertical (int num_to_scroll) print_source_lines (s, l.u.line_no, l.u.line_no + 1, 0); } } + +tui_source_window::tui_source_window () + : tui_source_window_base (SRC_WIN) +{ + gdb::observers::source_styling_changed.attach + (std::bind (&tui_source_window::style_changed, this), + m_observable); +} + +tui_source_window::~tui_source_window () +{ + gdb::observers::source_styling_changed.detach (m_observable); +} + +void +tui_source_window::style_changed () +{ + if (tui_active && is_visible) + refill (); +} -- 2.30.2