aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog14
-rw-r--r--gdb/cli/cli-style.c2
-rw-r--r--gdb/observable.c1
-rw-r--r--gdb/observable.h4
-rw-r--r--gdb/tui/tui-hooks.c14
-rw-r--r--gdb/tui/tui-winsource.c44
-rw-r--r--gdb/tui/tui-winsource.h1
7 files changed, 61 insertions, 19 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 24de651..2fcd6cd 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+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-13 Tom Tromey <tromey@adacore.com>
* i386-gnu-nat.c (i386_gnu_nat_target::fetch_registers)
diff --git a/gdb/cli/cli-style.c b/gdb/cli/cli-style.c
index ec385da..fc91504 100644
--- a/gdb/cli/cli-style.c
+++ b/gdb/cli/cli-style.c
@@ -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
diff --git a/gdb/observable.c b/gdb/observable.c
index 3311206..c077b02 100644
--- a/gdb/observable.c
+++ b/gdb/observable.c
@@ -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 */
diff --git a/gdb/observable.h b/gdb/observable.h
index 999ecfb..edd1fff 100644
--- a/gdb/observable.h
+++ b/gdb/observable.h
@@ -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 */
diff --git a/gdb/tui/tui-hooks.c b/gdb/tui/tui-hooks.c
index 98c6fd6..4a1d79e 100644
--- a/gdb/tui/tui-hooks.c
+++ b/gdb/tui/tui-hooks.c
@@ -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_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 {};
@@ -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. */
diff --git a/gdb/tui/tui-winsource.c b/gdb/tui/tui-winsource.c
index 9336f7b..7fd460b 100644
--- a/gdb/tui/tui-winsource.c
+++ b/gdb/tui/tui-winsource.c
@@ -306,8 +306,32 @@ tui_show_source_content (struct tui_win_info *win_info)
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,
@@ -315,20 +339,7 @@ tui_horizontal_source_scroll (struct tui_win_info *win_info,
{
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
@@ -341,13 +352,8 @@ tui_horizontal_source_scroll (struct tui_win_info *win_info,
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;
}
diff --git a/gdb/tui/tui-winsource.h b/gdb/tui/tui-winsource.h
index db33a4f..920032b 100644
--- a/gdb/tui/tui-winsource.h
+++ b/gdb/tui/tui-winsource.h
@@ -56,6 +56,7 @@ extern void tui_show_source_content (struct tui_win_info *);
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 *);