+2019-03-14 Pedro Alves <palves@redhat.com>
+ Tom Tromey <tromey@adacore.com>
+
+ * tui/tui-winsource.h (tui_refill_source_window): Declare.
+ * tui/tui-winsource.c (tui_refill_source_window): New function,
+ from...
+ (tui_horizontal_source_scroll): ... here. Move some logic.
+ * 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.
+
2019-03-12 Eli Zaretskii <eliz@gnu.org>
PR/24325
#include "cli/cli-cmds.h"
#include "cli/cli-style.h"
#include "source-cache.h"
+#include "observable.h"
/* True if styling is enabled. */
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
DEFINE_OBSERVABLE (inferior_call_post);
DEFINE_OBSERVABLE (register_changed);
DEFINE_OBSERVABLE (user_selected_context_changed);
+DEFINE_OBSERVABLE (source_styling_changed);
} /* namespace observers */
} /* namespace gdb */
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 */
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_refill_source_window (tui_win_list[SRC_WIN]);
+ }
+}
+
/* Token associated with observers registered while TUI hooks are
installed. */
static const gdb::observers::token tui_observers_token {};
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. */
win_info->generic.content_in_use = TRUE;
}
+/* Refill the source window's source cache and update it. If WIN_INFO
+ is a disassembly window, then just update it. */
+
+void
+tui_refill_source_window (struct tui_win_info *win_info)
+{
+ symtab *s = nullptr;
+
+ if (win_info->generic.type == SRC_WIN)
+ {
+ symtab_and_line cursal = get_current_source_symtab_and_line ();
+ s = (cursal.symtab == NULL
+ ? find_pc_line_symtab (get_frame_pc (get_selected_frame (NULL)))
+ : cursal.symtab);
+ }
+
+ tui_update_source_window_as_is (win_info,
+ win_info->detail.source_info.gdbarch,
+ s,
+ win_info->generic.content[0]
+ ->which_element.source.line_or_addr,
+ FALSE);
+}
/* Scroll the source forward or backward horizontally. */
+
void
tui_horizontal_source_scroll (struct tui_win_info *win_info,
enum tui_scroll_direction direction,
{
if (win_info->generic.content != NULL)
{
- struct gdbarch *gdbarch = win_info->detail.source_info.gdbarch;
int offset;
- struct symtab *s = NULL;
-
- if (win_info->generic.type == SRC_WIN)
- {
- struct symtab_and_line cursal
- = get_current_source_symtab_and_line ();
-
- if (cursal.symtab == NULL)
- s = find_pc_line_symtab (get_frame_pc (get_selected_frame (NULL)));
- else
- s = cursal.symtab;
- }
if (direction == LEFT_SCROLL)
offset = win_info->detail.source_info.horizontal_offset
offset = 0;
}
win_info->detail.source_info.horizontal_offset = offset;
- tui_update_source_window_as_is (win_info, gdbarch, s,
- win_info->generic.content[0]
- ->which_element.source.line_or_addr,
- FALSE);
+ tui_refill_source_window (win_info);
}
-
- return;
}
extern void tui_horizontal_source_scroll (struct tui_win_info *,
enum tui_scroll_direction,
int);
+extern void tui_refill_source_window (struct tui_win_info *);
extern enum tui_status tui_set_exec_info_content (struct tui_win_info *);
extern void tui_show_exec_info_content (struct tui_win_info *);
extern void tui_erase_exec_info_content (struct tui_win_info *);