[gnome-builder] libide-debugger: port to GTK 4 and IdeRunContext



commit fb459d96a42ab79e58f2830c8538a21a6113ef49
Author: Christian Hergert <chergert redhat com>
Date:   Mon Jul 11 21:20:00 2022 -0700

    libide-debugger: port to GTK 4 and IdeRunContext

 src/libide/debugger/ide-debug-manager-private.h |  37 ++++
 src/libide/debugger/ide-debug-manager.c         | 216 ++++++++----------------
 src/libide/debugger/ide-debugger.c              |  34 ++--
 src/libide/debugger/ide-debugger.h              |  31 ++--
 src/libide/debugger/meson.build                 |   1 -
 5 files changed, 145 insertions(+), 174 deletions(-)
---
diff --git a/src/libide/debugger/ide-debug-manager-private.h b/src/libide/debugger/ide-debug-manager-private.h
new file mode 100644
index 000000000..c4c5ed648
--- /dev/null
+++ b/src/libide/debugger/ide-debug-manager-private.h
@@ -0,0 +1,37 @@
+/* ide-debug-manager-private.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 "ide-debug-manager.h"
+
+#include <libide-foundry.h>
+
+G_BEGIN_DECLS
+
+gboolean _ide_debug_manager_prepare (IdeDebugManager  *self,
+                                     IdePipeline      *pipeline,
+                                     IdeRunCommand    *run_command,
+                                     IdeRunContext    *run_context,
+                                     GError          **error);
+void     _ide_debug_manager_started (IdeDebugManager  *self);
+void     _ide_debug_manager_stopped (IdeDebugManager  *self);
+
+G_END_DECLS
diff --git a/src/libide/debugger/ide-debug-manager.c b/src/libide/debugger/ide-debug-manager.c
index 61a7846f6..f80be75c3 100644
--- a/src/libide/debugger/ide-debug-manager.c
+++ b/src/libide/debugger/ide-debug-manager.c
@@ -22,17 +22,17 @@
 
 #include "config.h"
 
-#include <dazzle.h>
 #include <glib/gi18n.h>
+#include <stdlib.h>
+#include <string.h>
+
 #include <libide-code.h>
 #include <libide-plugins.h>
 #include <libide-threading.h>
-#include <stdlib.h>
-#include <string.h>
 
 #include "ide-buffer-private.h"
 
-#include "ide-debug-manager.h"
+#include "ide-debug-manager-private.h"
 #include "ide-debugger.h"
 #include "ide-debugger-private.h"
 
@@ -44,8 +44,7 @@ struct _IdeDebugManager
 
   GHashTable     *breakpoints;
   IdeDebugger    *debugger;
-  DzlSignalGroup *debugger_signals;
-  IdeRunner      *runner;
+  IdeSignalGroup *debugger_signals;
   GQueue          pending_breakpoints;
   GPtrArray      *supported_languages;
 
@@ -58,8 +57,9 @@ typedef struct
 {
   IdeDebugManager *self;
   IdeDebugger     *debugger;
-  IdeRunner       *runner;
-  gint             priority;
+  IdePipeline     *pipeline;
+  IdeRunCommand   *run_command;
+  int              priority;
 } DebuggerLookup;
 
 enum {
@@ -295,9 +295,6 @@ ide_debug_manager_debugger_stopped (IdeDebugManager       *self,
     case IDE_DEBUGGER_STOP_EXITED:
     case IDE_DEBUGGER_STOP_EXITED_NORMALLY:
     case IDE_DEBUGGER_STOP_EXITED_SIGNALED:
-      /* Cleanup any lingering debugger process */
-      if (self->runner != NULL)
-        ide_runner_force_quit (self->runner);
       break;
 
     case IDE_DEBUGGER_STOP_BREAKPOINT_HIT:
@@ -554,9 +551,8 @@ ide_debug_manager_dispose (GObject *object)
   g_queue_clear (&self->pending_breakpoints);
 
   g_hash_table_remove_all (self->breakpoints);
-  dzl_signal_group_set_target (self->debugger_signals, NULL);
+  ide_signal_group_set_target (self->debugger_signals, NULL);
   ide_clear_and_destroy_object (&self->debugger);
-  ide_clear_and_destroy_object (&self->runner);
 
   G_OBJECT_CLASS (ide_debug_manager_parent_class)->dispose (object);
 }
@@ -698,55 +694,34 @@ ide_debug_manager_init (IdeDebugManager *self)
                                              g_object_unref,
                                              g_object_unref);
 
-  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,
                                     "stopped",
                                     G_CALLBACK (ide_debug_manager_debugger_stopped),
                                     self);
 
-  dzl_signal_group_connect_swapped (self->debugger_signals,
+  ide_signal_group_connect_swapped (self->debugger_signals,
                                     "running",
                                     G_CALLBACK (ide_debug_manager_debugger_running),
                                     self);
 
-  dzl_signal_group_connect_swapped (self->debugger_signals,
+  ide_signal_group_connect_swapped (self->debugger_signals,
                                     "breakpoint-added",
                                     G_CALLBACK (ide_debug_manager_breakpoint_added),
                                     self);
 
-  dzl_signal_group_connect_swapped (self->debugger_signals,
+  ide_signal_group_connect_swapped (self->debugger_signals,
                                     "breakpoint-modified",
                                     G_CALLBACK (ide_debug_manager_breakpoint_modified),
                                     self);
 
-  dzl_signal_group_connect_swapped (self->debugger_signals,
+  ide_signal_group_connect_swapped (self->debugger_signals,
                                     "breakpoint-removed",
                                     G_CALLBACK (ide_debug_manager_breakpoint_removed),
                                     self);
 }
 
-static gboolean
-debugger_supports_language (PeasPluginInfo *plugin_info,
-                            const gchar    *language)
-{
-  const gchar *supported;
-
-  supported = peas_plugin_info_get_external_data (plugin_info, "Debugger-Languages");
-
-  if (supported != NULL)
-    {
-      g_auto(GStrv) languages = g_strsplit (supported, ",", 0);
-      for (guint i = 0; languages[i]; i++)
-        {
-          if (g_strcmp0 (languages[i], language) == 0)
-            return TRUE;
-        }
-    }
-
-  return FALSE;
-}
-
 static void
 debugger_lookup (PeasExtensionSet *set,
                  PeasPluginInfo   *plugin_info,
@@ -764,18 +739,8 @@ debugger_lookup (PeasExtensionSet *set,
 
   ide_object_append (IDE_OBJECT (lookup->self), IDE_OBJECT (debugger));
 
-  if (ide_debugger_supports_runner (debugger, lookup->runner, &priority))
+  if (ide_debugger_supports_run_command (debugger, lookup->pipeline, lookup->run_command, &priority))
     {
-      IdeBuildTarget *build_target = ide_runner_get_build_target (lookup->runner);
-
-      if (build_target != NULL)
-        {
-          g_autofree gchar *language = ide_build_target_get_language (build_target);
-
-          if (!debugger_supports_language (plugin_info, language))
-            goto failure;
-        }
-
       if (lookup->debugger == NULL || priority < lookup->priority)
         {
           ide_clear_and_destroy_object (&lookup->debugger);
@@ -785,35 +750,25 @@ debugger_lookup (PeasExtensionSet *set,
         }
     }
 
-failure:
   ide_object_destroy (IDE_OBJECT (debugger));
 }
 
-/**
- * ide_debug_manager_find_debugger:
- * @self: a #IdeDebugManager
- * @runner: An #IdeRunner
- *
- * Locates a debugger for the given runner, or %NULL if no debugger
- * supports the runner.
- *
- * Returns: (transfer full) (nullable): An #IdeDebugger or %NULL
- *
- * Since: 3.32
- */
-IdeDebugger *
+static IdeDebugger *
 ide_debug_manager_find_debugger (IdeDebugManager *self,
-                                 IdeRunner       *runner)
+                                 IdePipeline     *pipeline,
+                                 IdeRunCommand   *run_command)
 {
   g_autoptr(PeasExtensionSet) set = NULL;
   DebuggerLookup lookup;
 
-  g_return_val_if_fail (IDE_IS_DEBUG_MANAGER (self), NULL);
-  g_return_val_if_fail (IDE_IS_RUNNER (runner), NULL);
+  g_assert (IDE_IS_DEBUG_MANAGER (self));
+  g_assert (IDE_IS_PIPELINE (pipeline));
+  g_assert (IDE_IS_RUN_COMMAND (run_command));
 
   lookup.self = self;
   lookup.debugger = NULL;
-  lookup.runner = runner;
+  lookup.run_command = run_command;
+  lookup.pipeline = pipeline;
   lookup.priority = G_MAXINT;
 
   set = peas_extension_set_new (peas_engine_get_default (),
@@ -929,34 +884,38 @@ ide_debug_manager_sync_breakpoints (IdeDebugManager *self)
   IDE_EXIT;
 }
 
-static void
-ide_debug_manager_runner_spawned (IdeDebugManager *self,
-                                  const gchar     *identifier,
-                                  IdeRunner       *runner)
+void
+_ide_debug_manager_started (IdeDebugManager *self)
 {
+  IDE_ENTRY;
+
   g_assert (IDE_IS_DEBUG_MANAGER (self));
-  g_assert (identifier != NULL);
-  g_assert (IDE_IS_RUNNER (runner));
+
+  if (self->debugger == NULL)
+    IDE_EXIT;
 
   ide_debug_manager_sync_breakpoints (self);
+
+  IDE_EXIT;
 }
 
-static void
-ide_debug_manager_runner_exited (IdeDebugManager *self,
-                                 IdeRunner       *runner)
+void
+_ide_debug_manager_stopped (IdeDebugManager *self)
 {
   g_autoptr(IdeDebugger) debugger = NULL;
-  g_autoptr(IdeRunner) hold_runner = NULL;
+
+  IDE_ENTRY;
 
   g_assert (IDE_IS_DEBUG_MANAGER (self));
-  g_assert (IDE_IS_RUNNER (runner));
+
+  if (self->debugger == NULL)
+    IDE_EXIT;
 
   /*
    * Keep debugger alive so that listeners to :debugger property can
    * properly disconnect signals when we clear the debugger instance.
    */
   debugger = g_steal_pointer (&self->debugger);
-  hold_runner = g_steal_pointer (&self->runner);
 
   ide_debug_manager_set_active (self, FALSE);
   ide_debug_manager_reset_breakpoints (self);
@@ -965,96 +924,65 @@ ide_debug_manager_runner_exited (IdeDebugManager *self,
   g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_DEBUGGER]);
 
   ide_clear_and_destroy_object (&debugger);
-  ide_clear_and_destroy_object (&hold_runner);
+
+  IDE_EXIT;
 }
 
-/**
- * ide_debug_manager_start:
+/* _ide_debug_manager_prepare:
  * @self: an #IdeDebugManager
- * @runner: an #IdeRunner
+ * @pipeline: an #IdePipeline
+ * @run_command: an #IdeRunCommand
+ * @run_context: an #IdeRunContext
  * @error: A location for an @error
  *
- * Attempts to start a runner using a discovered debugger backend.
+ * Locates a suitable debugger and prepares it.
  *
- * Returns: %TRUE if successful; otherwise %FALSE and @error is set.
+ * A suitable debugger is located and prepared to run so that when
+ * @run_context is spawned, the debug manager can communicate with
+ * the inferior process.
  *
- * Since: 3.32
+ * Returns: %TRUE if successful; otherwise %FALSE and @error is set.
  */
 gboolean
-ide_debug_manager_start (IdeDebugManager  *self,
-                         IdeRunner        *runner,
-                         GError          **error)
+_ide_debug_manager_prepare (IdeDebugManager  *self,
+                            IdePipeline      *pipeline,
+                            IdeRunCommand    *run_command,
+                            IdeRunContext    *run_context,
+                            GError          **error)
 {
   g_autoptr(IdeDebugger) debugger = NULL;
-  IdeEnvironment *environment;
-  gboolean ret = FALSE;
 
   IDE_ENTRY;
 
   g_return_val_if_fail (IDE_IS_DEBUG_MANAGER (self), FALSE);
-  g_return_val_if_fail (IDE_IS_RUNNER (runner), FALSE);
+  g_return_val_if_fail (IDE_IS_RUN_COMMAND (run_command), FALSE);
+  g_return_val_if_fail (IDE_IS_RUN_CONTEXT (run_context), FALSE);
   g_return_val_if_fail (self->debugger == NULL, FALSE);
 
-  debugger = ide_debug_manager_find_debugger (self, runner);
-
-  if (debugger == NULL)
+  if (!(debugger = ide_debug_manager_find_debugger (self, pipeline, run_command)))
     {
-      ide_runner_set_failed (runner, TRUE);
-      g_set_error (error,
-                   G_IO_ERROR,
-                   G_IO_ERROR_NOT_SUPPORTED,
-                   _("A suitable debugger was not found."));
-      IDE_GOTO (failure);
+      g_set_error_literal (error,
+                           G_IO_ERROR,
+                           G_IO_ERROR_NOT_SUPPORTED,
+                           _("A suitable debugger could not be found."));
+      IDE_RETURN (FALSE);
     }
 
-  environment = ide_runner_get_environment (runner);
-  ide_environment_setenv (environment, "G_MESSAGES_DEBUG", "all");
-  ide_debugger_prepare (debugger, runner);
-
-  g_signal_connect_object (runner,
-                           "spawned",
-                           G_CALLBACK (ide_debug_manager_runner_spawned),
-                           self,
-                           G_CONNECT_SWAPPED);
-
-  g_signal_connect_object (runner,
-                           "exited",
-                           G_CALLBACK (ide_debug_manager_runner_exited),
-                           self,
-                           G_CONNECT_SWAPPED | G_CONNECT_AFTER);
+  ide_debugger_prepare_for_run (debugger, pipeline, run_context);
 
-  self->runner = g_object_ref (runner);
-  self->debugger = g_steal_pointer (&debugger);
+  if (self->stop_at_criticals)
+    ide_run_context_setenv (run_context, "G_DEBUG", "fatal-criticals");
+  else if (self->stop_at_warnings)
+    ide_run_context_setenv (run_context, "G_DEBUG", "fatal-warnings");
 
-  dzl_signal_group_set_target (self->debugger_signals, self->debugger);
+  if (g_set_object (&self->debugger, debugger))
+    ide_signal_group_set_target (self->debugger_signals, self->debugger);
 
   ide_debug_manager_set_active (self, TRUE);
 
   g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_DEBUGGER]);
 
-  ret = TRUE;
-
-failure:
-  IDE_RETURN (ret);
-}
-
-void
-ide_debug_manager_stop (IdeDebugManager *self)
-{
-  g_return_if_fail (IDE_IS_DEBUG_MANAGER (self));
-
-  dzl_signal_group_set_target (self->debugger_signals, NULL);
-
-  if (self->runner != NULL)
-    {
-      ide_runner_force_quit (self->runner);
-      ide_clear_and_destroy_object (&self->runner);
-    }
-
-  ide_clear_and_destroy_object (&self->debugger);
-  ide_debug_manager_reset_breakpoints (self);
-
-  g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_DEBUGGER]);
+  IDE_RETURN (TRUE);
 }
 
 gboolean
diff --git a/src/libide/debugger/ide-debugger.c b/src/libide/debugger/ide-debugger.c
index e803062b5..3b722d98f 100644
--- a/src/libide/debugger/ide-debugger.c
+++ b/src/libide/debugger/ide-debugger.c
@@ -1845,7 +1845,8 @@ ide_debugger_disassemble_finish (IdeDebugger   *self,
 /**
  * ide_debugger_supports_runner:
  * @self: an #IdeDebugger
- * @runner: an #IdeRunner
+ * @pipeline: an #IdePipeline
+ * #run_command: an #IdeRunCommand
  * @priority: (out): A location for a priority
  *
  * Checks if the debugger supports a given runner. The debugger may need
@@ -1854,39 +1855,44 @@ ide_debugger_disassemble_finish (IdeDebugger   *self,
  * Returns: %TRUE if the #IdeDebugger supports the runner.
  */
 gboolean
-ide_debugger_supports_runner (IdeDebugger *self,
-                              IdeRunner   *runner,
-                              gint        *priority)
+ide_debugger_supports_run_command (IdeDebugger   *self,
+                                   IdePipeline   *pipeline,
+                                   IdeRunCommand *run_command,
+                                   int           *priority)
 {
-  gint dummy = 0;
+  int dummy = 0;
 
   g_return_val_if_fail (IDE_IS_DEBUGGER (self), FALSE);
-  g_return_val_if_fail (IDE_IS_RUNNER (runner), FALSE);
+  g_return_val_if_fail (IDE_IS_PIPELINE (pipeline), FALSE);
+  g_return_val_if_fail (IDE_IS_RUN_COMMAND (run_command), FALSE);
 
   if (priority == NULL)
     priority = &dummy;
   else
     *priority = 0;
 
-  return IDE_DEBUGGER_GET_CLASS (self)->supports_runner (self, runner, priority);
+  return IDE_DEBUGGER_GET_CLASS (self)->supports_run_command (self, pipeline, run_command, priority);
 }
 
 /**
- * ide_debugger_prepare:
+ * ide_debugger_prepare_for_run:
  * @self: an #IdeDebugger
- * @runner: an #IdeRunner
+ * @pipeline: an #IdePipeline
+ * @run_context: an #IdeRunContext
  *
  * Prepares the runner to launch a debugger and target process.
  */
 void
-ide_debugger_prepare (IdeDebugger *self,
-                      IdeRunner   *runner)
+ide_debugger_prepare_for_run (IdeDebugger   *self,
+                              IdePipeline   *pipeline,
+                              IdeRunContext *run_context)
 {
   g_return_if_fail (IDE_IS_DEBUGGER (self));
-  g_return_if_fail (IDE_IS_RUNNER (runner));
+  g_return_if_fail (IDE_IS_PIPELINE (pipeline));
+  g_return_if_fail (IDE_IS_RUN_CONTEXT (run_context));
+  g_return_if_fail (IDE_DEBUGGER_GET_CLASS (self)->prepare_for_run != NULL);
 
-  if (IDE_DEBUGGER_GET_CLASS (self)->prepare)
-    IDE_DEBUGGER_GET_CLASS (self)->prepare (self, runner);
+  IDE_DEBUGGER_GET_CLASS (self)->prepare_for_run (self, pipeline, run_context);
 }
 
 /**
diff --git a/src/libide/debugger/ide-debugger.h b/src/libide/debugger/ide-debugger.h
index b6118052c..728d54aea 100644
--- a/src/libide/debugger/ide-debugger.h
+++ b/src/libide/debugger/ide-debugger.h
@@ -81,11 +81,13 @@ struct _IdeDebuggerClass
 
   /* Virtual Functions */
 
-  gboolean   (*supports_runner)          (IdeDebugger                  *self,
-                                          IdeRunner                    *runner,
-                                          gint                         *priority);
-  void       (*prepare)                  (IdeDebugger                  *self,
-                                          IdeRunner                    *runner);
+  gboolean   (*supports_run_command)     (IdeDebugger                  *self,
+                                          IdePipeline                  *pipeline,
+                                          IdeRunCommand                *run_command,
+                                          int                          *priority);
+  void       (*prepare_for_run)          (IdeDebugger                  *self,
+                                          IdePipeline                  *pipeline,
+                                          IdeRunContext                *run_context);
   gboolean   (*get_can_move)             (IdeDebugger                  *self,
                                           IdeDebuggerMovement           movement);
   void       (*move_async)               (IdeDebugger                  *self,
@@ -193,18 +195,17 @@ struct _IdeDebuggerClass
   gboolean   (*interpret_finish)         (IdeDebugger                    *self,
                                           GAsyncResult                   *result,
                                           GError                        **error);
-
-  /*< private >*/
-  gpointer _reserved[32];
 };
 
-IDE_AVAILABLE_IN_3_32
-gboolean           ide_debugger_supports_runner           (IdeDebugger                    *self,
-                                                           IdeRunner                      *runner,
-                                                           gint                           *priority);
-IDE_AVAILABLE_IN_3_32
-void               ide_debugger_prepare                   (IdeDebugger                    *self,
-                                                           IdeRunner                      *runner);
+IDE_AVAILABLE_IN_ALL
+gboolean           ide_debugger_supports_run_command      (IdeDebugger                    *self,
+                                                           IdePipeline                    *pipeline,
+                                                           IdeRunCommand                  *run_command,
+                                                           int                            *priority);
+IDE_AVAILABLE_IN_ALL
+void               ide_debugger_prepare_for_run           (IdeDebugger                    *self,
+                                                           IdePipeline                    *pipeline,
+                                                           IdeRunContext                  *run_context);
 IDE_AVAILABLE_IN_ALL
 GListModel        *ide_debugger_get_breakpoints           (IdeDebugger                    *self);
 IDE_AVAILABLE_IN_ALL
diff --git a/src/libide/debugger/meson.build b/src/libide/debugger/meson.build
index b5e72d5c0..87c56c7a0 100644
--- a/src/libide/debugger/meson.build
+++ b/src/libide/debugger/meson.build
@@ -62,7 +62,6 @@ libide_debugger_private_sources = [
 libide_debugger_deps = [
   libgio_dep,
   libgtk_dep,
-  libdazzle_dep,
 
   libide_core_dep,
   libide_io_dep,


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