[gnome-builder] plugins/debuggerui: port debugger ui to GTK 4



commit b4a5ade24eb494dcb86ec980fb3388c948eca3ab
Author: Christian Hergert <chergert redhat com>
Date:   Mon Jul 11 22:30:37 2022 -0700

    plugins/debuggerui: port debugger ui to GTK 4
    
     - Remove libdazzle usage
     - Use libadwaita where appropriate
     - Add a new workspace addin for setup
     - Implement IdeDebuggerTool to bridge IdeDebugger to IdeRunManager

 src/plugins/debuggerui/builder-disassembly.lang    |  81 +++
 src/plugins/debuggerui/debuggerui-plugin.c         |  16 +-
 src/plugins/debuggerui/debuggerui.gresource.xml    |   6 +-
 src/plugins/debuggerui/debuggerui.plugin           |   2 +-
 src/plugins/debuggerui/gbp-debugger-tool.c         | 146 +++++
 src/plugins/debuggerui/gbp-debugger-tool.h         |  31 +
 src/plugins/debuggerui/gtk/keybindings.json        |   1 +
 src/plugins/debuggerui/gtk/menus.ui                |  47 +-
 .../debuggerui/ide-debugger-breakpoints-view.c     |  56 +-
 .../debuggerui/ide-debugger-breakpoints-view.h     |   4 +-
 .../debuggerui/ide-debugger-breakpoints-view.ui    |   2 +-
 src/plugins/debuggerui/ide-debugger-controls.c     |  41 +-
 src/plugins/debuggerui/ide-debugger-controls.h     |  13 +-
 src/plugins/debuggerui/ide-debugger-controls.ui    |  91 ++-
 .../debuggerui/ide-debugger-disassembly-view.c     | 186 +++++-
 .../debuggerui/ide-debugger-disassembly-view.ui    |   7 +-
 src/plugins/debuggerui/ide-debugger-editor-addin.c | 638 ---------------------
 src/plugins/debuggerui/ide-debugger-editor-addin.h |  39 --
 .../debuggerui/ide-debugger-hover-controls.c       |  18 +-
 .../debuggerui/ide-debugger-hover-controls.h       |   4 +-
 .../debuggerui/ide-debugger-hover-controls.ui      |   2 +-
 .../debuggerui/ide-debugger-hover-provider.c       |  64 ++-
 .../debuggerui/ide-debugger-libraries-view.c       |  50 +-
 .../debuggerui/ide-debugger-libraries-view.h       |   4 +-
 .../debuggerui/ide-debugger-libraries-view.ui      |   2 +-
 src/plugins/debuggerui/ide-debugger-locals-view.c  |  22 +-
 src/plugins/debuggerui/ide-debugger-locals-view.h  |   4 +-
 src/plugins/debuggerui/ide-debugger-locals-view.ui |   2 +-
 src/plugins/debuggerui/ide-debugger-log-view.c     |   4 +-
 src/plugins/debuggerui/ide-debugger-log-view.ui    |   5 +-
 .../debuggerui/ide-debugger-registers-view.c       |  39 +-
 .../debuggerui/ide-debugger-registers-view.h       |   4 +-
 .../debuggerui/ide-debugger-registers-view.ui      |   2 +-
 src/plugins/debuggerui/ide-debugger-threads-view.c |  46 +-
 src/plugins/debuggerui/ide-debugger-threads-view.h |   4 +-
 .../debuggerui/ide-debugger-threads-view.ui        |  10 +-
 .../debuggerui/ide-debugger-workspace-addin.c      | 503 ++++++++++++++++
 .../debuggerui/ide-debugger-workspace-addin.h      |  39 ++
 src/plugins/debuggerui/meson.build                 |   3 +-
 .../{themes/Adwaita-shared.css => style.css}       |   0
 40 files changed, 1289 insertions(+), 949 deletions(-)
---
diff --git a/src/plugins/debuggerui/builder-disassembly.lang b/src/plugins/debuggerui/builder-disassembly.lang
new file mode 100644
index 000000000..24d557e64
--- /dev/null
+++ b/src/plugins/debuggerui/builder-disassembly.lang
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ide-debugger.lang
+
+Copyright 2022 Christian Hergert <chergert redhat com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+SPDX-License-Identifier: GPL-3.0-or-later
+-->
+<language id="builder-disassembly" name="builder-disassembly" hidden="true" version="2.0">
+
+  <styles>
+    <style id="offset"       name="Address Offset"      map-to="def:floating-point"/>
+    <style id="address"      name="Address"             map-to="def:base-n-integer"/>
+    <style id="instruction"  name="Instruction"         map-to="def:keyword"/>
+    <style id="function"     name="Function"            map-to="def:function"/>
+    <style id="location"     name="Location"            map-to="def:preprocessor"/>
+    <style id="register"     name="Register"            map-to="def:special-char"/>
+  </styles>
+
+  <definitions>
+    <context id="instructions">
+      <match extended="true">:\t([a-zA-Z0-9]+)</match>
+      <include>
+        <context id="instruction" sub-pattern="1" style-ref="instruction"/>
+      </include>
+    </context>
+
+    <context id="function" style-ref="function">
+      <match>[a-zA-Z][a-zA-Z0-9_:]?</match>
+    </context>
+
+    <context id="offset" style-ref="offset">
+      <match extended="true">\+[0-9]+</match>
+    </context>
+
+    <context id="location" style-ref="location">
+      <start>&lt;</start>
+      <end>&gt;</end>
+      <include>
+        <context ref="function"/>
+        <context ref="offset"/>
+      </include>
+    </context>
+
+    <context id="register" style-ref="register">
+      <match>%[a-z0-9]+</match>
+    </context>
+
+    <context id="address" style-ref="address">
+      <match extended="true">
+        (?&lt;![\w\.])
+        \$?0[xX][a-fA-F0-9]+
+        (?![\w\.])
+      </match>
+    </context>
+
+    <!-- Main Context -->
+    <context id="builder-disassembly">
+      <include>
+        <context ref="address"/>
+        <context ref="instructions"/>
+        <context ref="register"/>
+        <context ref="location"/>
+      </include>
+    </context>
+  </definitions>
+
+</language>
diff --git a/src/plugins/debuggerui/debuggerui-plugin.c b/src/plugins/debuggerui/debuggerui-plugin.c
index e240b614c..ddcc054d7 100644
--- a/src/plugins/debuggerui/debuggerui-plugin.c
+++ b/src/plugins/debuggerui/debuggerui-plugin.c
@@ -22,21 +22,25 @@
 
 #include "config.h"
 
+#include <libpeas/peas.h>
+
 #include <libide-debugger.h>
-#include <libide-editor.h>
 #include <libide-gui.h>
-#include <libpeas/peas.h>
 
-#include "ide-debugger-editor-addin.h"
+#include "gbp-debugger-tool.h"
 #include "ide-debugger-hover-provider.h"
+#include "ide-debugger-workspace-addin.h"
 
 void
 _gbp_debuggerui_register_types (PeasObjectModule *module)
 {
   peas_object_module_register_extension_type (module,
-                                              IDE_TYPE_EDITOR_ADDIN,
-                                              IDE_TYPE_DEBUGGER_EDITOR_ADDIN);
+                                              IDE_TYPE_RUN_TOOL,
+                                              GBP_TYPE_DEBUGGER_TOOL);
   peas_object_module_register_extension_type (module,
-                                              IDE_TYPE_HOVER_PROVIDER,
+                                              GTK_SOURCE_TYPE_HOVER_PROVIDER,
                                               IDE_TYPE_DEBUGGER_HOVER_PROVIDER);
+  peas_object_module_register_extension_type (module,
+                                              IDE_TYPE_WORKSPACE_ADDIN,
+                                              IDE_TYPE_DEBUGGER_WORKSPACE_ADDIN);
 }
diff --git a/src/plugins/debuggerui/debuggerui.gresource.xml b/src/plugins/debuggerui/debuggerui.gresource.xml
index e9a6952a1..dc3e411ac 100644
--- a/src/plugins/debuggerui/debuggerui.gresource.xml
+++ b/src/plugins/debuggerui/debuggerui.gresource.xml
@@ -3,6 +3,8 @@
   <gresource prefix="/plugins/debuggerui">
     <file>debuggerui.plugin</file>
     <file>gtk/menus.ui</file>
+    <file>gtk/keybindings.json</file>
+    <file>style.css</file>
     <file preprocess="xml-stripblanks">ide-debugger-breakpoints-view.ui</file>
     <file preprocess="xml-stripblanks">ide-debugger-controls.ui</file>
     <file preprocess="xml-stripblanks">ide-debugger-disassembly-view.ui</file>
@@ -12,6 +14,8 @@
     <file preprocess="xml-stripblanks">ide-debugger-registers-view.ui</file>
     <file preprocess="xml-stripblanks">ide-debugger-threads-view.ui</file>
     <file preprocess="xml-stripblanks">ide-debugger-log-view.ui</file>
-    <file>themes/Adwaita-shared.css</file>
+  </gresource>
+  <gresource prefix="/org/gnome/builder/gtksourceview/language-specs">
+    <file>builder-disassembly.lang</file>
   </gresource>
 </gresources>
diff --git a/src/plugins/debuggerui/debuggerui.plugin b/src/plugins/debuggerui/debuggerui.plugin
index 1e51808ad..e927ab27d 100644
--- a/src/plugins/debuggerui/debuggerui.plugin
+++ b/src/plugins/debuggerui/debuggerui.plugin
@@ -2,7 +2,7 @@
 Authors=Christian Hergert <christian hergert me>
 Builtin=true
 Copyright=Copyright © 2014-2018 Christian Hergert
-Depends=editor;buildui;
+Depends=buildui;
 Description=Builder's visual debugger
 Embedded=_gbp_debuggerui_register_types
 Hidden=true
diff --git a/src/plugins/debuggerui/gbp-debugger-tool.c b/src/plugins/debuggerui/gbp-debugger-tool.c
new file mode 100644
index 000000000..cce27695e
--- /dev/null
+++ b/src/plugins/debuggerui/gbp-debugger-tool.c
@@ -0,0 +1,146 @@
+/* gbp-debugger-tool.c
+ *
+ * Copyright 2022 Christian Hergert <chergert redhat com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#define G_LOG_DOMAIN "gbp-debugger-tool"
+
+#include "config.h"
+
+#include <libide-debugger.h>
+
+#include "ide-debug-manager-private.h"
+
+#include "gbp-debugger-tool.h"
+
+struct _GbpDebuggerTool
+{
+  IdeRunTool parent_instance;
+};
+
+G_DEFINE_FINAL_TYPE (GbpDebuggerTool, gbp_debugger_tool, IDE_TYPE_RUN_TOOL)
+
+static void
+gbp_debugger_tool_send_signal (IdeRunTool *run_tool,
+                               int         signum)
+{
+  GbpDebuggerTool *self = (GbpDebuggerTool *)run_tool;
+  IdeDebugManager *debug_manager;
+  IdeDebugger *debugger;
+  IdeContext *context;
+
+  IDE_ENTRY;
+
+  g_assert (IDE_IS_MAIN_THREAD ());
+  g_assert (GBP_IS_DEBUGGER_TOOL (self));
+
+  context = ide_object_get_context (IDE_OBJECT (self));
+  debug_manager = ide_debug_manager_from_context (context);
+  debugger = ide_debug_manager_get_debugger (debug_manager);
+
+  if (debugger != NULL)
+    ide_debugger_send_signal_async (debugger, signum, NULL, NULL, NULL);
+
+  IDE_EXIT;
+}
+
+static void
+gbp_debugger_tool_prepare_to_run (IdeRunTool    *run_tool,
+                                  IdePipeline   *pipeline,
+                                  IdeRunCommand *run_command,
+                                  IdeRunContext *run_context)
+{
+  GbpDebuggerTool *self = (GbpDebuggerTool *)run_tool;
+  IdeDebugManager *debug_manager;
+  IdeContext *context;
+
+  IDE_ENTRY;
+
+  g_assert (IDE_IS_MAIN_THREAD ());
+  g_assert (GBP_IS_DEBUGGER_TOOL (self));
+  g_assert (IDE_IS_PIPELINE (pipeline));
+  g_assert (IDE_IS_RUN_COMMAND (run_command));
+  g_assert (IDE_IS_RUN_CONTEXT (run_context));
+
+  context = ide_object_get_context (IDE_OBJECT (self));
+  debug_manager = ide_debug_manager_from_context (context);
+
+  _ide_debug_manager_prepare (debug_manager, pipeline, run_command, run_context, NULL);
+
+  IDE_EXIT;
+}
+
+static void
+gbp_debugger_tool_started (IdeRunTool    *run_tool,
+                           IdeSubprocess *subprocess)
+{
+  GbpDebuggerTool *self = (GbpDebuggerTool *)run_tool;
+  IdeDebugManager *debug_manager;
+  IdeContext *context;
+
+  IDE_ENTRY;
+
+  g_assert (IDE_IS_MAIN_THREAD ());
+  g_assert (GBP_IS_DEBUGGER_TOOL (self));
+  g_assert (IDE_IS_SUBPROCESS (subprocess));
+
+  context = ide_object_get_context (IDE_OBJECT (self));
+  debug_manager = ide_debug_manager_from_context (context);
+
+  _ide_debug_manager_started (debug_manager);
+
+  IDE_EXIT;
+}
+
+static void
+gbp_debugger_tool_stopped (IdeRunTool *run_tool)
+{
+  GbpDebuggerTool *self = (GbpDebuggerTool *)run_tool;
+  IdeDebugManager *debug_manager;
+  IdeContext *context;
+
+  IDE_ENTRY;
+
+  g_assert (IDE_IS_MAIN_THREAD ());
+  g_assert (GBP_IS_DEBUGGER_TOOL (self));
+
+  context = ide_object_get_context (IDE_OBJECT (self));
+  debug_manager = ide_debug_manager_from_context (context);
+
+  _ide_debug_manager_stopped (debug_manager);
+
+  IDE_EXIT;
+}
+
+static void
+gbp_debugger_tool_class_init (GbpDebuggerToolClass *klass)
+{
+  IdeRunToolClass *run_tool_class = IDE_RUN_TOOL_CLASS (klass);
+
+  run_tool_class->prepare_to_run = gbp_debugger_tool_prepare_to_run;
+  run_tool_class->send_signal = gbp_debugger_tool_send_signal;
+  run_tool_class->started = gbp_debugger_tool_started;
+  run_tool_class->stopped = gbp_debugger_tool_stopped;
+}
+
+static void
+gbp_debugger_tool_init (GbpDebuggerTool *self)
+{
+  ide_run_tool_set_icon_name (IDE_RUN_TOOL (self),
+                              "builder-debugger-symbolic");
+}
diff --git a/src/plugins/debuggerui/gbp-debugger-tool.h b/src/plugins/debuggerui/gbp-debugger-tool.h
new file mode 100644
index 000000000..fb876f3c2
--- /dev/null
+++ b/src/plugins/debuggerui/gbp-debugger-tool.h
@@ -0,0 +1,31 @@
+/* gbp-debugger-tool.h
+ *
+ * Copyright 2022 Christian Hergert <chergert redhat com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#pragma once
+
+#include <libide-foundry.h>
+
+G_BEGIN_DECLS
+
+#define GBP_TYPE_DEBUGGER_TOOL (gbp_debugger_tool_get_type())
+
+G_DECLARE_FINAL_TYPE (GbpDebuggerTool, gbp_debugger_tool, GBP, DEBUGGER_TOOL, IdeRunTool)
+
+G_END_DECLS
diff --git a/src/plugins/debuggerui/gtk/keybindings.json b/src/plugins/debuggerui/gtk/keybindings.json
new file mode 100644
index 000000000..6133ccd30
--- /dev/null
+++ b/src/plugins/debuggerui/gtk/keybindings.json
@@ -0,0 +1 @@
+{ "trigger" : "<Control><Shift><Alt>d", "action" : "run-manager.run-with-handler", "args" : "'debuggerui'", 
"when" : "canBuild()", "phase" : "capture" },
diff --git a/src/plugins/debuggerui/gtk/menus.ui b/src/plugins/debuggerui/gtk/menus.ui
index c400008ed..655f7d73a 100644
--- a/src/plugins/debuggerui/gtk/menus.ui
+++ b/src/plugins/debuggerui/gtk/menus.ui
@@ -1,26 +1,51 @@
 <?xml version="1.0"?>
 <interface>
   <menu id="run-menu">
-    <section id="run-menu-section">
+    <section id="run-menu-observation-section">
       <item>
         <attribute name="id">debugger-run-handler</attribute>
         <attribute name="after">default-run-handler</attribute>
         <attribute name="action">run-manager.run-with-handler</attribute>
-        <attribute name="target">debugger</attribute>
+        <attribute name="target" type="s">'debuggerui'</attribute>
         <attribute name="label" translatable="yes">Run with Debugger</attribute>
         <attribute name="verb-icon-name">builder-debugger-symbolic</attribute>
-        <attribute name="accel">F5</attribute>
+        <attribute name="accel">&lt;control&gt;&lt;shift&gt;&lt;alt&gt;d</attribute>
       </item>
     </section>
   </menu>
-  <menu id="project-tree-run-with-submenu">
-    <section id="project-tree-menu-run-with-section">
-      <item>
-        <attribute name="id">project-tree-menu-debug</attribute>
-        <attribute name="label" translatable="yes">Run with _Debugger</attribute>
-        <attribute name="action">buildui.run-with-handler</attribute>
-        <attribute name="target" type="s">'debugger'</attribute>
-      </item>
+  <menu id="run-menu">
+    <section id="run-menu-tools-section">
+      <submenu id="run-menu-debugger-submenu">
+        <attribute name="before">run-menu-verbose-logging</attribute>
+        <attribute name="label" translatable="yes">Debugger</attribute>
+        <section id="run-menu-debugger-logging-breakpoints">
+          <attribute name="label" translatable="yes">Logging Breakpoints</attribute>
+          <item>
+            <attribute name="label" translatable="yes">Automatically Break at Warnings</attribute>
+            <attribute name="action">debug-manager.stop-at-warnings</attribute>
+            <attribute name="role">check</attribute>
+          </item>
+          <item>
+            <attribute name="label" translatable="yes">Automatically Break at Criticals</attribute>
+            <attribute name="action">debug-manager.stop-at-criticals</attribute>
+            <attribute name="role">check</attribute>
+          </item>
+        </section>
+      </submenu>
+    </section>
+  </menu>
+  <menu id="project-tree-menu">
+    <section id="project-tree-menu-foundry-section">
+      <submenu id="project-tree-run-with-submenu">
+        <section id="project-tree-menu-run-with-section">
+          <item>
+            <attribute name="id">project-tree-menu-debug</attribute>
+            <attribute name="label" translatable="yes">Run with _Debugger</attribute>
+            <attribute name="action">buildui.run-with-handler</attribute>
+            <attribute name="target" type="s">'debuggerui'</attribute>
+          </item>
+        </section>
+      </submenu>
     </section>
   </menu>
 </interface>
diff --git a/src/plugins/debuggerui/ide-debugger-breakpoints-view.c 
b/src/plugins/debuggerui/ide-debugger-breakpoints-view.c
index 2f9bfbcd0..9b62c5bd5 100644
--- a/src/plugins/debuggerui/ide-debugger-breakpoints-view.c
+++ b/src/plugins/debuggerui/ide-debugger-breakpoints-view.c
@@ -22,16 +22,16 @@
 
 #include "config.h"
 
-#include <dazzle.h>
+#include <libide-gtk.h>
 
 #include "ide-debugger-breakpoints-view.h"
 
 struct _IdeDebuggerBreakpointsView
 {
-  GtkBin                 parent_instance;
+  AdwBin                 parent_instance;
 
   /* Owned references */
-  DzlSignalGroup        *debugger_signals;
+  IdeSignalGroup        *debugger_signals;
 
   /* Template references */
   GtkCellRendererText   *address_cell;
@@ -62,18 +62,18 @@ enum {
   N_PROPS
 };
 
-G_DEFINE_FINAL_TYPE (IdeDebuggerBreakpointsView, ide_debugger_breakpoints_view, GTK_TYPE_BIN)
+G_DEFINE_FINAL_TYPE (IdeDebuggerBreakpointsView, ide_debugger_breakpoints_view, ADW_TYPE_BIN)
 
 static GParamSpec *properties [N_PROPS];
 
 static void
 ide_debugger_breakpoints_view_bind (IdeDebuggerBreakpointsView *self,
                                     IdeDebugger                *debugger,
-                                    DzlSignalGroup             *debugger_signals)
+                                    IdeSignalGroup             *debugger_signals)
 {
   g_assert (IDE_IS_DEBUGGER_BREAKPOINTS_VIEW (self));
   g_assert (IDE_IS_DEBUGGER (debugger));
-  g_assert (DZL_IS_SIGNAL_GROUP (debugger_signals));
+  g_assert (IDE_IS_SIGNAL_GROUP (debugger_signals));
 
   gtk_list_store_clear (self->list_store);
 }
@@ -113,7 +113,7 @@ ide_debugger_breakpoints_view_breakpoint_added (IdeDebuggerBreakpointsView *self
   g_assert (IDE_IS_DEBUGGER_BREAKPOINT (breakpoint));
   g_assert (IDE_IS_DEBUGGER (debugger));
 
-  dzl_gtk_list_store_insert_sorted (self->list_store, &iter, breakpoint, 0,
+  ide_gtk_list_store_insert_sorted (self->list_store, &iter, breakpoint, 0,
                                     (GCompareDataFunc)ide_debugger_breakpoint_compare,
                                     NULL);
 
@@ -342,6 +342,7 @@ bool_property_cell_data_func (GtkCellLayout   *cell_layout,
   g_object_set_property (G_OBJECT (cell), "active", &value);
 }
 
+#if 0
 static void
 ide_debugger_breakpoints_view_delete_breakpoint (GtkTreeView                *tree_view,
                                                  IdeDebuggerBreakpointsView *self)
@@ -371,15 +372,16 @@ ide_debugger_breakpoints_view_delete_breakpoint (GtkTreeView                *tre
         ide_debugger_remove_breakpoint_async (debugger, breakpoint, NULL, NULL, NULL);
     }
 }
+#endif
 
 static void
-ide_debugger_breakpoints_view_destroy (GtkWidget *widget)
+ide_debugger_breakpoints_view_dispose (GObject *object)
 {
-  IdeDebuggerBreakpointsView *self = (IdeDebuggerBreakpointsView *)widget;
+  IdeDebuggerBreakpointsView *self = (IdeDebuggerBreakpointsView *)object;
 
   g_clear_object (&self->debugger_signals);
 
-  GTK_WIDGET_CLASS (ide_debugger_breakpoints_view_parent_class)->destroy (widget);
+  G_OBJECT_CLASS (ide_debugger_breakpoints_view_parent_class)->dispose (object);
 }
 
 static void
@@ -426,11 +428,10 @@ ide_debugger_breakpoints_view_class_init (IdeDebuggerBreakpointsViewClass *klass
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
+  object_class->dispose = ide_debugger_breakpoints_view_dispose;
   object_class->get_property = ide_debugger_breakpoints_view_get_property;
   object_class->set_property = ide_debugger_breakpoints_view_set_property;
 
-  widget_class->destroy = ide_debugger_breakpoints_view_destroy;
-
   properties [PROP_DEBUGGER] =
     g_param_spec_object ("debugger",
                          "Debugger",
@@ -468,38 +469,36 @@ ide_debugger_breakpoints_view_class_init (IdeDebuggerBreakpointsViewClass *klass
 static void
 ide_debugger_breakpoints_view_init (IdeDebuggerBreakpointsView *self)
 {
-  DzlShortcutController *controller;
-
   gtk_widget_init_template (GTK_WIDGET (self));
 
-  self->debugger_signals = dzl_signal_group_new (IDE_TYPE_DEBUGGER);
+  self->debugger_signals = ide_signal_group_new (IDE_TYPE_DEBUGGER);
 
   g_signal_connect_swapped (self->debugger_signals,
                             "bind",
                             G_CALLBACK (ide_debugger_breakpoints_view_bind),
                             self);
 
-  dzl_signal_group_connect_swapped (self->debugger_signals,
+  ide_signal_group_connect_swapped (self->debugger_signals,
                                     "running",
                                     G_CALLBACK (ide_debugger_breakpoints_view_running),
                                     self);
 
-  dzl_signal_group_connect_swapped (self->debugger_signals,
+  ide_signal_group_connect_swapped (self->debugger_signals,
                                     "stopped",
                                     G_CALLBACK (ide_debugger_breakpoints_view_stopped),
                                     self);
 
-  dzl_signal_group_connect_swapped (self->debugger_signals,
+  ide_signal_group_connect_swapped (self->debugger_signals,
                                     "breakpoint-added",
                                     G_CALLBACK (ide_debugger_breakpoints_view_breakpoint_added),
                                     self);
 
-  dzl_signal_group_connect_swapped (self->debugger_signals,
+  ide_signal_group_connect_swapped (self->debugger_signals,
                                     "breakpoint-removed",
                                     G_CALLBACK (ide_debugger_breakpoints_view_breakpoint_removed),
                                     self);
 
-  dzl_signal_group_connect_swapped (self->debugger_signals,
+  ide_signal_group_connect_swapped (self->debugger_signals,
                                     "breakpoint-modified",
                                     G_CALLBACK (ide_debugger_breakpoints_view_breakpoint_modified),
                                     self);
@@ -546,15 +545,6 @@ ide_debugger_breakpoints_view_init (IdeDebuggerBreakpointsView *self)
                             "toggled",
                             G_CALLBACK (ide_debugger_breakpoints_view_enabled_toggled),
                             self);
-
-  controller = dzl_shortcut_controller_find (GTK_WIDGET (self->tree_view));
-
-  dzl_shortcut_controller_add_command_callback (controller,
-                                                "org.gnome.builder.debugger.delete-breakpoint",
-                                                "Delete",
-                                                DZL_SHORTCUT_PHASE_BUBBLE,
-                                                (GtkCallback) 
ide_debugger_breakpoints_view_delete_breakpoint,
-                                                self, NULL);
 }
 
 GtkWidget *
@@ -570,8 +560,6 @@ ide_debugger_breakpoints_view_new (void)
  * Gets the debugger that is being observed by the view.
  *
  * Returns: (nullable) (transfer none): An #IdeDebugger or %NULL
- *
- * Since: 3.32
  */
 IdeDebugger *
 ide_debugger_breakpoints_view_get_debugger (IdeDebuggerBreakpointsView *self)
@@ -579,7 +567,7 @@ ide_debugger_breakpoints_view_get_debugger (IdeDebuggerBreakpointsView *self)
   g_return_val_if_fail (IDE_IS_DEBUGGER_BREAKPOINTS_VIEW (self), NULL);
 
   if (self->debugger_signals != NULL)
-    return dzl_signal_group_get_target (self->debugger_signals);
+    return ide_signal_group_get_target (self->debugger_signals);
   else
     return NULL;
 }
@@ -590,8 +578,6 @@ ide_debugger_breakpoints_view_get_debugger (IdeDebuggerBreakpointsView *self)
  * @debugger: (nullable): An #IdeDebugger or %NULL
  *
  * Sets the debugger that is being viewed.
- *
- * Since: 3.32
  */
 void
 ide_debugger_breakpoints_view_set_debugger (IdeDebuggerBreakpointsView *self,
@@ -602,7 +588,7 @@ ide_debugger_breakpoints_view_set_debugger (IdeDebuggerBreakpointsView *self,
 
   if (self->debugger_signals != NULL)
     {
-      dzl_signal_group_set_target (self->debugger_signals, debugger);
+      ide_signal_group_set_target (self->debugger_signals, debugger);
       g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_DEBUGGER]);
     }
 }
diff --git a/src/plugins/debuggerui/ide-debugger-breakpoints-view.h 
b/src/plugins/debuggerui/ide-debugger-breakpoints-view.h
index 883475b79..1d3b187b7 100644
--- a/src/plugins/debuggerui/ide-debugger-breakpoints-view.h
+++ b/src/plugins/debuggerui/ide-debugger-breakpoints-view.h
@@ -20,7 +20,7 @@
 
 #pragma once
 
-#include <gtk/gtk.h>
+#include <adwaita.h>
 
 #include "ide-debugger.h"
 
@@ -28,7 +28,7 @@ G_BEGIN_DECLS
 
 #define IDE_TYPE_DEBUGGER_BREAKPOINTS_VIEW (ide_debugger_breakpoints_view_get_type())
 
-G_DECLARE_FINAL_TYPE (IdeDebuggerBreakpointsView, ide_debugger_breakpoints_view, IDE, 
DEBUGGER_BREAKPOINTS_VIEW, GtkBin)
+G_DECLARE_FINAL_TYPE (IdeDebuggerBreakpointsView, ide_debugger_breakpoints_view, IDE, 
DEBUGGER_BREAKPOINTS_VIEW, AdwBin)
 
 GtkWidget   *ide_debugger_breakpoints_view_new          (void);
 IdeDebugger *ide_debugger_breakpoints_view_get_debugger (IdeDebuggerBreakpointsView *self);
diff --git a/src/plugins/debuggerui/ide-debugger-breakpoints-view.ui 
b/src/plugins/debuggerui/ide-debugger-breakpoints-view.ui
index 0a184dea4..a42567644 100644
--- a/src/plugins/debuggerui/ide-debugger-breakpoints-view.ui
+++ b/src/plugins/debuggerui/ide-debugger-breakpoints-view.ui
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
-  <template class="IdeDebuggerBreakpointsView" parent="GtkBin">
+  <template class="IdeDebuggerBreakpointsView" parent="AdwBin">
     <child>
       <object class="GtkScrolledWindow">
         <property name="visible">true</property>
diff --git a/src/plugins/debuggerui/ide-debugger-controls.c b/src/plugins/debuggerui/ide-debugger-controls.c
index 25d7735fe..38a74ac3b 100644
--- a/src/plugins/debuggerui/ide-debugger-controls.c
+++ b/src/plugins/debuggerui/ide-debugger-controls.c
@@ -18,22 +18,42 @@
  * SPDX-License-Identifier: GPL-3.0-or-later
  */
 
+#define G_LOG_DOMAIN "ide-debugger-controls"
+
+#include "config.h"
+
 #include "ide-debugger-controls.h"
 
 struct _IdeDebuggerControls
 {
-  GtkBin parent_instance;
+  GtkWidget    parent_instance;
+  GtkRevealer *revealer;
 };
 
-G_DEFINE_FINAL_TYPE (IdeDebuggerControls, ide_debugger_controls, GTK_TYPE_REVEALER)
+G_DEFINE_FINAL_TYPE (IdeDebuggerControls, ide_debugger_controls, GTK_TYPE_WIDGET)
+
+static void
+ide_debugger_controls_dispose (GObject *object)
+{
+  IdeDebuggerControls *self = (IdeDebuggerControls *)object;
+
+  g_clear_pointer ((GtkWidget **)&self->revealer, gtk_widget_unparent);
+
+  G_OBJECT_CLASS (ide_debugger_controls_parent_class)->dispose (object);
+}
 
 static void
 ide_debugger_controls_class_init (IdeDebuggerControlsClass *klass)
 {
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
+  object_class->dispose = ide_debugger_controls_dispose;
+
   gtk_widget_class_set_template_from_resource (widget_class, "/plugins/debuggerui/ide-debugger-controls.ui");
+  gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
   gtk_widget_class_set_css_name (widget_class, "idedebuggercontrols");
+  gtk_widget_class_bind_template_child (widget_class, IdeDebuggerControls, revealer);
 }
 
 static void
@@ -41,3 +61,20 @@ ide_debugger_controls_init (IdeDebuggerControls *self)
 {
   gtk_widget_init_template (GTK_WIDGET (self));
 }
+
+void
+ide_debugger_controls_set_reveal_child (IdeDebuggerControls *self,
+                                        gboolean             reveal_child)
+{
+  g_return_if_fail (IDE_IS_DEBUGGER_CONTROLS (self));
+
+  gtk_revealer_set_reveal_child (self->revealer, reveal_child);
+}
+
+gboolean
+ide_debugger_controls_get_reveal_child (IdeDebuggerControls *self)
+{
+  g_return_val_if_fail (IDE_IS_DEBUGGER_CONTROLS (self), FALSE);
+
+  return gtk_revealer_get_reveal_child (self->revealer);
+}
diff --git a/src/plugins/debuggerui/ide-debugger-controls.h b/src/plugins/debuggerui/ide-debugger-controls.h
index eaff84473..0ea8b4b2b 100644
--- a/src/plugins/debuggerui/ide-debugger-controls.h
+++ b/src/plugins/debuggerui/ide-debugger-controls.h
@@ -28,10 +28,13 @@ G_BEGIN_DECLS
 
 #define IDE_TYPE_DEBUGGER_CONTROLS (ide_debugger_controls_get_type())
 
-G_DECLARE_FINAL_TYPE (IdeDebuggerControls, ide_debugger_controls, IDE, DEBUGGER_CONTROLS, GtkRevealer)
-
-IdeDebugger *ide_debugger_controls_get_debugger (IdeDebuggerControls *self);
-void         ide_debugger_controls_set_debugger (IdeDebuggerControls *self,
-                                                 IdeDebugger         *debugger);
+G_DECLARE_FINAL_TYPE (IdeDebuggerControls, ide_debugger_controls, IDE, DEBUGGER_CONTROLS, GtkWidget)
+
+IdeDebugger *ide_debugger_controls_get_debugger     (IdeDebuggerControls *self);
+void         ide_debugger_controls_set_debugger     (IdeDebuggerControls *self,
+                                                     IdeDebugger         *debugger);
+gboolean     ide_debugger_controls_get_reveal_child (IdeDebuggerControls *self);
+void         ide_debugger_controls_set_reveal_child (IdeDebuggerControls *self,
+                                                     gboolean             reveal_child);
 
 G_END_DECLS
diff --git a/src/plugins/debuggerui/ide-debugger-controls.ui b/src/plugins/debuggerui/ide-debugger-controls.ui
index 6bc79c5aa..2edd8d678 100644
--- a/src/plugins/debuggerui/ide-debugger-controls.ui
+++ b/src/plugins/debuggerui/ide-debugger-controls.ui
@@ -1,40 +1,34 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
-  <template class="IdeDebuggerControls" parent="GtkRevealer">
+  <template class="IdeDebuggerControls" parent="GtkWidget">
     <child>
-      <object class="GtkFrame">
-        <property name="visible">true</property>
+      <object class="GtkRevealer" id="revealer">
+        <property name="reveal-child">false</property>
+        <property name="transition-type">slide-right</property>
+        <property name="transition-duration">500</property>
         <child>
           <object class="GtkBox">
+            <property name="margin-end">6</property>
+            <property name="spacing">3</property>
             <property name="orientation">horizontal</property>
-            <property name="visible">true</property>
-            <style>
-              <class name="linked"/>
-            </style>
             <child>
               <object class="GtkButton" id="pause_button">
                 <property name="action-name">debugger.stop</property>
                 <property name="tooltip-text" translatable="yes">Interrupt the program</property>
-                <property name="visible">true</property>
-                <child>
-                  <object class="GtkImage">
-                    <property name="icon-name">media-playback-pause-symbolic</property>
-                    <property name="visible">true</property>
-                  </object>
-                </child>
+                <property name="icon-name">media-playback-pause-symbolic</property>
+                <style>
+                  <class name="flat"/>
+                </style>
               </object>
             </child>
             <child>
               <object class="GtkButton" id="continue_button">
                 <property name="action-name">debugger.continue</property>
                 <property name="tooltip-text" translatable="yes">Continue running the program</property>
-                <property name="visible">true</property>
-                <child>
-                  <object class="GtkImage">
-                    <property name="icon-name">debug-continue-symbolic</property>
-                    <property name="visible">true</property>
-                  </object>
-                </child>
+                <property name="icon-name">debug-continue-symbolic</property>
+                <style>
+                  <class name="flat"/>
+                </style>
               </object>
             </child>
             <!--
@@ -42,26 +36,20 @@
               <object class="GtkButton" id="execute_from_cursor_button">
                 <property name="action-name">debugger.execute-from-cursor</property>
                 <property name="tooltip-text" translatable="yes">Execute from the current cursor 
position</property>
-                <property name="visible">true</property>
-                <child>
-                  <object class="GtkImage">
-                    <property name="icon-name">debug-execute-from-cursor-symbolic</property>
-                    <property name="visible">true</property>
-                  </object>
-                </child>
+                <property name="icon-name">debug-execute-from-cursor-symbolic</property>
+                <style>
+                  <class name="flat"/>
+                </style>
               </object>
             </child>
             <child>
               <object class="GtkButton" id="execute_to_cursor_button">
                 <property name="action-name">debugger.execute-to-cursor</property>
                 <property name="tooltip-text" translatable="yes">Execute until reaching the current cursor 
position</property>
-                <property name="visible">true</property>
-                <child>
-                  <object class="GtkImage">
-                    <property name="icon-name">debug-execute-to-cursor-symbolic</property>
-                    <property name="visible">true</property>
-                  </object>
-                </child>
+                <property name="icon-name">debug-execute-to-cursor-symbolic</property>
+                <style>
+                  <class name="flat"/>
+                </style>
               </object>
             </child>
             -->
@@ -69,39 +57,30 @@
               <object class="GtkButton" id="step_in_button">
                 <property name="action-name">debugger.step-in</property>
                 <property name="tooltip-text" translatable="yes">Execute the current line, stepping into any 
function calls</property>
-                <property name="visible">true</property>
-                <child>
-                  <object class="GtkImage">
-                    <property name="icon-name">debug-step-in-symbolic</property>
-                    <property name="visible">true</property>
-                  </object>
-                </child>
+                <property name="icon-name">debug-step-in-symbolic</property>
+                <style>
+                  <class name="flat"/>
+                </style>
               </object>
             </child>
             <child>
               <object class="GtkButton" id="step_over_button">
                 <property name="action-name">debugger.step-over</property>
                 <property name="tooltip-text" translatable="yes">Execute the current line, stepping over any 
function calls</property>
-                <property name="visible">true</property>
-                <child>
-                  <object class="GtkImage">
-                    <property name="icon-name">debug-step-over-symbolic</property>
-                    <property name="visible">true</property>
-                  </object>
-                </child>
+                <property name="icon-name">debug-step-over-symbolic</property>
+                <style>
+                  <class name="flat"/>
+                </style>
               </object>
             </child>
             <child>
               <object class="GtkButton" id="finish_button">
                 <property name="action-name">debugger.finish</property>
                 <property name="tooltip-text" translatable="yes">Run until the end of the function</property>
-                <property name="visible">true</property>
-                <child>
-                  <object class="GtkImage">
-                    <property name="icon-name">debug-step-out-symbolic</property>
-                    <property name="visible">true</property>
-                  </object>
-                </child>
+                <property name="icon-name">debug-step-out-symbolic</property>
+                <style>
+                  <class name="flat"/>
+                </style>
               </object>
             </child>
           </object>
diff --git a/src/plugins/debuggerui/ide-debugger-disassembly-view.c 
b/src/plugins/debuggerui/ide-debugger-disassembly-view.c
index eb88ec1da..27d11b12f 100644
--- a/src/plugins/debuggerui/ide-debugger-disassembly-view.c
+++ b/src/plugins/debuggerui/ide-debugger-disassembly-view.c
@@ -24,9 +24,13 @@
 
 #include <libide-sourceview.h>
 
+#include "gbp-debuggerui-resources.h"
 #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;
@@ -37,49 +41,216 @@ 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,
+                             GValue       *to_value,
+                             gpointer      user_data)
+{
+  GtkSourceStyleSchemeManager *manager = gtk_source_style_scheme_manager_get_default ();
+  GtkSourceStyleScheme *scheme = gtk_source_style_scheme_manager_get_scheme (manager, g_value_get_string 
(from_value));
+
+  g_value_set_object (to_value, scheme);
+
+  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
-ide_debugger_disassembly_view_destroy (GtkWidget *widget)
+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 gboolean
+scroll_to_insert_in_idle_cb (gpointer user_data)
+{
+  IdeDebuggerDisassemblyView *self = user_data;
+  GtkTextMark *mark;
+  GtkTextIter iter;
+
+  g_assert (IDE_IS_DEBUGGER_DISASSEMBLY_VIEW (self));
+
+  mark = gtk_text_buffer_get_insert (GTK_TEXT_BUFFER (self->source_buffer));
+  gtk_text_buffer_get_iter_at_mark (GTK_TEXT_BUFFER (self->source_buffer), &iter, mark);
+  ide_source_view_jump_to_iter (GTK_TEXT_VIEW (self->source_view), &iter,
+                                0.0, TRUE, 1.0, 0.5);
+
+  return G_SOURCE_REMOVE;
+}
+
+static void
+ide_debugger_disassembly_view_root (GtkWidget *widget)
 {
   IdeDebuggerDisassemblyView *self = (IdeDebuggerDisassemblyView *)widget;
 
+  g_assert (IDE_IS_DEBUGGER_DISASSEMBLY_VIEW (self));
+
+  GTK_WIDGET_CLASS (ide_debugger_disassembly_view_parent_class)->root (widget);
+
+  g_idle_add_full (G_PRIORITY_LOW,
+                   scroll_to_insert_in_idle_cb,
+                   g_object_ref (self),
+                   g_object_unref);
+}
+
+static void
+ide_debugger_disassembly_view_dispose (GObject *object)
+{
+  IdeDebuggerDisassemblyView *self = (IdeDebuggerDisassemblyView *)object;
+
   g_clear_pointer (&self->instructions, g_ptr_array_unref);
 
-  GTK_WIDGET_CLASS (ide_debugger_disassembly_view_parent_class)->destroy (widget);
+  G_OBJECT_CLASS (ide_debugger_disassembly_view_parent_class)->dispose (object);
 }
 
 static void
 ide_debugger_disassembly_view_class_init (IdeDebuggerDisassemblyViewClass *klass)
 {
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
-  widget_class->destroy = ide_debugger_disassembly_view_destroy;
+  object_class->dispose = ide_debugger_disassembly_view_dispose;
+
+  widget_class->root = ide_debugger_disassembly_view_root;
 
   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
 ide_debugger_disassembly_view_init (IdeDebuggerDisassemblyView *self)
 {
+  GtkSourceLanguageManager *langs;
+  GtkSourceLanguage *lang;
+
   gtk_widget_init_template (GTK_WIDGET (self));
+
+  langs = gtk_source_language_manager_get_default ();
+  lang = gtk_source_language_manager_get_language (langs, "builder-disassembly");
+  g_assert (lang != NULL);
+  gtk_source_buffer_set_language (self->source_buffer, lang);
+
+  g_object_bind_property_full (IDE_APPLICATION_DEFAULT, "style-scheme",
+                               self->source_buffer, "style-scheme",
+                               G_BINDING_SYNC_CREATE,
+                               style_scheme_name_to_object,
+                               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;
+    }
 }
 
 /**
@@ -92,8 +263,6 @@ ide_debugger_disassembly_view_set_current_address (IdeDebuggerDisassemblyView *s
  *
  * This will take a reference to @instructions if non-%NULL so it is
  * important that you do not modify @instructions after calling this.
- *
- * Since: 3.32
  */
 void
 ide_debugger_disassembly_view_set_instructions (IdeDebuggerDisassemblyView *self,
@@ -123,7 +292,7 @@ ide_debugger_disassembly_view_set_instructions (IdeDebuggerDisassemblyView *self
       for (guint i = 0; i < self->instructions->len; i++)
         {
           IdeDebuggerInstruction *inst = g_ptr_array_index (self->instructions, i);
-          g_autofree gchar *str = g_strdup_printf ("0x%"G_GINT64_MODIFIER"x <+%03"G_GINT64_MODIFIER"u>:  
%s\n",
+          g_autofree gchar *str = g_strdup_printf ("0x%"G_GINT64_MODIFIER"x 
<+%03"G_GINT64_MODIFIER"u>:\t%s\n",
                                                    ide_debugger_instruction_get_address (inst),
                                                    ide_debugger_instruction_get_address (inst) - first,
                                                    ide_debugger_instruction_get_display (inst));
@@ -134,5 +303,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 2cd579636..4d59ccdf5 100644
--- a/src/plugins/debuggerui/ide-debugger-disassembly-view.ui
+++ b/src/plugins/debuggerui/ide-debugger-disassembly-view.ui
@@ -5,20 +5,21 @@
     <property name="title" translatable="yes">Disassembly</property>
     <child>
       <object class="GtkScrolledWindow">
-        <property name="expand">true</property>
-        <property name="visible">true</property>
+        <property name="hexpand">true</property>
+        <property name="vexpand">true</property>
         <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>
-            <property name="visible">true</property>
           </object>
         </child>
       </object>
     </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-hover-controls.c 
b/src/plugins/debuggerui/ide-debugger-hover-controls.c
index 009a7b75c..037d8294e 100644
--- a/src/plugins/debuggerui/ide-debugger-hover-controls.c
+++ b/src/plugins/debuggerui/ide-debugger-hover-controls.c
@@ -22,7 +22,6 @@
 
 #include "config.h"
 
-#include <dazzle.h>
 #include <libide-debugger.h>
 #include <libide-sourceview.h>
 
@@ -32,7 +31,7 @@
 
 struct _IdeDebuggerHoverControls
 {
-  GtkBin parent_instance;
+  AdwBin parent_instance;
 
   IdeDebugManager *debug_manager;
   GFile *file;
@@ -43,25 +42,26 @@ struct _IdeDebuggerHoverControls
   GtkToggleButton *countpoint;
 };
 
-G_DEFINE_FINAL_TYPE (IdeDebuggerHoverControls, ide_debugger_hover_controls, GTK_TYPE_BIN)
+G_DEFINE_FINAL_TYPE (IdeDebuggerHoverControls, ide_debugger_hover_controls, ADW_TYPE_BIN)
 
 static void
-ide_debugger_hover_controls_destroy (GtkWidget *widget)
+ide_debugger_hover_controls_dispose (GObject *object)
 {
-  IdeDebuggerHoverControls *self = (IdeDebuggerHoverControls *)widget;
+  IdeDebuggerHoverControls *self = (IdeDebuggerHoverControls *)object;
 
   g_clear_object (&self->debug_manager);
   g_clear_object (&self->file);
 
-  GTK_WIDGET_CLASS (ide_debugger_hover_controls_parent_class)->destroy (widget);
+  G_OBJECT_CLASS (ide_debugger_hover_controls_parent_class)->dispose (object);
 }
 
 static void
 ide_debugger_hover_controls_class_init (IdeDebuggerHoverControlsClass *klass)
 {
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
-  widget_class->destroy = ide_debugger_hover_controls_destroy;
+  object_class->dispose = ide_debugger_hover_controls_dispose;
 
   gtk_widget_class_set_template_from_resource (widget_class, 
"/plugins/debuggerui/ide-debugger-hover-controls.ui");
   gtk_widget_class_bind_template_child (widget_class, IdeDebuggerHoverControls, nobreak);
@@ -82,7 +82,6 @@ on_toggle_cb (GtkToggleButton          *button,
   g_autoptr(IdeDebuggerBreakpoints) breakpoints = NULL;
   IdeDebuggerBreakMode break_type = IDE_DEBUGGER_BREAK_NONE;
   IdeDebuggerBreakpoint *breakpoint;
-  GtkWidget *view;
 
   g_assert (GTK_IS_TOGGLE_BUTTON (button));
   g_assert (IDE_IS_DEBUGGER_HOVER_CONTROLS (self));
@@ -145,9 +144,6 @@ on_toggle_cb (GtkToggleButton          *button,
       break;
     }
 
-  view = dzl_gtk_widget_get_relative (GTK_WIDGET (self), IDE_TYPE_SOURCE_VIEW);
-  gtk_widget_queue_draw (view);
-
   g_signal_handlers_unblock_by_func (self->nobreak, G_CALLBACK (on_toggle_cb), self);
   g_signal_handlers_unblock_by_func (self->breakpoint, G_CALLBACK (on_toggle_cb), self);
   g_signal_handlers_unblock_by_func (self->countpoint, G_CALLBACK (on_toggle_cb), self);
diff --git a/src/plugins/debuggerui/ide-debugger-hover-controls.h 
b/src/plugins/debuggerui/ide-debugger-hover-controls.h
index c73df02e1..ab254640f 100644
--- a/src/plugins/debuggerui/ide-debugger-hover-controls.h
+++ b/src/plugins/debuggerui/ide-debugger-hover-controls.h
@@ -20,7 +20,7 @@
 
 #pragma once
 
-#include <gtk/gtk.h>
+#include <adwaita.h>
 
 #include "ide-debug-manager.h"
 
@@ -28,7 +28,7 @@ G_BEGIN_DECLS
 
 #define IDE_TYPE_DEBUGGER_HOVER_CONTROLS (ide_debugger_hover_controls_get_type())
 
-G_DECLARE_FINAL_TYPE (IdeDebuggerHoverControls, ide_debugger_hover_controls, IDE, DEBUGGER_HOVER_CONTROLS, 
GtkBin)
+G_DECLARE_FINAL_TYPE (IdeDebuggerHoverControls, ide_debugger_hover_controls, IDE, DEBUGGER_HOVER_CONTROLS, 
AdwBin)
 
 GtkWidget *ide_debugger_hover_controls_new (IdeDebugManager *debug_manager,
                                             GFile           *file,
diff --git a/src/plugins/debuggerui/ide-debugger-hover-controls.ui 
b/src/plugins/debuggerui/ide-debugger-hover-controls.ui
index f0fb71d4a..a989d8e96 100644
--- a/src/plugins/debuggerui/ide-debugger-hover-controls.ui
+++ b/src/plugins/debuggerui/ide-debugger-hover-controls.ui
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
-  <template class="IdeDebuggerHoverControls" parent="GtkBin">
+  <template class="IdeDebuggerHoverControls" parent="AdwBin">
     <child>
       <object class="GtkBox">
         <property name="visible">true</property>
diff --git a/src/plugins/debuggerui/ide-debugger-hover-provider.c 
b/src/plugins/debuggerui/ide-debugger-hover-provider.c
index 108f93e60..3fd39cc7d 100644
--- a/src/plugins/debuggerui/ide-debugger-hover-provider.c
+++ b/src/plugins/debuggerui/ide-debugger-hover-provider.c
@@ -40,12 +40,12 @@ struct _IdeDebuggerHoverProvider
 };
 
 static void
-ide_debugger_hover_provider_hover_async (IdeHoverProvider    *provider,
-                                         IdeHoverContext     *context,
-                                         const GtkTextIter   *iter,
-                                         GCancellable        *cancellable,
-                                         GAsyncReadyCallback  callback,
-                                         gpointer             user_data)
+ide_debugger_hover_provider_populate_async (GtkSourceHoverProvider *provider,
+                                            GtkSourceHoverContext  *context,
+                                            GtkSourceHoverDisplay  *display,
+                                            GCancellable           *cancellable,
+                                            GAsyncReadyCallback     callback,
+                                            gpointer                user_data)
 {
   IdeDebuggerHoverProvider *self = (IdeDebuggerHoverProvider *)provider;
   g_autoptr(IdeTask) task = NULL;
@@ -53,46 +53,58 @@ ide_debugger_hover_provider_hover_async (IdeHoverProvider    *provider,
   IdeDebugManager *dbgmgr;
   const gchar *lang_id;
   IdeBuffer *buffer;
+  GtkTextIter iter;
   GFile *file;
   guint line;
 
+  IDE_ENTRY;
+
   g_assert (IDE_IS_DEBUGGER_HOVER_PROVIDER (provider));
-  g_assert (IDE_IS_HOVER_CONTEXT (context));
-  g_assert (iter != NULL);
+  g_assert (GTK_SOURCE_IS_HOVER_CONTEXT (context));
+  g_assert (GTK_SOURCE_IS_HOVER_DISPLAY (display));
   g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
 
   task = ide_task_new (self, cancellable, callback, user_data);
-  ide_task_set_source_tag (task, ide_debugger_hover_provider_hover_async);
+  ide_task_set_source_tag (task, ide_debugger_hover_provider_populate_async);
 
-  buffer = IDE_BUFFER (gtk_text_iter_get_buffer (iter));
+  buffer = IDE_BUFFER (gtk_source_hover_context_get_buffer (context));
 
-  if (gtk_source_buffer_iter_has_context_class (GTK_SOURCE_BUFFER (buffer), iter, "comment"))
-    {
-      ide_task_return_boolean (task, TRUE);
-      return;
-    }
+  if (!gtk_source_hover_context_get_iter (context, &iter) ||
+      gtk_source_buffer_iter_has_context_class (GTK_SOURCE_BUFFER (buffer), &iter, "comment"))
+    IDE_GOTO (empty);
 
   lang_id = ide_buffer_get_language_id (buffer);
   icontext = ide_buffer_ref_context (buffer);
   dbgmgr = ide_debug_manager_from_context (icontext);
   file = ide_buffer_get_file (buffer);
-  line = gtk_text_iter_get_line (iter);
+  line = gtk_text_iter_get_line (&iter);
 
-  if (ide_debug_manager_get_active(dbgmgr) && ide_debug_manager_supports_language (dbgmgr, lang_id))
+  if (ide_debug_manager_get_active (dbgmgr) &&
+      ide_debug_manager_supports_language (dbgmgr, lang_id))
     {
       GtkWidget *controls;
 
       controls = ide_debugger_hover_controls_new (dbgmgr, file, line + 1);
-      ide_hover_context_add_widget (context, DEBUGGER_HOVER_PRIORITY, _("Debugger"), controls);
+      gtk_source_hover_display_prepend (display, controls);
+
+      ide_task_return_boolean (task, TRUE);
+
+      IDE_EXIT;
     }
 
-  ide_task_return_boolean (task, TRUE);
+empty:
+  ide_task_return_new_error (task,
+                             G_IO_ERROR,
+                             G_IO_ERROR_NOT_SUPPORTED,
+                             "Not supported");
+
+  IDE_EXIT;
 }
 
 static gboolean
-ide_debugger_hover_provider_hover_finish (IdeHoverProvider  *provider,
-                                          GAsyncResult      *result,
-                                          GError           **error)
+ide_debugger_hover_provider_populate_finish (GtkSourceHoverProvider  *provider,
+                                             GAsyncResult            *result,
+                                             GError                 **error)
 {
   g_assert (IDE_IS_DEBUGGER_HOVER_PROVIDER (provider));
   g_assert (IDE_IS_TASK (result));
@@ -101,14 +113,14 @@ ide_debugger_hover_provider_hover_finish (IdeHoverProvider  *provider,
 }
 
 static void
-hover_provider_iface_init (IdeHoverProviderInterface *iface)
+hover_provider_iface_init (GtkSourceHoverProviderInterface *iface)
 {
-  iface->hover_async = ide_debugger_hover_provider_hover_async;
-  iface->hover_finish = ide_debugger_hover_provider_hover_finish;
+  iface->populate_async = ide_debugger_hover_provider_populate_async;
+  iface->populate_finish = ide_debugger_hover_provider_populate_finish;
 }
 
 G_DEFINE_FINAL_TYPE_WITH_CODE (IdeDebuggerHoverProvider, ide_debugger_hover_provider, G_TYPE_OBJECT,
-                         G_IMPLEMENT_INTERFACE (IDE_TYPE_HOVER_PROVIDER, hover_provider_iface_init))
+                               G_IMPLEMENT_INTERFACE (GTK_SOURCE_TYPE_HOVER_PROVIDER, 
hover_provider_iface_init))
 
 static void
 ide_debugger_hover_provider_class_init (IdeDebuggerHoverProviderClass *klass)
diff --git a/src/plugins/debuggerui/ide-debugger-libraries-view.c 
b/src/plugins/debuggerui/ide-debugger-libraries-view.c
index c06a4473b..79c421122 100644
--- a/src/plugins/debuggerui/ide-debugger-libraries-view.c
+++ b/src/plugins/debuggerui/ide-debugger-libraries-view.c
@@ -22,13 +22,13 @@
 
 #include "config.h"
 
-#include <dazzle.h>
+#include <libide-gtk.h>
 
 #include "ide-debugger-libraries-view.h"
 
 struct _IdeDebuggerLibrariesView
 {
-  GtkBin parent_instance;
+  AdwBin parent_instance;
 
   /* Template widgets */
   GtkTreeView         *tree_view;
@@ -39,7 +39,7 @@ struct _IdeDebuggerLibrariesView
   GtkTreeViewColumn   *target_column;
 
   /* Onwed refnerences */
-  DzlSignalGroup *debugger_signals;
+  IdeSignalGroup *debugger_signals;
 };
 
 enum {
@@ -48,14 +48,14 @@ enum {
   N_PROPS
 };
 
-G_DEFINE_FINAL_TYPE (IdeDebuggerLibrariesView, ide_debugger_libraries_view, GTK_TYPE_BIN)
+G_DEFINE_FINAL_TYPE (IdeDebuggerLibrariesView, ide_debugger_libraries_view, ADW_TYPE_BIN)
 
 static GParamSpec *properties [N_PROPS];
 
 static void
 ide_debugger_libraries_view_bind (IdeDebuggerLibrariesView *self,
                                   IdeDebugger              *debugger,
-                                  DzlSignalGroup           *signals)
+                                  IdeSignalGroup           *signals)
 {
   g_assert (IDE_IS_DEBUGGER_LIBRARIES_VIEW (self));
   g_assert (IDE_IS_DEBUGGER (debugger));
@@ -66,10 +66,10 @@ ide_debugger_libraries_view_bind (IdeDebuggerLibrariesView *self,
 
 static void
 ide_debugger_libraries_view_unbind (IdeDebuggerLibrariesView *self,
-                                    DzlSignalGroup           *signals)
+                                    IdeSignalGroup           *signals)
 {
   g_assert (IDE_IS_DEBUGGER_LIBRARIES_VIEW (self));
-  g_assert (DZL_IS_SIGNAL_GROUP (signals));
+  g_assert (IDE_IS_SIGNAL_GROUP (signals));
 
   gtk_widget_set_sensitive (GTK_WIDGET (self->tree_view), FALSE);
 }
@@ -107,7 +107,7 @@ ide_debugger_libraries_view_library_loaded (IdeDebuggerLibrariesView *self,
   g_assert (IDE_IS_DEBUGGER_LIBRARY (library));
   g_assert (IDE_IS_DEBUGGER (debugger));
 
-  dzl_gtk_list_store_insert_sorted (self->list_store,
+  ide_gtk_list_store_insert_sorted (self->list_store,
                                     &iter, library, 0,
                                     (GCompareDataFunc)ide_debugger_library_compare,
                                     NULL);
@@ -207,13 +207,13 @@ string_property_cell_data_func (GtkCellLayout   *cell_layout,
 }
 
 static void
-ide_debugger_libraries_view_destroy (GtkWidget *widget)
+ide_debugger_libraries_view_dispose (GObject *object)
 {
-  IdeDebuggerLibrariesView *self = (IdeDebuggerLibrariesView *)widget;
+  IdeDebuggerLibrariesView *self = (IdeDebuggerLibrariesView *)object;
 
   g_clear_object (&self->debugger_signals);
 
-  GTK_WIDGET_CLASS (ide_debugger_libraries_view_parent_class)->destroy (widget);
+  G_OBJECT_CLASS (ide_debugger_libraries_view_parent_class)->dispose (object);
 }
 
 static void
@@ -260,11 +260,10 @@ ide_debugger_libraries_view_class_init (IdeDebuggerLibrariesViewClass *klass)
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
+  object_class->dispose = ide_debugger_libraries_view_dispose;
   object_class->get_property = ide_debugger_libraries_view_get_property;
   object_class->set_property = ide_debugger_libraries_view_set_property;
 
-  widget_class->destroy = ide_debugger_libraries_view_destroy;
-
   properties [PROP_DEBUGGER] =
     g_param_spec_object ("debugger",
                          "Debugger",
@@ -288,9 +287,18 @@ ide_debugger_libraries_view_class_init (IdeDebuggerLibrariesViewClass *klass)
 static void
 ide_debugger_libraries_view_init (IdeDebuggerLibrariesView *self)
 {
+  g_autoptr(PangoAttrList) tt_attrs = NULL;
+
   gtk_widget_init_template (GTK_WIDGET (self));
 
-  self->debugger_signals = dzl_signal_group_new (IDE_TYPE_DEBUGGER);
+  tt_attrs = pango_attr_list_new ();
+  pango_attr_list_insert (tt_attrs, pango_attr_family_new ("Monospace"));
+  pango_attr_list_insert (tt_attrs, pango_attr_scale_new (0.83333));
+  g_object_set (self->range_cell,
+                "attributes", tt_attrs,
+                NULL);
+
+  self->debugger_signals = ide_signal_group_new (IDE_TYPE_DEBUGGER);
 
   g_signal_connect_swapped (self->debugger_signals,
                             "bind",
@@ -302,22 +310,22 @@ ide_debugger_libraries_view_init (IdeDebuggerLibrariesView *self)
                             G_CALLBACK (ide_debugger_libraries_view_unbind),
                             self);
 
-  dzl_signal_group_connect_swapped (self->debugger_signals,
+  ide_signal_group_connect_swapped (self->debugger_signals,
                                     "running",
                                     G_CALLBACK (ide_debugger_libraries_view_running),
                                     self);
 
-  dzl_signal_group_connect_swapped (self->debugger_signals,
+  ide_signal_group_connect_swapped (self->debugger_signals,
                                     "stopped",
                                     G_CALLBACK (ide_debugger_libraries_view_stopped),
                                     self);
 
-  dzl_signal_group_connect_swapped (self->debugger_signals,
+  ide_signal_group_connect_swapped (self->debugger_signals,
                                     "library-loaded",
                                     G_CALLBACK (ide_debugger_libraries_view_library_loaded),
                                     self);
 
-  dzl_signal_group_connect_swapped (self->debugger_signals,
+  ide_signal_group_connect_swapped (self->debugger_signals,
                                     "library-unloaded",
                                     G_CALLBACK (ide_debugger_libraries_view_library_unloaded),
                                     self);
@@ -344,8 +352,6 @@ ide_debugger_libraries_view_new (void)
  * Gets the debugger property.
  *
  * Returns: (transfer none): An #IdeDebugger or %NULL.
- *
- * Since: 3.32
  */
 IdeDebugger *
 ide_debugger_libraries_view_get_debugger (IdeDebuggerLibrariesView *self)
@@ -353,7 +359,7 @@ ide_debugger_libraries_view_get_debugger (IdeDebuggerLibrariesView *self)
   g_return_val_if_fail (IDE_IS_DEBUGGER_LIBRARIES_VIEW (self), NULL);
 
   if (self->debugger_signals != NULL)
-    return dzl_signal_group_get_target (self->debugger_signals);
+    return ide_signal_group_get_target (self->debugger_signals);
   return NULL;
 }
 
@@ -364,6 +370,6 @@ ide_debugger_libraries_view_set_debugger (IdeDebuggerLibrariesView *self,
   g_return_if_fail (IDE_IS_DEBUGGER_LIBRARIES_VIEW (self));
   g_return_if_fail (!debugger || IDE_IS_DEBUGGER (debugger));
 
-  dzl_signal_group_set_target (self->debugger_signals, debugger);
+  ide_signal_group_set_target (self->debugger_signals, debugger);
   g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_DEBUGGER]);
 }
diff --git a/src/plugins/debuggerui/ide-debugger-libraries-view.h 
b/src/plugins/debuggerui/ide-debugger-libraries-view.h
index 797b3a521..350d11e0f 100644
--- a/src/plugins/debuggerui/ide-debugger-libraries-view.h
+++ b/src/plugins/debuggerui/ide-debugger-libraries-view.h
@@ -20,7 +20,7 @@
 
 #pragma once
 
-#include <gtk/gtk.h>
+#include <adwaita.h>
 
 #include "ide-debugger.h"
 
@@ -28,7 +28,7 @@ G_BEGIN_DECLS
 
 #define IDE_TYPE_DEBUGGER_LIBRARIES_VIEW (ide_debugger_libraries_view_get_type())
 
-G_DECLARE_FINAL_TYPE (IdeDebuggerLibrariesView, ide_debugger_libraries_view, IDE, DEBUGGER_LIBRARIES_VIEW, 
GtkBin)
+G_DECLARE_FINAL_TYPE (IdeDebuggerLibrariesView, ide_debugger_libraries_view, IDE, DEBUGGER_LIBRARIES_VIEW, 
AdwBin)
 
 GtkWidget   *ide_debugger_libraries_view_new          (void);
 IdeDebugger *ide_debugger_libraries_view_get_debugger (IdeDebuggerLibrariesView *self);
diff --git a/src/plugins/debuggerui/ide-debugger-libraries-view.ui 
b/src/plugins/debuggerui/ide-debugger-libraries-view.ui
index e8dd3fbd7..bb2107bd2 100644
--- a/src/plugins/debuggerui/ide-debugger-libraries-view.ui
+++ b/src/plugins/debuggerui/ide-debugger-libraries-view.ui
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
-  <template class="IdeDebuggerLibrariesView" parent="GtkBin">
+  <template class="IdeDebuggerLibrariesView" parent="AdwBin">
     <child>
       <object class="GtkScrolledWindow">
         <property name="visible">true</property>
diff --git a/src/plugins/debuggerui/ide-debugger-locals-view.c 
b/src/plugins/debuggerui/ide-debugger-locals-view.c
index 35bdc4c1b..2a4e3146e 100644
--- a/src/plugins/debuggerui/ide-debugger-locals-view.c
+++ b/src/plugins/debuggerui/ide-debugger-locals-view.c
@@ -22,19 +22,19 @@
 
 #include "config.h"
 
-#include <dazzle.h>
+#include <glib/gi18n.h>
+
 #include <libide-core.h>
 #include <libide-threading.h>
-#include <glib/gi18n.h>
 
 #include "ide-debugger-locals-view.h"
 
 struct _IdeDebuggerLocalsView
 {
-  GtkBin          parent_instance;
+  AdwBin          parent_instance;
 
   /* Owned references */
-  DzlSignalGroup *debugger_signals;
+  IdeSignalGroup *debugger_signals;
 
   /* Template references */
   GtkTreeStore        *tree_store;
@@ -53,7 +53,7 @@ enum {
   N_PROPS
 };
 
-G_DEFINE_FINAL_TYPE (IdeDebuggerLocalsView, ide_debugger_locals_view, GTK_TYPE_BIN)
+G_DEFINE_FINAL_TYPE (IdeDebuggerLocalsView, ide_debugger_locals_view, ADW_TYPE_BIN)
 
 static GParamSpec *properties [N_PROPS];
 
@@ -222,14 +222,14 @@ ide_debugger_locals_view_init (IdeDebuggerLocalsView *self)
 {
   gtk_widget_init_template (GTK_WIDGET (self));
 
-  self->debugger_signals = dzl_signal_group_new (IDE_TYPE_DEBUGGER);
+  self->debugger_signals = ide_signal_group_new (IDE_TYPE_DEBUGGER);
 
-  dzl_signal_group_connect_swapped (self->debugger_signals,
+  ide_signal_group_connect_swapped (self->debugger_signals,
                                     "running",
                                     G_CALLBACK (ide_debugger_locals_view_running),
                                     self);
 
-  dzl_signal_group_connect_swapped (self->debugger_signals,
+  ide_signal_group_connect_swapped (self->debugger_signals,
                                     "stopped",
                                     G_CALLBACK (ide_debugger_locals_view_stopped),
                                     self);
@@ -260,15 +260,13 @@ ide_debugger_locals_view_new (void)
  * Gets the debugger instance.
  *
  * Returns: (transfer none): An #IdeDebugger
- *
- * Since: 3.32
  */
 IdeDebugger *
 ide_debugger_locals_view_get_debugger (IdeDebuggerLocalsView *self)
 {
   g_return_val_if_fail (IDE_IS_DEBUGGER_LOCALS_VIEW (self), NULL);
 
-  return dzl_signal_group_get_target (self->debugger_signals);
+  return ide_signal_group_get_target (self->debugger_signals);
 }
 
 void
@@ -278,7 +276,7 @@ ide_debugger_locals_view_set_debugger (IdeDebuggerLocalsView *self,
   g_return_if_fail (IDE_IS_DEBUGGER_LOCALS_VIEW (self));
   g_return_if_fail (!debugger || IDE_IS_DEBUGGER (debugger));
 
-  dzl_signal_group_set_target (self->debugger_signals, debugger);
+  ide_signal_group_set_target (self->debugger_signals, debugger);
   g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_DEBUGGER]);
 }
 
diff --git a/src/plugins/debuggerui/ide-debugger-locals-view.h 
b/src/plugins/debuggerui/ide-debugger-locals-view.h
index c29887f6e..1f716e02a 100644
--- a/src/plugins/debuggerui/ide-debugger-locals-view.h
+++ b/src/plugins/debuggerui/ide-debugger-locals-view.h
@@ -20,7 +20,7 @@
 
 #pragma once
 
-#include <gtk/gtk.h>
+#include <adwaita.h>
 
 #include "ide-debugger.h"
 
@@ -28,7 +28,7 @@ G_BEGIN_DECLS
 
 #define IDE_TYPE_DEBUGGER_LOCALS_VIEW (ide_debugger_locals_view_get_type())
 
-G_DECLARE_FINAL_TYPE (IdeDebuggerLocalsView, ide_debugger_locals_view, IDE, DEBUGGER_LOCALS_VIEW, GtkBin)
+G_DECLARE_FINAL_TYPE (IdeDebuggerLocalsView, ide_debugger_locals_view, IDE, DEBUGGER_LOCALS_VIEW, AdwBin)
 
 GtkWidget   *ide_debugger_locals_view_new          (void);
 IdeDebugger *ide_debugger_locals_view_get_debugger (IdeDebuggerLocalsView  *self);
diff --git a/src/plugins/debuggerui/ide-debugger-locals-view.ui 
b/src/plugins/debuggerui/ide-debugger-locals-view.ui
index 2c8515100..9e5d0d064 100644
--- a/src/plugins/debuggerui/ide-debugger-locals-view.ui
+++ b/src/plugins/debuggerui/ide-debugger-locals-view.ui
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
-  <template class="IdeDebuggerLocalsView" parent="GtkBin">
+  <template class="IdeDebuggerLocalsView" parent="AdwBin">
     <child>
       <object class="GtkScrolledWindow">
         <property name="min-content-width">300</property>
diff --git a/src/plugins/debuggerui/ide-debugger-log-view.c b/src/plugins/debuggerui/ide-debugger-log-view.c
index ad23110ae..26c9a9c03 100644
--- a/src/plugins/debuggerui/ide-debugger-log-view.c
+++ b/src/plugins/debuggerui/ide-debugger-log-view.c
@@ -113,7 +113,7 @@ on_entry_activate_cb (GObject      *source,
   g_assert (G_IS_ASYNC_RESULT (result));
   g_assert (IDE_IS_DEBUGGER_LOG_VIEW (self));
 
-  gtk_entry_set_text (self->commandentry, "");
+  gtk_editable_set_text (GTK_EDITABLE (self->commandentry), "");
   gtk_widget_set_sensitive (GTK_WIDGET (self->commandentry), TRUE);
   gtk_widget_grab_focus (GTK_WIDGET (self->commandentry));
 
@@ -137,7 +137,7 @@ on_entry_activate (IdeDebuggerLogView *self,
   g_return_if_fail (IDE_IS_DEBUGGER_LOG_VIEW (self));
   g_return_if_fail (GTK_IS_ENTRY (entry));
 
-  text = g_strstrip (g_strdup (gtk_entry_get_text (entry)));
+  text = g_strstrip (g_strdup (gtk_editable_get_text (GTK_EDITABLE (entry))));
   if (ide_str_empty0 (text))
     return;
 
diff --git a/src/plugins/debuggerui/ide-debugger-log-view.ui b/src/plugins/debuggerui/ide-debugger-log-view.ui
index b66fc2afb..0430f07dc 100644
--- a/src/plugins/debuggerui/ide-debugger-log-view.ui
+++ b/src/plugins/debuggerui/ide-debugger-log-view.ui
@@ -35,7 +35,10 @@
           <object class="GtkEntry" id="commandentry">
             <property name="primary-icon-name">pan-end-symbolic</property>
             <property name="visible">True</property>
-            <property name="margin">6</property>
+            <property name="margin-top">6</property>
+            <property name="margin-bottom">6</property>
+            <property name="margin-start">6</property>
+            <property name="margin-end">6</property>
             <property name="hexpand">True</property>
             <signal name="activate" handler="on_entry_activate" swapped="yes" object="IdeDebuggerLogView"/>
             <style>
diff --git a/src/plugins/debuggerui/ide-debugger-registers-view.c 
b/src/plugins/debuggerui/ide-debugger-registers-view.c
index 021f0aa8b..d81385dcd 100644
--- a/src/plugins/debuggerui/ide-debugger-registers-view.c
+++ b/src/plugins/debuggerui/ide-debugger-registers-view.c
@@ -22,17 +22,17 @@
 
 #include "config.h"
 
-#include <dazzle.h>
 #include <libide-core.h>
+#include <libide-gtk.h>
 
 #include "ide-debugger-registers-view.h"
 
 struct _IdeDebuggerRegistersView
 {
-  GtkBin          parent_instance;
+  AdwBin          parent_instance;
 
   /* Owned references */
-  DzlSignalGroup      *debugger_signals;
+  IdeSignalGroup      *debugger_signals;
 
   /* Template references */
   GtkTreeView         *tree_view;
@@ -51,18 +51,18 @@ enum {
   N_PROPS
 };
 
-G_DEFINE_FINAL_TYPE (IdeDebuggerRegistersView, ide_debugger_registers_view, GTK_TYPE_BIN)
+G_DEFINE_FINAL_TYPE (IdeDebuggerRegistersView, ide_debugger_registers_view, ADW_TYPE_BIN)
 
 static GParamSpec *properties [N_PROPS];
 
 static void
 ide_debugger_registers_view_bind (IdeDebuggerRegistersView *self,
                                   IdeDebugger              *debugger,
-                                  DzlSignalGroup           *signals)
+                                  IdeSignalGroup           *signals)
 {
   g_assert (IDE_IS_DEBUGGER_REGISTERS_VIEW (self));
   g_assert (IDE_IS_DEBUGGER (debugger));
-  g_assert (DZL_IS_SIGNAL_GROUP (signals));
+  g_assert (IDE_IS_SIGNAL_GROUP (signals));
 
   gtk_widget_set_sensitive (GTK_WIDGET (self->tree_view),
                             !ide_debugger_get_is_running (debugger));
@@ -70,10 +70,10 @@ ide_debugger_registers_view_bind (IdeDebuggerRegistersView *self,
 
 static void
 ide_debugger_registers_view_unbind (IdeDebuggerRegistersView *self,
-                                    DzlSignalGroup           *signals)
+                                    IdeSignalGroup           *signals)
 {
   g_assert (IDE_IS_DEBUGGER_REGISTERS_VIEW (self));
-  g_assert (DZL_IS_SIGNAL_GROUP (signals));
+  g_assert (IDE_IS_SIGNAL_GROUP (signals));
 
   gtk_widget_set_sensitive (GTK_WIDGET (self->tree_view), FALSE);
 }
@@ -122,7 +122,7 @@ ide_debugger_registers_view_list_registers_cb (GObject      *object,
           IdeDebuggerRegister *reg = g_ptr_array_index (registers, i);
           GtkTreeIter iter;
 
-          dzl_gtk_list_store_insert_sorted (self->list_store, &iter, reg, 0,
+          ide_gtk_list_store_insert_sorted (self->list_store, &iter, reg, 0,
                                             (GCompareDataFunc)ide_debugger_register_compare,
                                             NULL);
           gtk_list_store_set (self->list_store, &iter, 0, reg, -1);
@@ -173,13 +173,13 @@ string_property_cell_data_func (GtkCellLayout   *cell_layout,
 }
 
 static void
-ide_debugger_registers_view_destroy (GtkWidget *widget)
+ide_debugger_registers_view_dispose (GObject *object)
 {
-  IdeDebuggerRegistersView *self = (IdeDebuggerRegistersView *)widget;
+  IdeDebuggerRegistersView *self = (IdeDebuggerRegistersView *)object;
 
   g_clear_object (&self->debugger_signals);
 
-  GTK_WIDGET_CLASS (ide_debugger_registers_view_parent_class)->destroy (widget);
+  G_OBJECT_CLASS (ide_debugger_registers_view_parent_class)->dispose (object);
 }
 
 static void
@@ -226,11 +226,10 @@ ide_debugger_registers_view_class_init (IdeDebuggerRegistersViewClass *klass)
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
+  object_class->dispose = ide_debugger_registers_view_dispose;
   object_class->get_property = ide_debugger_registers_view_get_property;
   object_class->set_property = ide_debugger_registers_view_set_property;
 
-  widget_class->destroy = ide_debugger_registers_view_destroy;
-
   properties [PROP_DEBUGGER] =
     g_param_spec_object ("debugger",
                          "Debugger",
@@ -256,7 +255,7 @@ ide_debugger_registers_view_class_init (IdeDebuggerRegistersViewClass *klass)
 static void
 ide_debugger_registers_view_init (IdeDebuggerRegistersView *self)
 {
-  self->debugger_signals = dzl_signal_group_new (IDE_TYPE_DEBUGGER);
+  self->debugger_signals = ide_signal_group_new (IDE_TYPE_DEBUGGER);
 
   gtk_widget_init_template (GTK_WIDGET (self));
 
@@ -270,12 +269,12 @@ ide_debugger_registers_view_init (IdeDebuggerRegistersView *self)
                             G_CALLBACK (ide_debugger_registers_view_unbind),
                             self);
 
-  dzl_signal_group_connect_swapped (self->debugger_signals,
+  ide_signal_group_connect_swapped (self->debugger_signals,
                                     "running",
                                     G_CALLBACK (ide_debugger_registers_view_running),
                                     self);
 
-  dzl_signal_group_connect_swapped (self->debugger_signals,
+  ide_signal_group_connect_swapped (self->debugger_signals,
                                     "stopped",
                                     G_CALLBACK (ide_debugger_registers_view_stopped),
                                     self);
@@ -306,8 +305,6 @@ ide_debugger_registers_view_new (void)
  *
  *
  * Returns: (transfer none) (nullable): An #IdeDebugger or %NULL
- *
- * Since: 3.32
  */
 IdeDebugger *
 ide_debugger_registers_view_get_debugger (IdeDebuggerRegistersView *self)
@@ -315,7 +312,7 @@ ide_debugger_registers_view_get_debugger (IdeDebuggerRegistersView *self)
   g_return_val_if_fail (IDE_IS_DEBUGGER_REGISTERS_VIEW (self), NULL);
 
   if (self->debugger_signals != NULL)
-    return dzl_signal_group_get_target (self->debugger_signals);
+    return ide_signal_group_get_target (self->debugger_signals);
 
   return NULL;
 }
@@ -329,7 +326,7 @@ ide_debugger_registers_view_set_debugger (IdeDebuggerRegistersView *self,
 
   if (self->debugger_signals != NULL)
     {
-      dzl_signal_group_set_target (self->debugger_signals, debugger);
+      ide_signal_group_set_target (self->debugger_signals, debugger);
       g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_DEBUGGER]);
     }
 }
diff --git a/src/plugins/debuggerui/ide-debugger-registers-view.h 
b/src/plugins/debuggerui/ide-debugger-registers-view.h
index 45b989503..d5d57a27d 100644
--- a/src/plugins/debuggerui/ide-debugger-registers-view.h
+++ b/src/plugins/debuggerui/ide-debugger-registers-view.h
@@ -20,7 +20,7 @@
 
 #pragma once
 
-#include <gtk/gtk.h>
+#include <adwaita.h>
 
 #include "ide-debugger.h"
 
@@ -28,7 +28,7 @@ G_BEGIN_DECLS
 
 #define IDE_TYPE_DEBUGGER_REGISTERS_VIEW (ide_debugger_registers_view_get_type())
 
-G_DECLARE_FINAL_TYPE (IdeDebuggerRegistersView, ide_debugger_registers_view, IDE, DEBUGGER_REGISTERS_VIEW, 
GtkBin)
+G_DECLARE_FINAL_TYPE (IdeDebuggerRegistersView, ide_debugger_registers_view, IDE, DEBUGGER_REGISTERS_VIEW, 
AdwBin)
 
 GtkWidget   *ide_debugger_registers_view_new          (void);
 IdeDebugger *ide_debugger_registers_view_get_debugger (IdeDebuggerRegistersView *self);
diff --git a/src/plugins/debuggerui/ide-debugger-registers-view.ui 
b/src/plugins/debuggerui/ide-debugger-registers-view.ui
index eab4a2b77..83e2fb461 100644
--- a/src/plugins/debuggerui/ide-debugger-registers-view.ui
+++ b/src/plugins/debuggerui/ide-debugger-registers-view.ui
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
-  <template class="IdeDebuggerRegistersView" parent="GtkBin">
+  <template class="IdeDebuggerRegistersView" parent="AdwBin">
     <child>
       <object class="GtkScrolledWindow">
         <property name="visible">true</property>
diff --git a/src/plugins/debuggerui/ide-debugger-threads-view.c 
b/src/plugins/debuggerui/ide-debugger-threads-view.c
index c43b97868..7e317ab5c 100644
--- a/src/plugins/debuggerui/ide-debugger-threads-view.c
+++ b/src/plugins/debuggerui/ide-debugger-threads-view.c
@@ -22,19 +22,19 @@
 
 #include "config.h"
 
-#include <dazzle.h>
+#include <glib/gi18n.h>
+
 #include <libide-core.h>
 #include <libide-gui.h>
-#include <glib/gi18n.h>
 
 #include "ide-debugger-threads-view.h"
 
 struct _IdeDebuggerThreadsView
 {
-  GtkBin               parent_instance;
+  AdwBin               parent_instance;
 
   /* Owned references */
-  DzlSignalGroup      *debugger_signals;
+  IdeSignalGroup      *debugger_signals;
 
   /* Template References */
   GtkTreeView         *frames_tree_view;
@@ -70,7 +70,7 @@ enum {
   N_SIGNALS
 };
 
-G_DEFINE_FINAL_TYPE (IdeDebuggerThreadsView, ide_debugger_threads_view, GTK_TYPE_BIN)
+G_DEFINE_FINAL_TYPE (IdeDebuggerThreadsView, ide_debugger_threads_view, ADW_TYPE_BIN)
 
 static GParamSpec *properties [N_PROPS];
 static guint signals [N_SIGNALS];
@@ -175,7 +175,7 @@ ide_debugger_threads_view_thread_group_added (IdeDebuggerThreadsView *self,
   g_assert (IDE_IS_DEBUGGER_THREAD_GROUP (group));
   g_assert (IDE_IS_DEBUGGER (debugger));
 
-  dzl_gtk_list_store_insert_sorted (self->thread_groups_store,
+  ide_gtk_list_store_insert_sorted (self->thread_groups_store,
                                     &iter, group, 0,
                                     (GCompareDataFunc)ide_debugger_thread_group_compare,
                                     NULL);
@@ -225,7 +225,7 @@ ide_debugger_threads_view_thread_added (IdeDebuggerThreadsView *self,
   g_assert (IDE_IS_DEBUGGER_THREAD (thread));
   g_assert (IDE_IS_DEBUGGER (debugger));
 
-  dzl_gtk_list_store_insert_sorted (self->threads_store,
+  ide_gtk_list_store_insert_sorted (self->threads_store,
                                     &iter, thread, 0,
                                     (GCompareDataFunc)ide_debugger_thread_compare,
                                     NULL);
@@ -317,7 +317,7 @@ ide_debugger_threads_view_list_frames_cb (GObject      *object,
 static void
 ide_debugger_threads_view_bind (IdeDebuggerThreadsView *self,
                                 IdeDebugger            *debugger,
-                                DzlSignalGroup         *debugger_signals)
+                                IdeSignalGroup         *debugger_signals)
 {
   GListModel *thread_groups;
   GListModel *threads;
@@ -325,7 +325,7 @@ ide_debugger_threads_view_bind (IdeDebuggerThreadsView *self,
 
   g_assert (IDE_IS_DEBUGGER_THREADS_VIEW (self));
   g_assert (IDE_IS_DEBUGGER (debugger));
-  g_assert (DZL_IS_SIGNAL_GROUP (debugger_signals));
+  g_assert (IDE_IS_SIGNAL_GROUP (debugger_signals));
 
   /* Add any thread groups already loaded by the debugger */
 
@@ -356,10 +356,10 @@ ide_debugger_threads_view_bind (IdeDebuggerThreadsView *self,
 
 static void
 ide_debugger_threads_view_unbind (IdeDebuggerThreadsView *self,
-                                  DzlSignalGroup         *debugger_signals)
+                                  IdeSignalGroup         *debugger_signals)
 {
   g_assert (IDE_IS_DEBUGGER_THREADS_VIEW (self));
-  g_assert (DZL_IS_SIGNAL_GROUP (debugger_signals));
+  g_assert (IDE_IS_SIGNAL_GROUP (debugger_signals));
 
   gtk_list_store_clear (self->thread_groups_store);
   gtk_list_store_clear (self->threads_store);
@@ -469,7 +469,7 @@ binary_property_cell_data_func (GtkCellLayout   *cell_layout,
   g_assert (GTK_IS_TREE_MODEL (model));
   g_assert (iter != NULL);
 
-  debugger = dzl_signal_group_get_target (self->debugger_signals);
+  debugger = ide_signal_group_get_target (self->debugger_signals);
   if (debugger == NULL)
     return;
 
@@ -559,7 +559,7 @@ ide_debugger_threads_view_threads_row_activated (IdeDebuggerThreadsView *self,
   g_assert (GTK_IS_TREE_VIEW (tree_view));
 
   model = gtk_tree_view_get_model (tree_view);
-  debugger = dzl_signal_group_get_target (self->debugger_signals);
+  debugger = ide_signal_group_get_target (self->debugger_signals);
 
   if (debugger == NULL)
     return;
@@ -721,34 +721,34 @@ ide_debugger_threads_view_init (IdeDebuggerThreadsView *self)
 {
   gtk_widget_init_template (GTK_WIDGET (self));
 
-  self->debugger_signals = dzl_signal_group_new (IDE_TYPE_DEBUGGER);
+  self->debugger_signals = ide_signal_group_new (IDE_TYPE_DEBUGGER);
 
-  dzl_signal_group_connect_swapped (self->debugger_signals,
+  ide_signal_group_connect_swapped (self->debugger_signals,
                                     "running",
                                     G_CALLBACK (ide_debugger_threads_view_running),
                                     self);
 
-  dzl_signal_group_connect_swapped (self->debugger_signals,
+  ide_signal_group_connect_swapped (self->debugger_signals,
                                     "stopped",
                                     G_CALLBACK (ide_debugger_threads_view_stopped),
                                     self);
 
-  dzl_signal_group_connect_swapped (self->debugger_signals,
+  ide_signal_group_connect_swapped (self->debugger_signals,
                                     "thread-group-added",
                                     G_CALLBACK (ide_debugger_threads_view_thread_group_added),
                                     self);
 
-  dzl_signal_group_connect_swapped (self->debugger_signals,
+  ide_signal_group_connect_swapped (self->debugger_signals,
                                     "thread-group-removed",
                                     G_CALLBACK (ide_debugger_threads_view_thread_group_removed),
                                     self);
 
-  dzl_signal_group_connect_swapped (self->debugger_signals,
+  ide_signal_group_connect_swapped (self->debugger_signals,
                                     "thread-added",
                                     G_CALLBACK (ide_debugger_threads_view_thread_added),
                                     self);
 
-  dzl_signal_group_connect_swapped (self->debugger_signals,
+  ide_signal_group_connect_swapped (self->debugger_signals,
                                     "thread-removed",
                                     G_CALLBACK (ide_debugger_threads_view_thread_removed),
                                     self);
@@ -809,15 +809,13 @@ ide_debugger_threads_view_init (IdeDebuggerThreadsView *self)
  * Gets the debugger that is being observed.
  *
  * Returns: (transfer none) (nullable): An #IdeDebugger or %NULL
- *
- * Since: 3.32
  */
 IdeDebugger *
 ide_debugger_threads_view_get_debugger (IdeDebuggerThreadsView *self)
 {
   g_return_val_if_fail (IDE_IS_DEBUGGER_THREADS_VIEW (self), NULL);
 
-  return dzl_signal_group_get_target (self->debugger_signals);
+  return ide_signal_group_get_target (self->debugger_signals);
 }
 
 void
@@ -827,5 +825,5 @@ ide_debugger_threads_view_set_debugger (IdeDebuggerThreadsView *self,
   g_return_if_fail (IDE_IS_DEBUGGER_THREADS_VIEW (self));
   g_return_if_fail (!debugger || IDE_IS_DEBUGGER (debugger));
 
-  dzl_signal_group_set_target (self->debugger_signals, debugger);
+  ide_signal_group_set_target (self->debugger_signals, debugger);
 }
diff --git a/src/plugins/debuggerui/ide-debugger-threads-view.h 
b/src/plugins/debuggerui/ide-debugger-threads-view.h
index 1cdbaab88..37776ecab 100644
--- a/src/plugins/debuggerui/ide-debugger-threads-view.h
+++ b/src/plugins/debuggerui/ide-debugger-threads-view.h
@@ -20,7 +20,7 @@
 
 #pragma once
 
-#include <gtk/gtk.h>
+#include <adwaita.h>
 
 #include "ide-debugger.h"
 
@@ -28,7 +28,7 @@ G_BEGIN_DECLS
 
 #define IDE_TYPE_DEBUGGER_THREADS_VIEW (ide_debugger_threads_view_get_type())
 
-G_DECLARE_FINAL_TYPE (IdeDebuggerThreadsView, ide_debugger_threads_view, IDE, DEBUGGER_THREADS_VIEW, GtkBin)
+G_DECLARE_FINAL_TYPE (IdeDebuggerThreadsView, ide_debugger_threads_view, IDE, DEBUGGER_THREADS_VIEW, AdwBin)
 
 IdeDebugger *ide_debugger_threads_view_get_debugger (IdeDebuggerThreadsView *self);
 void         ide_debugger_threads_view_set_debugger (IdeDebuggerThreadsView *self,
diff --git a/src/plugins/debuggerui/ide-debugger-threads-view.ui 
b/src/plugins/debuggerui/ide-debugger-threads-view.ui
index 2f4ef2bcd..b8cc72683 100644
--- a/src/plugins/debuggerui/ide-debugger-threads-view.ui
+++ b/src/plugins/debuggerui/ide-debugger-threads-view.ui
@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
-  <template class="IdeDebuggerThreadsView" parent="GtkBin">
+  <template class="IdeDebuggerThreadsView" parent="AdwBin">
     <child>
-      <object class="DzlMultiPaned">
+      <object class="PanelPaned">
         <property name="orientation">horizontal</property>
-        <property name="visible">true</property>
         <child>
           <object class="GtkScrolledWindow">
             <!-- disable for now -->
@@ -13,7 +12,6 @@
               <object class="GtkTreeView" id="thread_groups_tree_view">
                 <property name="activate-on-single-click">true</property>
                 <property name="model">thread_groups_store</property>
-                <property name="visible">true</property>
                 <child>
                   <object class="GtkTreeViewColumn" id="group_column">
                     <property name="title" translatable="yes">Group</property>
@@ -31,12 +29,10 @@
         <child>
           <object class="GtkScrolledWindow">
             <property name="hscrollbar-policy">never</property>
-            <property name="visible">true</property>
             <child>
               <object class="GtkTreeView" id="threads_tree_view">
                 <property name="activate-on-single-click">true</property>
                 <property name="model">threads_store</property>
-                <property name="visible">true</property>
                 <child>
                   <object class="GtkTreeViewColumn" id="thread_column">
                     <property name="title" translatable="yes">Thread</property>
@@ -53,12 +49,10 @@
         </child>
         <child>
           <object class="GtkScrolledWindow">
-            <property name="visible">true</property>
             <child>
               <object class="GtkTreeView" id="frames_tree_view">
                 <property name="activate-on-single-click">true</property>
                 <property name="model">frames_store</property>
-                <property name="visible">true</property>
                 <child>
                   <object class="GtkTreeViewColumn" id="depth_column">
                     <property name="title" translatable="yes">Frame</property>
diff --git a/src/plugins/debuggerui/ide-debugger-workspace-addin.c 
b/src/plugins/debuggerui/ide-debugger-workspace-addin.c
new file mode 100644
index 000000000..86c7f46bc
--- /dev/null
+++ b/src/plugins/debuggerui/ide-debugger-workspace-addin.c
@@ -0,0 +1,503 @@
+/* ide-debugger-workspace-addin.c
+ *
+ * Copyright 2017-2019 Christian Hergert <chergert redhat com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#define G_LOG_DOMAIN "ide-debugger-workspace-addin"
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+
+#include <libide-code.h>
+#include <libide-core.h>
+#include <libide-debugger.h>
+#include <libide-editor.h>
+#include <libide-foundry.h>
+#include <libide-gtk.h>
+#include <libide-gui.h>
+#include <libide-io.h>
+
+#include "ide-debug-manager-private.h"
+
+#include "ide-debugger-breakpoints-view.h"
+#include "ide-debugger-controls.h"
+#include "ide-debugger-disassembly-view.h"
+#include "ide-debugger-workspace-addin.h"
+#include "ide-debugger-libraries-view.h"
+#include "ide-debugger-locals-view.h"
+#include "ide-debugger-registers-view.h"
+#include "ide-debugger-threads-view.h"
+#include "ide-debugger-log-view.h"
+
+/**
+ * SECTION:ide-debugger-workspace-addin
+ * @title: IdeDebuggerWorkspaceAddin
+ * @short_description: Debugger hooks for the workspace perspective
+ *
+ * This class allows the debugger widgetry to hook into the workspace. We add
+ * various panels to the workspace perpective and ensure they are only visible
+ * when the process is being debugged.
+ */
+
+struct _IdeDebuggerWorkspaceAddin
+{
+  GObject                     parent_instance;
+
+  IdeSignalGroup             *debug_manager_signals;
+  IdeSignalGroup             *debugger_signals;
+
+  IdeWorkspace               *workspace;
+  IdeWorkbench               *workbench;
+
+  IdeDebuggerDisassemblyView *disassembly_view;
+  IdeDebuggerControls        *controls;
+  IdeDebuggerBreakpointsView *breakpoints_view;
+  IdeDebuggerLibrariesView   *libraries_view;
+  IdeDebuggerLocalsView      *locals_view;
+  IdePane                    *panel;
+  IdeDebuggerRegistersView   *registers_view;
+  IdeDebuggerThreadsView     *threads_view;
+  IdeDebuggerLogView         *log_view;
+
+  IdeDebuggerAddress          current_address;
+};
+
+static void
+debugger_stopped (IdeDebuggerWorkspaceAddin *self,
+                  IdeDebuggerStopReason   reason,
+                  IdeDebuggerBreakpoint  *breakpoint,
+                  IdeDebugger            *debugger)
+{
+  IDE_ENTRY;
+
+  g_assert (IDE_IS_DEBUGGER_WORKSPACE_ADDIN (self));
+  g_assert (IDE_IS_DEBUGGER_STOP_REASON (reason));
+  g_assert (!breakpoint || IDE_IS_DEBUGGER_BREAKPOINT (breakpoint));
+  g_assert (IDE_IS_DEBUGGER (debugger));
+
+  if (breakpoint != NULL)
+    ide_debugger_workspace_addin_navigate_to_breakpoint (self, breakpoint);
+
+  IDE_EXIT;
+}
+
+static void
+debug_manager_notify_debugger (IdeDebuggerWorkspaceAddin *self,
+                               GParamSpec                *pspec,
+                               IdeDebugManager           *debug_manager)
+{
+  IdeDebugger *debugger;
+
+  g_assert (IDE_IS_DEBUGGER_WORKSPACE_ADDIN (self));
+  g_assert (IDE_IS_DEBUG_MANAGER (debug_manager));
+
+  panel_widget_raise (PANEL_WIDGET (self->panel));
+
+  debugger = ide_debug_manager_get_debugger (debug_manager);
+  gtk_widget_insert_action_group (GTK_WIDGET (self->workspace), "debugger", G_ACTION_GROUP (debugger));
+
+  ide_debugger_breakpoints_view_set_debugger (self->breakpoints_view, debugger);
+  ide_debugger_locals_view_set_debugger (self->locals_view, debugger);
+  ide_debugger_libraries_view_set_debugger (self->libraries_view, debugger);
+  ide_debugger_registers_view_set_debugger (self->registers_view, debugger);
+  ide_debugger_threads_view_set_debugger (self->threads_view, debugger);
+  ide_debugger_log_view_set_debugger (self->log_view, debugger);
+
+  ide_signal_group_set_target (self->debugger_signals, debugger);
+}
+
+static void
+debug_manager_notify_active (IdeDebuggerWorkspaceAddin *self,
+                             GParamSpec             *pspec,
+                             IdeDebugManager        *debug_manager)
+{
+  gboolean reveal_child = FALSE;
+
+  g_assert (IDE_IS_DEBUGGER_WORKSPACE_ADDIN (self));
+  g_assert (IDE_IS_DEBUG_MANAGER (debug_manager));
+
+  /*
+   * Instead of using a property binding, we use this signal callback so
+   * that we can adjust the reveal-child and visible. Otherwise the widgets
+   * will take up space+padding when reveal-child is FALSE.
+   */
+
+  if (ide_debug_manager_get_active (debug_manager))
+    {
+      gtk_widget_show (GTK_WIDGET (self->controls));
+      reveal_child = TRUE;
+    }
+
+  ide_debugger_controls_set_reveal_child (self->controls, reveal_child);
+}
+
+static void
+on_frame_activated (IdeDebuggerWorkspaceAddin *self,
+                    IdeDebuggerThread      *thread,
+                    IdeDebuggerFrame       *frame,
+                    IdeDebuggerThreadsView *threads_view)
+{
+  IdeDebuggerAddress addr;
+  const gchar *path;
+  guint line;
+
+  IDE_ENTRY;
+
+  g_assert (IDE_IS_DEBUGGER_WORKSPACE_ADDIN (self));
+  g_assert (IDE_IS_DEBUGGER_THREAD (thread));
+  g_assert (IDE_IS_DEBUGGER_FRAME (frame));
+  g_assert (IDE_IS_DEBUGGER_THREADS_VIEW (threads_view));
+
+  ide_debugger_locals_view_load_async (self->locals_view, thread, frame, NULL, NULL, NULL);
+
+  path = ide_debugger_frame_get_file (frame);
+  line = ide_debugger_frame_get_line (frame);
+
+  if (line > 0)
+    line--;
+
+  if (path != NULL)
+    {
+      IdeContext *context = ide_widget_get_context (GTK_WIDGET (threads_view));
+      g_autofree gchar *project_path = ide_context_build_filename (context, path, NULL);
+      g_autoptr(GFile) file = g_file_new_for_path (project_path);
+      g_autoptr(IdePanelPosition) position = ide_panel_position_new ();
+      g_autoptr(IdeLocation) location = NULL;
+
+      location = ide_location_new (file, line, -1);
+      ide_editor_focus_location (self->workspace, position, location);
+
+      IDE_EXIT;
+    }
+
+  addr = ide_debugger_frame_get_address (frame);
+
+  if (addr != IDE_DEBUGGER_ADDRESS_INVALID)
+    {
+      ide_debugger_workspace_addin_navigate_to_address (self, addr);
+      IDE_EXIT;
+    }
+
+  g_warning ("Failed to locate source or memory address for frame");
+
+  IDE_EXIT;
+}
+
+static void
+ide_debugger_workspace_addin_add_ui (IdeDebuggerWorkspaceAddin *self)
+{
+  g_autoptr(IdePanelPosition) position = NULL;
+  GtkNotebook *notebook;
+  PanelPaned *hpaned;
+
+  g_assert (IDE_IS_DEBUGGER_WORKSPACE_ADDIN (self));
+  g_assert (self->workspace != NULL);
+
+  self->controls = g_object_new (IDE_TYPE_DEBUGGER_CONTROLS,
+                                 "visible", FALSE,
+                                 NULL);
+
+  ide_pane_observe (g_object_new (IDE_TYPE_PANE,
+                                  "title", _("Debugger"),
+                                  "icon-name", "builder-debugger-symbolic",
+                                  NULL),
+                    (IdePane **)&self->panel);
+
+  notebook = g_object_new (GTK_TYPE_NOTEBOOK,
+                           "show-border", FALSE,
+                           NULL);
+  panel_widget_set_child (PANEL_WIDGET (self->panel), GTK_WIDGET (notebook));
+
+  gtk_notebook_set_action_widget (notebook, GTK_WIDGET (self->controls), GTK_PACK_START);
+
+  hpaned = g_object_new (PANEL_TYPE_PANED,
+                         "orientation", GTK_ORIENTATION_HORIZONTAL,
+                         NULL);
+  gtk_notebook_append_page (notebook, GTK_WIDGET (hpaned), gtk_label_new (_("Threads")));
+
+  self->threads_view = g_object_new (IDE_TYPE_DEBUGGER_THREADS_VIEW,
+                                     "hexpand", TRUE,
+                                     NULL);
+  g_signal_connect_swapped (self->threads_view,
+                            "frame-activated",
+                            G_CALLBACK (on_frame_activated),
+                            self);
+  panel_paned_append (hpaned, GTK_WIDGET (self->threads_view));
+
+  self->locals_view = g_object_new (IDE_TYPE_DEBUGGER_LOCALS_VIEW,
+                                    "width-request", 250,
+                                    NULL);
+  panel_paned_append (hpaned, GTK_WIDGET (self->locals_view));
+
+  self->breakpoints_view = g_object_new (IDE_TYPE_DEBUGGER_BREAKPOINTS_VIEW, NULL);
+  gtk_notebook_append_page (notebook,
+                            GTK_WIDGET (self->breakpoints_view),
+                            gtk_label_new (_("Breakpoints")));
+
+  self->libraries_view = g_object_new (IDE_TYPE_DEBUGGER_LIBRARIES_VIEW, NULL);
+  gtk_notebook_append_page (notebook,
+                            GTK_WIDGET (self->libraries_view),
+                            gtk_label_new (_("Libraries")));
+
+  self->registers_view = g_object_new (IDE_TYPE_DEBUGGER_REGISTERS_VIEW, NULL);
+  gtk_notebook_append_page (notebook,
+                            GTK_WIDGET (self->registers_view),
+                            gtk_label_new (_("Registers")));
+
+  self->log_view = g_object_new (IDE_TYPE_DEBUGGER_LOG_VIEW, NULL);
+  gtk_notebook_append_page (notebook,
+                            GTK_WIDGET (self->log_view),
+                            gtk_label_new (_("Console")));
+
+  position = ide_panel_position_new ();
+  ide_panel_position_set_edge (position, PANEL_DOCK_POSITION_BOTTOM);
+
+  ide_workspace_add_pane (self->workspace, IDE_PANE (self->panel), position);
+}
+
+static void
+ide_debugger_workspace_addin_load (IdeWorkspaceAddin *addin,
+                                   IdeWorkspace      *workspace)
+{
+  IdeDebuggerWorkspaceAddin *self = (IdeDebuggerWorkspaceAddin *)addin;
+  IdeDebugManager *debug_manager;
+  IdeContext *context;
+
+  IDE_ENTRY;
+
+  g_assert (IDE_IS_DEBUGGER_WORKSPACE_ADDIN (self));
+  g_assert (IDE_IS_WORKSPACE (workspace));
+
+  self->workspace = workspace;
+  self->workbench = ide_widget_get_workbench (GTK_WIDGET (workspace));
+
+  if (!ide_workbench_has_project (self->workbench) || !IDE_IS_PRIMARY_WORKSPACE (workspace))
+    return;
+
+  context = ide_widget_get_context (GTK_WIDGET (workspace));
+  debug_manager = ide_debug_manager_from_context (context);
+
+  ide_debugger_workspace_addin_add_ui (self);
+
+  self->debugger_signals = ide_signal_group_new (IDE_TYPE_DEBUGGER);
+
+  ide_signal_group_connect_swapped (self->debugger_signals,
+                                    "log",
+                                    G_CALLBACK (ide_debugger_log_view_debugger_log),
+                                    self->log_view);
+
+  ide_signal_group_connect_swapped (self->debugger_signals,
+                                    "stopped",
+                                    G_CALLBACK (debugger_stopped),
+                                    self);
+
+  self->debug_manager_signals = ide_signal_group_new (IDE_TYPE_DEBUG_MANAGER);
+
+  ide_signal_group_connect_swapped (self->debug_manager_signals,
+                                    "notify::active",
+                                    G_CALLBACK (debug_manager_notify_active),
+                                    self);
+
+  ide_signal_group_connect_swapped (self->debug_manager_signals,
+                                    "notify::debugger",
+                                    G_CALLBACK (debug_manager_notify_debugger),
+                                    self);
+
+  ide_signal_group_set_target (self->debug_manager_signals, debug_manager);
+
+  IDE_EXIT;
+}
+
+static void
+ide_debugger_workspace_addin_unload (IdeWorkspaceAddin *addin,
+                                     IdeWorkspace      *workspace)
+{
+  IdeDebuggerWorkspaceAddin *self = (IdeDebuggerWorkspaceAddin *)addin;
+
+  IDE_ENTRY;
+
+  g_assert (IDE_IS_DEBUGGER_WORKSPACE_ADDIN (self));
+  g_assert (IDE_IS_WORKSPACE (workspace));
+
+  if (!ide_workbench_has_project (self->workbench))
+    return;
+
+  gtk_widget_insert_action_group (GTK_WIDGET (self->workspace), "debugger", NULL);
+
+  self->controls = NULL;
+
+  g_clear_object (&self->debugger_signals);
+  g_clear_object (&self->debug_manager_signals);
+
+  ide_clear_pane ((IdePane **)&self->panel);
+  ide_clear_page ((IdePage **)&self->disassembly_view);
+
+  self->workspace = NULL;
+  self->workbench = NULL;
+
+  IDE_EXIT;
+}
+
+static void
+workspace_addin_iface_init (IdeWorkspaceAddinInterface *iface)
+{
+  iface->load = ide_debugger_workspace_addin_load;
+  iface->unload = ide_debugger_workspace_addin_unload;
+}
+
+G_DEFINE_FINAL_TYPE_WITH_CODE (IdeDebuggerWorkspaceAddin, ide_debugger_workspace_addin, G_TYPE_OBJECT,
+                               G_IMPLEMENT_INTERFACE (IDE_TYPE_WORKSPACE_ADDIN, workspace_addin_iface_init))
+
+static void
+ide_debugger_workspace_addin_class_init (IdeDebuggerWorkspaceAddinClass *klass)
+{
+}
+
+static void
+ide_debugger_workspace_addin_init (IdeDebuggerWorkspaceAddin *self)
+{
+}
+
+void
+ide_debugger_workspace_addin_navigate_to_file (IdeDebuggerWorkspaceAddin *self,
+                                               GFile                     *file,
+                                               guint                      line)
+{
+  g_autoptr(IdeLocation) location = NULL;
+
+  g_return_if_fail (IDE_IS_DEBUGGER_WORKSPACE_ADDIN (self));
+  g_return_if_fail (G_IS_FILE (file));
+
+  location = ide_location_new (file, line, -1);
+  ide_editor_focus_location (self->workspace, NULL, location);
+}
+
+static void
+ide_debugger_workspace_addin_disassemble_cb (GObject      *object,
+                                             GAsyncResult *result,
+                                             gpointer      user_data)
+{
+  IdeDebugger *debugger = (IdeDebugger *)object;
+  g_autoptr(IdeDebuggerWorkspaceAddin) self = user_data;
+  g_autoptr(GPtrArray) instructions = NULL;
+  g_autoptr(GError) error = NULL;
+
+  IDE_ENTRY;
+
+  g_assert (IDE_IS_DEBUGGER (debugger));
+  g_assert (G_IS_ASYNC_RESULT (result));
+  g_assert (IDE_IS_DEBUGGER_WORKSPACE_ADDIN (self));
+
+  instructions = ide_debugger_disassemble_finish (debugger, result, &error);
+
+  if (instructions == NULL)
+    {
+      g_warning ("%s", error->message);
+      IDE_EXIT;
+    }
+
+  if (self->workspace == NULL)
+    IDE_EXIT;
+
+  if (self->disassembly_view == NULL)
+    {
+      g_autoptr(IdePanelPosition) position = ide_panel_position_new ();
+
+      ide_page_observe (g_object_new (IDE_TYPE_DEBUGGER_DISASSEMBLY_VIEW, NULL),
+                        (IdePage **)&self->disassembly_view);
+      ide_workspace_add_page (self->workspace, IDE_PAGE (self->disassembly_view), position);
+    }
+
+  ide_debugger_disassembly_view_set_instructions (self->disassembly_view, instructions);
+  ide_debugger_disassembly_view_set_current_address (self->disassembly_view, self->current_address);
+
+  panel_widget_raise (PANEL_WIDGET (self->disassembly_view));
+
+  IDE_EXIT;
+}
+
+void
+ide_debugger_workspace_addin_navigate_to_address (IdeDebuggerWorkspaceAddin *self,
+                                                  IdeDebuggerAddress         address)
+{
+  IdeDebugger *debugger;
+  IdeDebuggerAddressRange range;
+
+  IDE_ENTRY;
+
+  g_return_if_fail (IDE_IS_DEBUGGER_WORKSPACE_ADDIN (self));
+  g_return_if_fail (address != IDE_DEBUGGER_ADDRESS_INVALID);
+
+  if (NULL == (debugger = ide_signal_group_get_target (self->debugger_signals)))
+    IDE_EXIT;
+
+  if (address < 0x80)
+    range.from = 0;
+  else
+    range.from = address - 0x80;
+
+  if (G_MAXUINT64 - 0x80 < address)
+    range.to = G_MAXUINT64;
+  else
+    range.to = address + 0x80;
+
+  self->current_address = address;
+
+  ide_debugger_disassemble_async (debugger,
+                                  &range,
+                                  NULL,
+                                  ide_debugger_workspace_addin_disassemble_cb,
+                                  g_object_ref (self));
+
+  IDE_EXIT;
+
+}
+
+void
+ide_debugger_workspace_addin_navigate_to_breakpoint (IdeDebuggerWorkspaceAddin *self,
+                                                     IdeDebuggerBreakpoint     *breakpoint)
+{
+  IdeDebuggerAddress address;
+  const gchar *path;
+  guint line;
+
+  IDE_ENTRY;
+
+  g_return_if_fail (IDE_IS_DEBUGGER_WORKSPACE_ADDIN (self));
+  g_return_if_fail (IDE_IS_DEBUGGER_BREAKPOINT (breakpoint));
+
+  address = ide_debugger_breakpoint_get_address (breakpoint);
+  path = ide_debugger_breakpoint_get_file (breakpoint);
+  line = ide_debugger_breakpoint_get_line (breakpoint);
+
+  if (line > 0)
+    line--;
+
+  if (path != NULL)
+    {
+      g_autoptr(GFile) file = g_file_new_for_path (path);
+      ide_debugger_workspace_addin_navigate_to_file (self, file, line);
+    }
+  else if (address != IDE_DEBUGGER_ADDRESS_INVALID)
+    {
+      ide_debugger_workspace_addin_navigate_to_address (self, address);
+    }
+
+  IDE_EXIT;
+}
diff --git a/src/plugins/debuggerui/ide-debugger-workspace-addin.h 
b/src/plugins/debuggerui/ide-debugger-workspace-addin.h
new file mode 100644
index 000000000..b4b70b5bb
--- /dev/null
+++ b/src/plugins/debuggerui/ide-debugger-workspace-addin.h
@@ -0,0 +1,39 @@
+/* ide-debugger-workspace-addin.h
+ *
+ * Copyright 2017-2019 Christian Hergert <chergert redhat com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#pragma once
+
+#include <libide-debugger.h>
+
+G_BEGIN_DECLS
+
+#define IDE_TYPE_DEBUGGER_WORKSPACE_ADDIN (ide_debugger_workspace_addin_get_type())
+
+G_DECLARE_FINAL_TYPE (IdeDebuggerWorkspaceAddin, ide_debugger_workspace_addin, IDE, 
DEBUGGER_WORKSPACE_ADDIN, GObject)
+
+void ide_debugger_workspace_addin_navigate_to_address    (IdeDebuggerWorkspaceAddin *self,
+                                                          IdeDebuggerAddress      address);
+void ide_debugger_workspace_addin_navigate_to_breakpoint (IdeDebuggerWorkspaceAddin *self,
+                                                          IdeDebuggerBreakpoint  *breakpoint);
+void ide_debugger_workspace_addin_navigate_to_file       (IdeDebuggerWorkspaceAddin *self,
+                                                          GFile                  *file,
+                                                          guint                   line);
+
+G_END_DECLS
diff --git a/src/plugins/debuggerui/meson.build b/src/plugins/debuggerui/meson.build
index d36812c83..eadaf71ef 100644
--- a/src/plugins/debuggerui/meson.build
+++ b/src/plugins/debuggerui/meson.build
@@ -1,9 +1,10 @@
 plugins_sources += files([
   'debuggerui-plugin.c',
+  'gbp-debugger-tool.c',
   'ide-debugger-breakpoints-view.c',
   'ide-debugger-controls.c',
   'ide-debugger-disassembly-view.c',
-  'ide-debugger-editor-addin.c',
+  'ide-debugger-workspace-addin.c',
   'ide-debugger-hover-controls.c',
   'ide-debugger-hover-provider.c',
   'ide-debugger-libraries-view.c',
diff --git a/src/plugins/debuggerui/themes/Adwaita-shared.css b/src/plugins/debuggerui/style.css
similarity index 100%
rename from src/plugins/debuggerui/themes/Adwaita-shared.css
rename to src/plugins/debuggerui/style.css


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]