[gnome-builder] libide-foundry: add IdeRunTool



commit e23d0e07d59544d36fecb07f45316d90e21a020a
Author: Christian Hergert <chergert redhat com>
Date:   Mon Jul 11 21:07:04 2022 -0700

    libide-foundry: add IdeRunTool
    
    This is a tool that can integrate with the project run capabilities to
    inject itself as necessary into the spawn pipeline. Debuggers, for example,
    may use that to rewrite the command line to spawn via the debugger.

 src/libide/foundry/ide-no-tool-private.h  |  33 ++++
 src/libide/foundry/ide-no-tool.c          |  72 +++++++++
 src/libide/foundry/ide-run-tool-private.h |  31 ++++
 src/libide/foundry/ide-run-tool.c         | 252 ++++++++++++++++++++++++++++++
 src/libide/foundry/ide-run-tool.h         |  71 +++++++++
 src/libide/foundry/libide-foundry.h       |   1 +
 src/libide/foundry/meson.build            |   5 +
 7 files changed, 465 insertions(+)
---
diff --git a/src/libide/foundry/ide-no-tool-private.h b/src/libide/foundry/ide-no-tool-private.h
new file mode 100644
index 000000000..f597660d1
--- /dev/null
+++ b/src/libide/foundry/ide-no-tool-private.h
@@ -0,0 +1,33 @@
+/* ide-no-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 "ide-run-tool.h"
+
+G_BEGIN_DECLS
+
+#define IDE_TYPE_NO_TOOL (ide_no_tool_get_type())
+
+G_DECLARE_FINAL_TYPE (IdeNoTool, ide_no_tool, IDE, NO_TOOL, IdeRunTool)
+
+IdeRunTool *ide_no_tool_new (void);
+
+G_END_DECLS
diff --git a/src/libide/foundry/ide-no-tool.c b/src/libide/foundry/ide-no-tool.c
new file mode 100644
index 000000000..26c80d2a4
--- /dev/null
+++ b/src/libide/foundry/ide-no-tool.c
@@ -0,0 +1,72 @@
+/* ide-no-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 "ide-no-tool"
+
+#include "config.h"
+
+#include "ide-no-tool-private.h"
+#include "ide-pipeline.h"
+#include "ide-run-command.h"
+#include "ide-run-context.h"
+
+struct _IdeNoTool
+{
+  IdeRunTool parent_instance;
+};
+
+G_DEFINE_FINAL_TYPE (IdeNoTool, ide_no_tool, IDE_TYPE_RUN_TOOL)
+
+static void
+ide_no_tool_prepare_to_run (IdeRunTool    *run_tool,
+                            IdePipeline   *pipeline,
+                            IdeRunCommand *run_command,
+                            IdeRunContext *run_context)
+{
+  IDE_ENTRY;
+
+  g_assert (IDE_IS_MAIN_THREAD ());
+  g_assert (IDE_IS_PIPELINE (pipeline));
+  g_assert (IDE_IS_RUN_COMMAND (run_command));
+  g_assert (IDE_IS_RUN_CONTEXT (run_context));
+
+  IDE_EXIT;
+}
+
+static void
+ide_no_tool_class_init (IdeNoToolClass *klass)
+{
+  IdeRunToolClass *run_tool_class = IDE_RUN_TOOL_CLASS (klass);
+
+  run_tool_class->prepare_to_run = ide_no_tool_prepare_to_run;
+}
+
+static void
+ide_no_tool_init (IdeNoTool *self)
+{
+  ide_run_tool_set_icon_name (IDE_RUN_TOOL (self),
+                              "builder-run-start-symbolic");
+}
+
+IdeRunTool *
+ide_no_tool_new (void)
+{
+  return g_object_new (IDE_TYPE_NO_TOOL, NULL);
+}
diff --git a/src/libide/foundry/ide-run-tool-private.h b/src/libide/foundry/ide-run-tool-private.h
new file mode 100644
index 000000000..43a30d015
--- /dev/null
+++ b/src/libide/foundry/ide-run-tool-private.h
@@ -0,0 +1,31 @@
+/* ide-run-tool-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-run-tool.h"
+
+G_BEGIN_DECLS
+
+void _ide_run_tool_emit_started (IdeRunTool    *self,
+                                 IdeSubprocess *subprocess);
+void _ide_run_tool_emit_stopped (IdeRunTool    *self);
+
+G_END_DECLS
diff --git a/src/libide/foundry/ide-run-tool.c b/src/libide/foundry/ide-run-tool.c
new file mode 100644
index 000000000..d5213a053
--- /dev/null
+++ b/src/libide/foundry/ide-run-tool.c
@@ -0,0 +1,252 @@
+/* ide-run-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 "ide-run-tool"
+
+#include "config.h"
+
+#include "ide-pipeline.h"
+#include "ide-run-command.h"
+#include "ide-run-context.h"
+#include "ide-run-tool-private.h"
+
+typedef struct
+{
+  IdeSubprocess *subprocess;
+  char *icon_name;
+} IdeRunToolPrivate;
+
+G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (IdeRunTool, ide_run_tool, IDE_TYPE_OBJECT)
+
+enum {
+  PROP_0,
+  PROP_ICON_NAME,
+  N_PROPS
+};
+
+enum {
+  STARTED,
+  STOPPED,
+  N_SIGNALS
+};
+
+static GParamSpec *properties[N_PROPS];
+static guint signals[N_SIGNALS];
+
+static void
+ide_run_tool_real_force_exit (IdeRunTool *self)
+{
+  IdeRunToolPrivate *priv = ide_run_tool_get_instance_private (self);
+
+  g_assert (IDE_IS_RUN_TOOL (self));
+
+  if (priv->subprocess != NULL)
+    ide_subprocess_force_exit (priv->subprocess);
+}
+
+static void
+ide_run_tool_real_send_signal (IdeRunTool *self,
+                               int         signum)
+{
+  IdeRunToolPrivate *priv = ide_run_tool_get_instance_private (self);
+
+  g_assert (IDE_IS_MAIN_THREAD ());
+  g_assert (IDE_IS_RUN_TOOL (self));
+
+  g_debug ("Sending signal %d to subprocess %p", signum, priv->subprocess);
+
+  if (priv->subprocess != NULL)
+    ide_subprocess_send_signal (priv->subprocess, signum);
+}
+
+static void
+ide_run_tool_dispose (GObject *object)
+{
+  IdeRunTool *self = (IdeRunTool *)object;
+  IdeRunToolPrivate *priv = ide_run_tool_get_instance_private (self);
+
+  g_clear_object (&priv->subprocess);
+  g_clear_pointer (&priv->icon_name, g_free);
+
+  G_OBJECT_CLASS (ide_run_tool_parent_class)->dispose (object);
+}
+
+static void
+ide_run_tool_get_property (GObject    *object,
+                           guint       prop_id,
+                           GValue     *value,
+                           GParamSpec *pspec)
+{
+  IdeRunTool *self = IDE_RUN_TOOL (object);
+
+  switch (prop_id)
+    {
+    case PROP_ICON_NAME:
+      g_value_set_string (value, ide_run_tool_get_icon_name (self));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+ide_run_tool_set_property (GObject      *object,
+                           guint         prop_id,
+                           const GValue *value,
+                           GParamSpec   *pspec)
+{
+  IdeRunTool *self = IDE_RUN_TOOL (object);
+
+  switch (prop_id)
+    {
+    case PROP_ICON_NAME:
+      ide_run_tool_set_icon_name (self, g_value_get_string (value));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+ide_run_tool_class_init (IdeRunToolClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->dispose = ide_run_tool_dispose;
+  object_class->get_property = ide_run_tool_get_property;
+  object_class->set_property = ide_run_tool_set_property;
+
+  klass->force_exit = ide_run_tool_real_force_exit;
+  klass->send_signal = ide_run_tool_real_send_signal;
+
+  signals[STARTED] =
+    g_signal_new ("started",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (IdeRunToolClass, started),
+                  NULL, NULL,
+                  NULL,
+                  G_TYPE_NONE, 1, IDE_TYPE_SUBPROCESS);
+
+  signals[STOPPED] =
+    g_signal_new ("stopped",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (IdeRunToolClass, stopped),
+                  NULL, NULL,
+                  NULL,
+                  G_TYPE_NONE, 0);
+}
+
+static void
+ide_run_tool_init (IdeRunTool *self)
+{
+}
+
+void
+ide_run_tool_force_exit (IdeRunTool *self)
+{
+  g_return_if_fail (IDE_IS_RUN_TOOL (self));
+
+  IDE_RUN_TOOL_GET_CLASS (self)->force_exit (self);
+}
+
+void
+ide_run_tool_send_signal (IdeRunTool *self,
+                          int         signum)
+{
+  g_return_if_fail (IDE_IS_RUN_TOOL (self));
+
+  IDE_RUN_TOOL_GET_CLASS (self)->send_signal (self, signum);
+}
+
+void
+ide_run_tool_prepare_to_run (IdeRunTool    *self,
+                             IdePipeline   *pipeline,
+                             IdeRunCommand *run_command,
+                             IdeRunContext *run_context)
+{
+  g_return_if_fail (IDE_IS_RUN_TOOL (self));
+  g_return_if_fail (IDE_IS_PIPELINE (pipeline));
+  g_return_if_fail (IDE_IS_RUN_COMMAND (run_command));
+  g_return_if_fail (IDE_IS_RUN_CONTEXT (run_context));
+
+  if (IDE_RUN_TOOL_GET_CLASS (self)->prepare_to_run)
+    IDE_RUN_TOOL_GET_CLASS (self)->prepare_to_run (self, pipeline, run_command, run_context);
+}
+
+void
+_ide_run_tool_emit_started (IdeRunTool    *self,
+                            IdeSubprocess *subprocess)
+{
+  IdeRunToolPrivate *priv = ide_run_tool_get_instance_private (self);
+
+  IDE_ENTRY;
+
+  g_return_if_fail (IDE_IS_MAIN_THREAD ());
+  g_return_if_fail (IDE_IS_RUN_TOOL (self));
+
+  g_debug ("%s started", G_OBJECT_TYPE_NAME (self));
+  g_set_object (&priv->subprocess, subprocess);
+  g_signal_emit (self, signals[STARTED], 0, subprocess);
+
+  IDE_EXIT;
+}
+
+void
+_ide_run_tool_emit_stopped (IdeRunTool *self)
+{
+  IdeRunToolPrivate *priv = ide_run_tool_get_instance_private (self);
+
+  IDE_ENTRY;
+
+  g_return_if_fail (IDE_IS_MAIN_THREAD ());
+  g_return_if_fail (IDE_IS_RUN_TOOL (self));
+
+  g_debug ("%s stopped", G_OBJECT_TYPE_NAME (self));
+  g_clear_object (&priv->subprocess);
+  g_signal_emit (self, signals[STOPPED], 0);
+
+  IDE_EXIT;
+}
+
+const char *
+ide_run_tool_get_icon_name (IdeRunTool *self)
+{
+  IdeRunToolPrivate *priv = ide_run_tool_get_instance_private (self);
+
+  g_return_val_if_fail (IDE_IS_RUN_TOOL (self), NULL);
+
+  return priv->icon_name;
+}
+
+void
+ide_run_tool_set_icon_name (IdeRunTool *self,
+                            const char *icon_name)
+{
+  IdeRunToolPrivate *priv = ide_run_tool_get_instance_private (self);
+
+  g_return_if_fail (IDE_IS_RUN_TOOL (self));
+
+  if (!ide_set_string (&priv->icon_name, icon_name))
+    g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_ICON_NAME]);
+}
diff --git a/src/libide/foundry/ide-run-tool.h b/src/libide/foundry/ide-run-tool.h
new file mode 100644
index 000000000..eea53e592
--- /dev/null
+++ b/src/libide/foundry/ide-run-tool.h
@@ -0,0 +1,71 @@
+/* ide-run-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
+
+#if !defined (IDE_FOUNDRY_INSIDE) && !defined (IDE_FOUNDRY_COMPILATION)
+# error "Only <libide-foundry.h> can be included directly."
+#endif
+
+#include <libide-core.h>
+#include <libide-threading.h>
+
+#include "ide-foundry-types.h"
+
+G_BEGIN_DECLS
+
+#define IDE_TYPE_RUN_TOOL (ide_run_tool_get_type())
+
+IDE_AVAILABLE_IN_ALL
+G_DECLARE_DERIVABLE_TYPE (IdeRunTool, ide_run_tool, IDE, RUN_TOOL, IdeObject)
+
+struct _IdeRunToolClass
+{
+  IdeObjectClass parent_class;
+
+  void (*started)        (IdeRunTool    *self,
+                          IdeSubprocess *subprocess);
+  void (*stopped)        (IdeRunTool    *self);
+  void (*prepare_to_run) (IdeRunTool    *self,
+                          IdePipeline   *pipeline,
+                          IdeRunCommand *run_command,
+                          IdeRunContext *run_context);
+  void (*force_exit)     (IdeRunTool    *self);
+  void (*send_signal)    (IdeRunTool    *self,
+                          int            signum);
+};
+
+IDE_AVAILABLE_IN_ALL
+void        ide_run_tool_force_exit     (IdeRunTool    *self);
+IDE_AVAILABLE_IN_ALL
+void        ide_run_tool_send_signal    (IdeRunTool    *self,
+                                         int            signum);
+IDE_AVAILABLE_IN_ALL
+void        ide_run_tool_prepare_to_run (IdeRunTool    *self,
+                                         IdePipeline   *pipeline,
+                                         IdeRunCommand *run_command,
+                                         IdeRunContext *run_context);
+IDE_AVAILABLE_IN_ALL
+const char *ide_run_tool_get_icon_name  (IdeRunTool    *self);
+IDE_AVAILABLE_IN_ALL
+void        ide_run_tool_set_icon_name  (IdeRunTool    *self,
+                                         const char    *icon_name);
+
+G_END_DECLS
diff --git a/src/libide/foundry/libide-foundry.h b/src/libide/foundry/libide-foundry.h
index 6b0ecdda0..edc28b72b 100644
--- a/src/libide/foundry/libide-foundry.h
+++ b/src/libide/foundry/libide-foundry.h
@@ -60,6 +60,7 @@ G_BEGIN_DECLS
 #include "ide-run-commands.h"
 #include "ide-run-context.h"
 #include "ide-run-manager.h"
+#include "ide-run-tool.h"
 #include "ide-runtime-manager.h"
 #include "ide-runtime-provider.h"
 #include "ide-runtime.h"
diff --git a/src/libide/foundry/meson.build b/src/libide/foundry/meson.build
index 7b591bda2..8d8dda851 100644
--- a/src/libide/foundry/meson.build
+++ b/src/libide/foundry/meson.build
@@ -42,6 +42,7 @@ libide_foundry_public_headers = [
   'ide-pipeline.h',
   'ide-run-context.h',
   'ide-run-manager.h',
+  'ide-run-tool.h',
   'ide-runtime-manager.h',
   'ide-runtime-provider.h',
   'ide-runtime.h',
@@ -64,7 +65,9 @@ libide_foundry_private_headers = [
   'ide-config-private.h',
   'ide-device-private.h',
   'ide-foundry-init.h',
+  'ide-no-tool-private.h',
   'ide-run-manager-private.h',
+  'ide-run-tool-private.h',
   'ide-runtime-private.h',
   'ide-toolchain-private.h',
 ]
@@ -114,6 +117,7 @@ libide_foundry_public_sources = [
   'ide-pipeline.c',
   'ide-run-context.c',
   'ide-run-manager.c',
+  'ide-run-tool.c',
   'ide-runtime-manager.c',
   'ide-runtime-provider.c',
   'ide-runtime.c',
@@ -133,6 +137,7 @@ libide_foundry_private_sources = [
   'ide-build-log.c',
   'ide-build-utils.c',
   'ide-foundry-init.c',
+  'ide-no-tool.c',
 ]
 
 libide_foundry_sources += libide_foundry_public_sources


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