summaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2019-06-28 14:48:45 -0600
committerTom Tromey <tom@tromey.com>2019-07-17 12:19:04 -0600
commitb73dd8779c0530e91c6e5067eab4cb7ca3f794d5 (patch)
treee717d03900daf50b3c3644b10d40b2927bdce635 /gdb
parentae2b53806d3ce384e349c722b21a7ad246102d5b (diff)
downloadbinutils-gdb-b73dd8779c0530e91c6e5067eab4cb7ca3f794d5.tar.gz
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 <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.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog13
-rw-r--r--gdb/tui/tui-data.h14
-rw-r--r--gdb/tui/tui-hooks.c14
-rw-r--r--gdb/tui/tui-source.c20
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,5 +1,18 @@
2019-07-17 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.
+
+2019-07-17 Tom Tromey <tom@tromey.com>
+
* tui/tui-data.c (tui_clear_source_windows_detail): Fix typo.
* tui/tui-win.c (tui_resize_all): 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 ();
+}