[gnome-builder] gui: add can_close vfunc for workspace addins
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] gui: add can_close vfunc for workspace addins
- Date: Tue, 11 Jun 2019 23:37:40 +0000 (UTC)
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]