[RFC,8.3,1/3] Make TUI react to "set style enabled"
Commit Message
When the user toggles "set style enabled", the TUI should react by
redrawing the source window, if necessary. This patch implements this
behavior.
No test because the TUI is generally not tested.
I was not sure of a clean way to force an update of the window's
contents; see the new tui_redisplay_source for the workaround I used.
gdb/ChangeLog
2019-03-08 Tom Tromey <tromey@adacore.com>
* cli/cli-style.c (set_style_enabled): Notify new observable.
* tui/tui-hooks.c (tui_redisplay_source): New function.
(tui_attach_detach_observers): Attach or detach
tui_redisplay_source.
* observable.h (source_styling_changed): New observable.
* observable.c: Define source_styling_changed observable.
---
gdb/ChangeLog | 9 +++++++++
gdb/cli/cli-style.c | 2 ++
gdb/observable.c | 1 +
gdb/observable.h | 4 ++++
gdb/tui/tui-hooks.c | 14 ++++++++++++++
5 files changed, 30 insertions(+)
@@ -21,6 +21,7 @@
#include "cli/cli-cmds.h"
#include "cli/cli-style.h"
#include "source-cache.h"
+#include "observable.h"
/* True if styling is enabled. */
@@ -216,6 +217,7 @@ static void
set_style_enabled (const char *args, int from_tty, struct cmd_list_element *c)
{
g_source_cache.clear ();
+ gdb::observers::source_styling_changed.notify ();
}
static void
@@ -74,6 +74,7 @@ DEFINE_OBSERVABLE (inferior_call_pre);
DEFINE_OBSERVABLE (inferior_call_post);
DEFINE_OBSERVABLE (register_changed);
DEFINE_OBSERVABLE (user_selected_context_changed);
+DEFINE_OBSERVABLE (source_styling_changed);
} /* namespace observers */
} /* namespace gdb */
@@ -228,6 +228,10 @@ extern observable<struct frame_info *, int> register_changed;
frame has changed. */
extern observable<user_selected_what> user_selected_context_changed;
+/* This is notified when the source styling setting has changed and
+ should be reconsulted. */
+extern observable<> source_styling_changed;
+
} /* namespace observers */
} /* namespace gdb */
@@ -204,6 +204,18 @@ 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_horizontal_source_scroll (tui_win_list[SRC_WIN], LEFT_SCROLL, 0);
+ }
+}
+
/* Token associated with observers registered while TUI hooks are
installed. */
static const gdb::observers::token tui_observers_token {};
@@ -239,6 +251,8 @@ 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. */