[gnome-builder] foundry: add pipeline addin prepare phase



commit f2b58e0b9aeabf422f75afaea04a7cb69d800b2b
Author: Christian Hergert <chergert redhat com>
Date:   Fri Mar 29 17:35:10 2019 -0700

    foundry: add pipeline addin prepare phase
    
    This allows connecting to pipeline signals before the pipeline addins
    load. That might be necessary to modify launchers.

 src/libide/foundry/ide-pipeline-addin.c | 29 +++++++++++++++++++++++++++--
 src/libide/foundry/ide-pipeline-addin.h | 25 +++++++++++++++----------
 src/libide/foundry/ide-pipeline.c       | 32 +++++++++++++++++++++++++++++++-
 3 files changed, 73 insertions(+), 13 deletions(-)
---
diff --git a/src/libide/foundry/ide-pipeline-addin.c b/src/libide/foundry/ide-pipeline-addin.c
index ddb30331b..fceca8fec 100644
--- a/src/libide/foundry/ide-pipeline-addin.c
+++ b/src/libide/foundry/ide-pipeline-addin.c
@@ -32,9 +32,34 @@ ide_pipeline_addin_default_init (IdePipelineAddinInterface *iface)
 {
 }
 
+/**
+ * ide_pipeline_addin_prepare:
+ * @self: a #IdePipelineAddin
+ * @pipeline: an #IdePipeline
+ *
+ * This function is called before prepare so that plugins may setup
+ * signals on the pipeline that may allow them to affect how other
+ * plugins interact.
+ *
+ * For example, if you need to connect to pipeline::launcher-created,
+ * you might want to do that here.
+ *
+ * Since: 3.34
+ */
+void
+ide_pipeline_addin_prepare (IdePipelineAddin *self,
+                            IdePipeline      *pipeline)
+{
+  g_return_if_fail (IDE_IS_PIPELINE_ADDIN (self));
+  g_return_if_fail (IDE_IS_PIPELINE (pipeline));
+
+  if (IDE_PIPELINE_ADDIN_GET_IFACE (self)->prepare)
+    IDE_PIPELINE_ADDIN_GET_IFACE (self)->prepare (self, pipeline);
+}
+
 void
 ide_pipeline_addin_load (IdePipelineAddin *self,
-                               IdePipeline      *pipeline)
+                         IdePipeline      *pipeline)
 {
   g_return_if_fail (IDE_IS_PIPELINE_ADDIN (self));
   g_return_if_fail (IDE_IS_PIPELINE (pipeline));
@@ -45,7 +70,7 @@ ide_pipeline_addin_load (IdePipelineAddin *self,
 
 void
 ide_pipeline_addin_unload (IdePipelineAddin *self,
-                                 IdePipeline      *pipeline)
+                           IdePipeline      *pipeline)
 {
   GArray *ar;
 
diff --git a/src/libide/foundry/ide-pipeline-addin.h b/src/libide/foundry/ide-pipeline-addin.h
index 8515f638f..326aa29cb 100644
--- a/src/libide/foundry/ide-pipeline-addin.h
+++ b/src/libide/foundry/ide-pipeline-addin.h
@@ -39,20 +39,25 @@ struct _IdePipelineAddinInterface
 {
   GTypeInterface type_interface;
 
-  void (*load)   (IdePipelineAddin *self,
-                  IdePipeline      *pipeline);
-  void (*unload) (IdePipelineAddin *self,
-                  IdePipeline      *pipeline);
+  void (*load)    (IdePipelineAddin *self,
+                   IdePipeline      *pipeline);
+  void (*unload)  (IdePipelineAddin *self,
+                   IdePipeline      *pipeline);
+  void (*prepare) (IdePipelineAddin *self,
+                   IdePipeline      *pipeline);
 };
 
+IDE_AVAILABLE_IN_3_34
+void ide_pipeline_addin_prepare (IdePipelineAddin *self,
+                                 IdePipeline      *pipeline);
 IDE_AVAILABLE_IN_3_32
-void ide_pipeline_addin_load   (IdePipelineAddin *self,
-                                      IdePipeline      *pipeline);
+void ide_pipeline_addin_load    (IdePipelineAddin *self,
+                                 IdePipeline      *pipeline);
 IDE_AVAILABLE_IN_3_32
-void ide_pipeline_addin_unload (IdePipelineAddin *self,
-                                      IdePipeline      *pipeline);
+void ide_pipeline_addin_unload  (IdePipelineAddin *self,
+                                 IdePipeline      *pipeline);
 IDE_AVAILABLE_IN_3_32
-void ide_pipeline_addin_track  (IdePipelineAddin *self,
-                                      guint                  stage_id);
+void ide_pipeline_addin_track   (IdePipelineAddin *self,
+                                 guint             stage_id);
 
 G_END_DECLS
diff --git a/src/libide/foundry/ide-pipeline.c b/src/libide/foundry/ide-pipeline.c
index 4864269a0..d3e83ecfe 100644
--- a/src/libide/foundry/ide-pipeline.c
+++ b/src/libide/foundry/ide-pipeline.c
@@ -940,6 +940,27 @@ ide_pipeline_real_finished (IdePipeline *self,
   IDE_EXIT;
 }
 
+static void
+ide_pipeline_extension_prepare (IdeExtensionSetAdapter *set,
+                                PeasPluginInfo         *plugin_info,
+                                PeasExtension          *exten,
+                                gpointer                user_data)
+{
+  IdePipeline *self = user_data;
+  IdePipelineAddin *addin = (IdePipelineAddin *)exten;
+
+  IDE_ENTRY;
+
+  g_assert (IDE_IS_EXTENSION_SET_ADAPTER (set));
+  g_assert (plugin_info != NULL);
+  g_assert (IDE_IS_PIPELINE_ADDIN (addin));
+  g_assert (IDE_IS_PIPELINE (self));
+
+  ide_pipeline_addin_prepare (addin, self);
+
+  IDE_EXIT;
+}
+
 static void
 ide_pipeline_extension_added (IdeExtensionSetAdapter *set,
                               PeasPluginInfo         *plugin_info,
@@ -1193,9 +1214,18 @@ ide_pipeline_load (IdePipeline *self)
 
   g_signal_connect (self->addins,
                     "extension-added",
-                    G_CALLBACK (ide_pipeline_extension_added),
+                    G_CALLBACK (ide_pipeline_extension_prepare),
                     self);
 
+  ide_extension_set_adapter_foreach (self->addins,
+                                     ide_pipeline_extension_prepare,
+                                     self);
+
+  g_signal_connect_after (self->addins,
+                          "extension-added",
+                          G_CALLBACK (ide_pipeline_extension_added),
+                          self);
+
   g_signal_connect (self->addins,
                     "extension-removed",
                     G_CALLBACK (ide_pipeline_extension_removed),


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