[gnome-builder] plugins/debuggerui: port debugger ui to GTK 4
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] plugins/debuggerui: port debugger ui to GTK 4
- Date: Tue, 12 Jul 2022 06:39:15 +0000 (UTC)
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><</start>
+ <end>></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">
+ (?<![\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"><control><shift><alt>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]