[gnome-builder/wip/gtk4-port: 1119/1774] plugins/debuggerui: set breakpoint address in disassembly
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/gtk4-port: 1119/1774] plugins/debuggerui: set breakpoint address in disassembly
- Date: Mon, 11 Jul 2022 22:31:35 +0000 (UTC)
commit c069388e677df4f3a876d33205b59ee29ca690ed
Author: Christian Hergert <chergert redhat com>
Date: Mon May 23 13:36:44 2022 -0700
plugins/debuggerui: set breakpoint address in disassembly
This tries to copy the breakpoint style from the style scheme if available
and if not uses the current-line style for something that might look rather
breakpoint'ish.
.../debuggerui/ide-debugger-disassembly-view.c | 110 ++++++++++++++++++++-
.../debuggerui/ide-debugger-disassembly-view.ui | 2 +
.../debuggerui/ide-debugger-workspace-addin.c | 7 +-
3 files changed, 116 insertions(+), 3 deletions(-)
---
diff --git a/src/plugins/debuggerui/ide-debugger-disassembly-view.c
b/src/plugins/debuggerui/ide-debugger-disassembly-view.c
index 88f7bb386..b9cd5348c 100644
--- a/src/plugins/debuggerui/ide-debugger-disassembly-view.c
+++ b/src/plugins/debuggerui/ide-debugger-disassembly-view.c
@@ -28,6 +28,9 @@
#include "ide-debugger-disassembly-view.h"
#include "ide-debugger-instruction.h"
+#define TAG_CURRENT_BKPT "-Builder:current-breakpoint"
+#define TAG_CURRENT_LINE "current-line"
+
struct _IdeDebuggerDisassemblyView
{
IdePage parent_instance;
@@ -38,12 +41,15 @@ struct _IdeDebuggerDisassemblyView
/* Template references */
GtkSourceView *source_view;
GtkSourceBuffer *source_buffer;
+ GtkTextTag *breakpoint;
IdeDebuggerAddress current_address;
};
G_DEFINE_FINAL_TYPE (IdeDebuggerDisassemblyView, ide_debugger_disassembly_view, IDE_TYPE_PAGE)
+static GdkRGBA fallback_paragraph_bg;
+
static gboolean
style_scheme_name_to_object (GBinding *binding,
const GValue *from_value,
@@ -58,6 +64,67 @@ style_scheme_name_to_object (GBinding *binding,
return TRUE;
}
+static void
+setup_breakpoint_tag (IdeDebuggerDisassemblyView *self)
+{
+ GtkSourceStyleScheme *scheme;
+ GtkSourceStyle *style;
+
+ g_assert (IDE_IS_DEBUGGER_DISASSEMBLY_VIEW (self));
+
+ if (self->breakpoint == NULL)
+ self->breakpoint = gtk_text_buffer_create_tag (GTK_TEXT_BUFFER (self->source_buffer), NULL, NULL);
+ else
+ g_object_set (self->breakpoint,
+ "paragraph-background", NULL,
+ "background", NULL,
+ "foreground", NULL,
+ "paragraph-background-set", FALSE,
+ "background-set", FALSE,
+ "foreground-set", FALSE,
+ NULL);
+
+ if ((scheme = gtk_source_buffer_get_style_scheme (self->source_buffer)))
+ {
+ if ((style = gtk_source_style_scheme_get_style (scheme, TAG_CURRENT_BKPT)))
+ gtk_source_style_apply (style, self->breakpoint);
+ else if ((style = gtk_source_style_scheme_get_style (scheme, TAG_CURRENT_LINE)))
+ {
+ g_autoptr(GdkRGBA) background = NULL;
+ gboolean background_set = FALSE;
+
+ gtk_source_style_apply (style, self->breakpoint);
+
+ g_object_get (self->breakpoint,
+ "background-rgba", &background,
+ "background-set", &background_set,
+ NULL);
+
+ /* Use paragraph background instead of background */
+ if (background_set)
+ g_object_set (self->breakpoint,
+ "background-set", FALSE,
+ "paragraph-background-rgba", background,
+ NULL);
+ }
+ else
+ g_object_set (self->breakpoint,
+ "paragraph-background-rgba", &fallback_paragraph_bg,
+ NULL);
+ }
+}
+
+static void
+notify_style_scheme_cb (IdeDebuggerDisassemblyView *self,
+ GParamSpec *pspec,
+ GtkSourceBuffer *buffer)
+{
+ g_assert (IDE_IS_DEBUGGER_DISASSEMBLY_VIEW (self));
+ g_assert (GTK_SOURCE_IS_BUFFER (buffer));
+
+ setup_breakpoint_tag (self);
+}
+
static void
ide_debugger_disassembly_view_dispose (GObject *object)
{
@@ -79,8 +146,11 @@ ide_debugger_disassembly_view_class_init (IdeDebuggerDisassemblyViewClass *klass
gtk_widget_class_set_template_from_resource (widget_class,
"/plugins/debuggerui/ide-debugger-disassembly-view.ui");
gtk_widget_class_bind_template_child (widget_class, IdeDebuggerDisassemblyView, source_buffer);
gtk_widget_class_bind_template_child (widget_class, IdeDebuggerDisassemblyView, source_view);
+ gtk_widget_class_bind_template_callback (widget_class, notify_style_scheme_cb);
g_resources_register (gbp_debuggerui_get_resource ());
+
+ gdk_rgba_parse (&fallback_paragraph_bg, "#ffff0099");
}
static void
@@ -103,15 +173,50 @@ ide_debugger_disassembly_view_init (IdeDebuggerDisassemblyView *self)
NULL, NULL, NULL);
}
+static void
+apply_breakpoint_tag (IdeDebuggerDisassemblyView *self,
+ const GtkTextIter *begin,
+ const GtkTextIter *end)
+{
+ g_assert (IDE_IS_DEBUGGER_DISASSEMBLY_VIEW (self));
+ g_assert (begin != NULL);
+ g_assert (end != NULL);
+
+ setup_breakpoint_tag (self);
+ gtk_text_buffer_apply_tag (GTK_TEXT_BUFFER (self->source_buffer),
+ self->breakpoint,
+ begin, end);
+}
+
void
ide_debugger_disassembly_view_set_current_address (IdeDebuggerDisassemblyView *self,
IdeDebuggerAddress current_address)
{
+ g_autofree char *key = NULL;
+ GtkTextIter iter;
+ GtkTextIter limit;
+ GtkTextIter begin;
+ GtkTextIter end;
+
g_return_if_fail (IDE_IS_DEBUGGER_DISASSEMBLY_VIEW (self));
self->current_address = current_address;
- /* Update gutter/etc */
+ gtk_text_buffer_get_bounds (GTK_TEXT_BUFFER (self->source_buffer), &iter, &limit);
+ key = g_strdup_printf ("0x%"G_GINT64_MODIFIER"x", current_address);
+ while (gtk_text_iter_forward_search (&iter, key, 0, &begin, &end, &limit))
+ {
+ if (gtk_text_iter_starts_line (&begin))
+ {
+ end = begin;
+ gtk_text_iter_forward_line (&end);
+ apply_breakpoint_tag (self, &begin, &end);
+ gtk_text_buffer_select_range (GTK_TEXT_BUFFER (self->source_buffer), &begin, &begin);
+ break;
+ }
+
+ iter = end;
+ }
}
/**
@@ -166,5 +271,8 @@ ide_debugger_disassembly_view_set_instructions (IdeDebuggerDisassemblyView *self
trim = iter;
gtk_text_iter_backward_char (&iter);
gtk_text_buffer_delete (GTK_TEXT_BUFFER (self->source_buffer), &iter, &trim);
+
+ gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (self->source_buffer), &iter);
+ gtk_text_buffer_select_range (GTK_TEXT_BUFFER (self->source_buffer), &iter, &iter);
}
}
diff --git a/src/plugins/debuggerui/ide-debugger-disassembly-view.ui
b/src/plugins/debuggerui/ide-debugger-disassembly-view.ui
index a74c41b23..4d59ccdf5 100644
--- a/src/plugins/debuggerui/ide-debugger-disassembly-view.ui
+++ b/src/plugins/debuggerui/ide-debugger-disassembly-view.ui
@@ -10,6 +10,7 @@
<child>
<object class="GtkSourceView" id="source_view">
<property name="show-line-numbers">true</property>
+ <property name="left-margin">0</property>
<property name="editable">false</property>
<property name="monospace">true</property>
<property name="buffer">source_buffer</property>
@@ -19,5 +20,6 @@
</child>
</template>
<object class="GtkSourceBuffer" id="source_buffer">
+ <signal name="notify::style-scheme" handler="notify_style_scheme_cb" swapped="true"
object="IdeDebuggerDisassemblyView"/>
</object>
</interface>
diff --git a/src/plugins/debuggerui/ide-debugger-workspace-addin.c
b/src/plugins/debuggerui/ide-debugger-workspace-addin.c
index 30e1e4329..807374397 100644
--- a/src/plugins/debuggerui/ide-debugger-workspace-addin.c
+++ b/src/plugins/debuggerui/ide-debugger-workspace-addin.c
@@ -76,6 +76,8 @@ struct _IdeDebuggerWorkspaceAddin
IdeDebuggerRegistersView *registers_view;
IdeDebuggerThreadsView *threads_view;
IdeDebuggerLogView *log_view;
+
+ IdeDebuggerAddress current_address;
};
static void
@@ -502,8 +504,7 @@ ide_debugger_workspace_addin_disassemble_cb (GObject *object,
}
ide_debugger_disassembly_view_set_instructions (self->disassembly_view, instructions);
-
- /* TODO: Set current instruction */
+ ide_debugger_disassembly_view_set_current_address (self->disassembly_view, self->current_address);
panel_widget_raise (PANEL_WIDGET (self->disassembly_view));
@@ -535,6 +536,8 @@ ide_debugger_workspace_addin_navigate_to_address (IdeDebuggerWorkspaceAddin *sel
else
range.to = address + 0x80;
+ self->current_address = address;
+
ide_debugger_disassemble_async (debugger,
&range,
NULL,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]