[22/61] Make source windows be self-updating

Message ID 20190704170311.15982-23-tom@tromey.com
State New
Headers show
Series
  • More TUI refactorings
Related show

Commit Message

Tom Tromey July 4, 2019, 5:02 p.m.
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.

2019-07-04  Tom Tromey  <tom@tromey.com>

	* 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) <style_changed>: New method.
	<m_observable>: 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(-)

-- 
2.17.2

Patch

diff --git a/gdb/tui/tui-data.h b/gdb/tui/tui-data.h
index 76f6bc6102c..c456bd7db84 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 ();
+}