[gnome-builder] libide/gui: add scaffolding for addins to restore state



commit ace4283d0d128651fa40b88128870857256ce7bf
Author: Christian Hergert <chergert redhat com>
Date:   Thu Sep 15 01:51:00 2022 -0700

    libide/gui: add scaffolding for addins to restore state

 src/libide/gui/ide-workbench-private.h |  2 ++
 src/libide/gui/ide-workbench.c         | 39 ++++++++++++++++++++++++++++++++++
 2 files changed, 41 insertions(+)
---
diff --git a/src/libide/gui/ide-workbench-private.h b/src/libide/gui/ide-workbench-private.h
index f01e9fad8..d3fd8992c 100644
--- a/src/libide/gui/ide-workbench-private.h
+++ b/src/libide/gui/ide-workbench-private.h
@@ -28,5 +28,7 @@ G_BEGIN_DECLS
 gboolean      _ide_workbench_is_last_workspace (IdeWorkbench *self,
                                                 IdeWorkspace *workspace);
 IdeWorkspace *_ide_workbench_create_secondary  (IdeWorkbench *self);
+void          _ide_workbench_set_session       (IdeWorkbench *self,
+                                                IdeSession   *session);
 
 G_END_DECLS
diff --git a/src/libide/gui/ide-workbench.c b/src/libide/gui/ide-workbench.c
index e41b433ae..d8fc032de 100644
--- a/src/libide/gui/ide-workbench.c
+++ b/src/libide/gui/ide-workbench.c
@@ -78,6 +78,7 @@ struct _IdeWorkbench
   IdeVcs              *vcs;
   IdeVcsMonitor       *vcs_monitor;
   IdeSearchEngine     *search_engine;
+  IdeSession          *session;
 
   /* Various flags */
   guint                unloaded : 1;
@@ -435,6 +436,7 @@ ide_workbench_finalize (GObject *object)
   g_clear_object (&self->project_info);
   g_clear_object (&self->cancellable);
   g_clear_object (&self->context);
+  g_clear_object (&self->session);
 
   G_OBJECT_CLASS (ide_workbench_parent_class)->finalize (object);
 }
@@ -956,6 +958,23 @@ ide_workbench_project_loaded_foreach_cb (PeasExtensionSet *set,
   ide_workbench_addin_project_loaded (addin, self->project_info);
 }
 
+static void
+ide_workbench_addin_restore_session_cb (PeasExtensionSet *set,
+                                        PeasPluginInfo   *plugin_info,
+                                        PeasExtension    *exten,
+                                        gpointer          user_data)
+{
+  IdeWorkbenchAddin *addin = (IdeWorkbenchAddin *)exten;
+  IdeSession *session = user_data;
+
+  g_assert (IDE_IS_MAIN_THREAD ());
+  g_assert (PEAS_IS_EXTENSION_SET (set));
+  g_assert (IDE_IS_WORKBENCH_ADDIN (addin));
+  g_assert (IDE_IS_SESSION (session));
+
+  ide_workbench_addin_restore_session (addin, session);
+}
+
 static void
 ide_workbench_load_project_completed (IdeWorkbench *self,
                                       IdeTask      *task)
@@ -988,6 +1007,17 @@ ide_workbench_load_project_completed (IdeWorkbench *self,
     self->search_engine = ide_object_ensure_child_typed (IDE_OBJECT (self->context),
                                                          IDE_TYPE_SEARCH_ENGINE);
 
+  /* Allow addins to restore session, which might bypass the need to create
+   * a workspace manually below.
+   */
+  if (self->session != NULL)
+    {
+      peas_extension_set_foreach (self->addins,
+                                  ide_workbench_addin_restore_session_cb,
+                                  self->session);
+      g_clear_object (&self->session);
+    }
+
   if (lp->workspace_type != G_TYPE_INVALID)
     {
       IdeWorkspace *workspace;
@@ -2795,3 +2825,12 @@ _ide_workbench_create_secondary (IdeWorkbench *self)
 
   return workspace;
 }
+
+void
+_ide_workbench_set_session (IdeWorkbench *self,
+                            IdeSession   *session)
+{
+  g_return_if_fail (IDE_IS_WORKBENCH (self));
+
+  g_set_object (&self->session, session);
+}


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