[gnome-builder] libide/gui: add workspace addin save session API



commit 693520546a2776103e5ddcb1fe5278acd7a61296
Author: Christian Hergert <chergert redhat com>
Date:   Thu Sep 15 01:11:04 2022 -0700

    libide/gui: add workspace addin save session API
    
    This can be more convenient in some cases where you only have a workspace
    addin and don't want to create the workbench addin. What would really help
    though is to have the workspaces automatically created/restored so that
    these can be used to restore items symmetrically.

 src/libide/gui/ide-workbench.c         |  7 +++++++
 src/libide/gui/ide-workspace-addin.c   | 11 +++++++++++
 src/libide/gui/ide-workspace-addin.h   |  6 ++++++
 src/libide/gui/ide-workspace-private.h |  3 +++
 src/libide/gui/ide-workspace.c         | 31 +++++++++++++++++++++++++++++++
 5 files changed, 58 insertions(+)
---
diff --git a/src/libide/gui/ide-workbench.c b/src/libide/gui/ide-workbench.c
index b58fb7669..e41b433ae 100644
--- a/src/libide/gui/ide-workbench.c
+++ b/src/libide/gui/ide-workbench.c
@@ -1714,6 +1714,13 @@ ide_workbench_unload_async (IdeWorkbench        *self,
       ide_workbench_addin_save_session (addin, session);
     }
 
+  /* Now let the workspaces capture themselves as that is a
+   * more convenient session API for some addins.
+   */
+  ide_workbench_foreach_workspace (self,
+                                   (IdeWorkspaceCallback)_ide_workspace_save_session,
+                                   session);
+
   /* Release the search engine early to help it cleanup */
   ide_clear_and_destroy_object (&self->search_engine);
 
diff --git a/src/libide/gui/ide-workspace-addin.c b/src/libide/gui/ide-workspace-addin.c
index 50ca38e91..4abe70975 100644
--- a/src/libide/gui/ide-workspace-addin.c
+++ b/src/libide/gui/ide-workspace-addin.c
@@ -132,3 +132,14 @@ ide_workspace_addin_ref_action_group (IdeWorkspaceAddin *self)
 
   return action_group;
 }
+
+void
+ide_workspace_addin_save_session (IdeWorkspaceAddin *self,
+                                  IdeSession        *session)
+{
+  g_return_if_fail (IDE_IS_WORKSPACE_ADDIN (self));
+  g_return_if_fail (IDE_IS_SESSION (session));
+
+  if (IDE_WORKSPACE_ADDIN_GET_IFACE (self)->save_session)
+    IDE_WORKSPACE_ADDIN_GET_IFACE (self)->save_session (self, session);
+}
diff --git a/src/libide/gui/ide-workspace-addin.h b/src/libide/gui/ide-workspace-addin.h
index d34a2bbfa..19db630fb 100644
--- a/src/libide/gui/ide-workspace-addin.h
+++ b/src/libide/gui/ide-workspace-addin.h
@@ -27,6 +27,7 @@
 #include <libide-core.h>
 
 #include "ide-page.h"
+#include "ide-session.h"
 #include "ide-workspace.h"
 
 G_BEGIN_DECLS
@@ -47,6 +48,8 @@ struct _IdeWorkspaceAddinInterface
   void          (*page_changed)     (IdeWorkspaceAddin *self,
                                      IdePage           *page);
   GActionGroup *(*ref_action_group) (IdeWorkspaceAddin *self);
+  void          (*save_session)     (IdeWorkspaceAddin *self,
+                                     IdeSession        *session);
 };
 
 IDE_AVAILABLE_IN_ALL
@@ -59,6 +62,9 @@ IDE_AVAILABLE_IN_ALL
 void               ide_workspace_addin_page_changed        (IdeWorkspaceAddin *self,
                                                             IdePage           *page);
 IDE_AVAILABLE_IN_ALL
+void               ide_workspace_addin_save_session        (IdeWorkspaceAddin *self,
+                                                            IdeSession        *session);
+IDE_AVAILABLE_IN_ALL
 GActionGroup      *ide_workspace_addin_ref_action_group    (IdeWorkspaceAddin *self);
 IDE_AVAILABLE_IN_ALL
 IdeWorkspaceAddin *ide_workspace_addin_find_by_module_name (IdeWorkspace      *workspace,
diff --git a/src/libide/gui/ide-workspace-private.h b/src/libide/gui/ide-workspace-private.h
index 6371a4295..5d75ebb6d 100644
--- a/src/libide/gui/ide-workspace-private.h
+++ b/src/libide/gui/ide-workspace-private.h
@@ -22,6 +22,7 @@
 
 #include "ide-grid.h"
 #include "ide-panel-position.h"
+#include "ide-session.h"
 #include "ide-workspace.h"
 
 G_BEGIN_DECLS
@@ -60,5 +61,7 @@ void        _ide_workspace_agree_to_close_async  (IdeWorkspace         *self,
 gboolean    _ide_workspace_agree_to_close_finish (IdeWorkspace         *self,
                                                   GAsyncResult         *result,
                                                   GError              **error);
+void        _ide_workspace_save_session          (IdeWorkspace         *self,
+                                                  IdeSession           *session);
 
 G_END_DECLS
diff --git a/src/libide/gui/ide-workspace.c b/src/libide/gui/ide-workspace.c
index 837250e94..d0c0f08f7 100644
--- a/src/libide/gui/ide-workspace.c
+++ b/src/libide/gui/ide-workspace.c
@@ -1674,3 +1674,34 @@ ide_workspace_uninhibit_logout (IdeWorkspace *self)
 
   priv->inhibit_logout_count--;
 }
+
+static void
+ide_workspace_addin_save_session_cb (IdeExtensionSetAdapter *adapter,
+                                     PeasPluginInfo         *plugin_info,
+                                     PeasExtension          *exten,
+                                     gpointer                user_data)
+{
+  IdeWorkspaceAddin *addin = (IdeWorkspaceAddin *)exten;
+  IdeSession *session = user_data;
+
+  g_assert (IDE_IS_EXTENSION_SET_ADAPTER (adapter));
+  g_assert (plugin_info != NULL);
+  g_assert (IDE_IS_WORKSPACE_ADDIN (addin));
+  g_assert (IDE_IS_SESSION (session));
+
+  ide_workspace_addin_save_session (addin, session);
+}
+
+void
+_ide_workspace_save_session (IdeWorkspace *self,
+                             IdeSession   *session)
+{
+  IdeWorkspacePrivate *priv = ide_workspace_get_instance_private (self);
+
+  g_return_if_fail (IDE_IS_WORKSPACE (self));
+  g_return_if_fail (IDE_IS_SESSION (session));
+
+  ide_extension_set_adapter_foreach (priv->addins,
+                                     ide_workspace_addin_save_session_cb,
+                                     session);
+}


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