[gnome-builder/wip/gtk4-port] plugins/debuggerui: set breakpoint address in disassembly



commit a5458c27acc935a355ee5524784cd222036aef8b
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]