[gnome-builder] gui: add can_close vfunc for workspace addins



commit 4ffbde48a4e7c7d560e3fbca9e74039e44982038
Author: Christian Hergert <chergert redhat com>
Date:   Tue Jun 11 16:31:17 2019 -0700

    gui: add can_close vfunc for workspace addins
    
    This allows workspace addins a more convenient way to hook into the close
    process of a workspace window.

 src/libide/gui/ide-workspace-addin.c | 22 ++++++++++++++++++++++
 src/libide/gui/ide-workspace-addin.h | 27 +++++++++++++++------------
 src/libide/gui/ide-workspace.c       | 26 +++++++++++++++++++++++---
 3 files changed, 60 insertions(+), 15 deletions(-)
---
diff --git a/src/libide/gui/ide-workspace-addin.c b/src/libide/gui/ide-workspace-addin.c
index c44fee4ca..3b43dffc4 100644
--- a/src/libide/gui/ide-workspace-addin.c
+++ b/src/libide/gui/ide-workspace-addin.c
@@ -116,3 +116,25 @@ ide_workspace_addin_surface_set (IdeWorkspaceAddin *self,
   if (IDE_WORKSPACE_ADDIN_GET_IFACE (self)->surface_set)
     IDE_WORKSPACE_ADDIN_GET_IFACE (self)->surface_set (self, surface);
 }
+
+/**
+ * ide_workspace_addin_can_close:
+ * @self: an #IdeWorkspaceAddin
+ *
+ * This method is called to determine if the workspace can close. If the addin
+ * needs to prevent the workspace closing, then return %FALSE; otherwise %TRUE.
+ *
+ * Returns: %TRUE if the workspace can close; otherwise %FALSE.
+ *
+ * Since: 3.34
+ */
+gboolean
+ide_workspace_addin_can_close (IdeWorkspaceAddin *self)
+{
+  g_return_val_if_fail (IDE_IS_WORKSPACE_ADDIN (self), TRUE);
+
+  if (IDE_WORKSPACE_ADDIN_GET_IFACE (self)->can_close)
+    return IDE_WORKSPACE_ADDIN_GET_IFACE (self)->can_close (self);
+
+  return TRUE;
+}
diff --git a/src/libide/gui/ide-workspace-addin.h b/src/libide/gui/ide-workspace-addin.h
index 8bf602c88..e03d39ecf 100644
--- a/src/libide/gui/ide-workspace-addin.h
+++ b/src/libide/gui/ide-workspace-addin.h
@@ -33,22 +33,25 @@ struct _IdeWorkspaceAddinInterface
 {
   GTypeInterface parent_iface;
 
-  void (*load)        (IdeWorkspaceAddin *self,
-                       IdeWorkspace      *workspace);
-  void (*unload)      (IdeWorkspaceAddin *self,
-                       IdeWorkspace      *workspace);
-  void (*surface_set) (IdeWorkspaceAddin *self,
-                       IdeSurface        *surface);
+  void     (*load)        (IdeWorkspaceAddin *self,
+                           IdeWorkspace      *workspace);
+  void     (*unload)      (IdeWorkspaceAddin *self,
+                           IdeWorkspace      *workspace);
+  void     (*surface_set) (IdeWorkspaceAddin *self,
+                           IdeSurface        *surface);
+  gboolean (*can_close)   (IdeWorkspaceAddin *self);
 };
 
 IDE_AVAILABLE_IN_3_32
-void ide_workspace_addin_load        (IdeWorkspaceAddin *self,
-                                      IdeWorkspace      *workspace);
+void ide_workspace_addin_load          (IdeWorkspaceAddin *self,
+                                        IdeWorkspace      *workspace);
 IDE_AVAILABLE_IN_3_32
-void ide_workspace_addin_unload      (IdeWorkspaceAddin *self,
-                                      IdeWorkspace      *workspace);
+void ide_workspace_addin_unload        (IdeWorkspaceAddin *self,
+                                        IdeWorkspace      *workspace);
 IDE_AVAILABLE_IN_3_32
-void ide_workspace_addin_surface_set (IdeWorkspaceAddin *self,
-                                      IdeSurface        *surface);
+void ide_workspace_addin_surface_set   (IdeWorkspaceAddin *self,
+                                        IdeSurface        *surface);
+IDE_AVAILABLE_IN_3_34
+gboolean ide_workspace_addin_can_close (IdeWorkspaceAddin *self);
 
 G_END_DECLS
diff --git a/src/libide/gui/ide-workspace.c b/src/libide/gui/ide-workspace.c
index 7498f7634..39959dd96 100644
--- a/src/libide/gui/ide-workspace.c
+++ b/src/libide/gui/ide-workspace.c
@@ -246,17 +246,37 @@ ide_workspace_agree_to_shutdown_cb (GtkWidget *widget,
   *blocked |= !ide_surface_agree_to_shutdown (IDE_SURFACE (widget));
 }
 
+static void
+ide_workspace_addin_can_close_cb (IdeExtensionSetAdapter *adapter,
+                                  PeasPluginInfo         *plugin_info,
+                                  PeasExtension          *exten,
+                                  gpointer                user_data)
+{
+  IdeWorkspaceAddin *addin = (IdeWorkspaceAddin *)exten;
+  gboolean *blocked = user_data;
+
+  g_assert (IDE_IS_MAIN_THREAD ());
+  g_assert (IDE_IS_WORKSPACE_ADDIN (addin));
+  g_assert (blocked != NULL);
+
+  *blocked |= !ide_workspace_addin_can_close (addin);
+}
+
 static gboolean
 ide_workspace_agree_to_shutdown (IdeWorkspace *self)
 {
+  IdeWorkspacePrivate *priv = ide_workspace_get_instance_private (self);
   gboolean blocked = FALSE;
 
   g_assert (IDE_IS_MAIN_THREAD ());
   g_assert (IDE_IS_WORKSPACE (self));
 
-  ide_workspace_foreach_surface (self,
-                                 ide_workspace_agree_to_shutdown_cb,
-                                 &blocked);
+  ide_workspace_foreach_surface (self, ide_workspace_agree_to_shutdown_cb, &blocked);
+
+  if (!blocked)
+    ide_extension_set_adapter_foreach (priv->addins,
+                                       ide_workspace_addin_can_close_cb,
+                                       &blocked);
 
   return !blocked;
 }


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