[gnome-builder] workbench: don't use property for workbench in GbWorkbenchAddin



commit 1986ee2f2445d0d8e0f00cdf40d67ddadc4d7d8e
Author: Christian Hergert <christian hergert me>
Date:   Thu Oct 1 15:43:39 2015 -0700

    workbench: don't use property for workbench in GbWorkbenchAddin
    
    Using properties is much more pain than it is worth. Instead, just pass
    the workbench during the load and unload vfuncs like other addins do.
    
    Also, we need to change plugins that are adding "themselves" to the UI,
    as using libpeas+GInitiallyUnowned seems to be rather bad from an object
    lifecycle standpoint. It also makes GtkWidget::destroy() a pain to
    work with.

 plugins/command-bar/gb-command-bar.c             |   58 ++++-----------
 plugins/devhelp/gb-devhelp-panel.c               |   90 ++++++----------------
 plugins/device-manager/gb-device-manager-panel.c |   76 +++---------------
 plugins/symbol-tree/symbol-tree.c                |   75 ++++--------------
 plugins/sysmon/gb-sysmon-addin.c                 |   75 +++---------------
 plugins/terminal/gb-terminal-workbench-addin.c   |   68 +++--------------
 src/workbench/gb-workbench-addin.c               |   51 ++++---------
 src/workbench/gb-workbench-addin.h               |   14 ++--
 src/workbench/gb-workbench.c                     |   39 +++++++---
 9 files changed, 140 insertions(+), 406 deletions(-)
---
diff --git a/plugins/command-bar/gb-command-bar.c b/plugins/command-bar/gb-command-bar.c
index c252a9b..de5340a 100644
--- a/plugins/command-bar/gb-command-bar.c
+++ b/plugins/command-bar/gb-command-bar.c
@@ -74,17 +74,11 @@ enum {
   LAST_SIGNAL
 };
 
-enum {
-  PROP_0,
-  PROP_WORKBENCH,
-  LAST_PROP
-};
-
-static GParamSpec *gParamSpecs [LAST_PROP];
 static guint gSignals [LAST_SIGNAL];
 
 static void
-gb_command_bar_load (GbWorkbenchAddin *addin)
+gb_command_bar_load (GbWorkbenchAddin *addin,
+                     GbWorkbench      *workbench)
 {
   GbCommandBar *self = (GbCommandBar *)addin;
   GbCommandProvider *provider;
@@ -92,6 +86,8 @@ gb_command_bar_load (GbWorkbenchAddin *addin)
 
   g_assert (GB_IS_COMMAND_BAR (self));
 
+  ide_set_weak_pointer (&self->workbench, workbench);
+
   provider = g_object_new (GB_TYPE_COMMAND_GACTION_PROVIDER,
                            "workbench", self->workbench,
                            NULL);
@@ -115,19 +111,22 @@ gb_command_bar_load (GbWorkbenchAddin *addin)
 }
 
 static void
-gb_command_bar_unload (GbWorkbenchAddin *addin)
+gb_command_bar_unload (GbWorkbenchAddin *addin,
+                       GbWorkbench      *workbench)
 {
   GbCommandBar *self = (GbCommandBar *)addin;
-  GtkWidget *parent;
 
   g_assert (GB_IS_COMMAND_BAR (self));
+  g_assert (GB_IS_WORKBENCH (workbench));
 
-  ide_clear_weak_pointer (&self->workbench);
-
-  parent = gtk_widget_get_parent (GTK_WIDGET (self));
-  gtk_container_remove (GTK_CONTAINER (parent), GTK_WIDGET (self));
+  /*
+   * TODO: We can't rely on object lifecycle since we are a GtkWidget.
+   *       This plugin should be changed to have a separate addin that
+   *       then adds this widget to the workbench.
+   */
 
-  g_action_map_remove_action (G_ACTION_MAP (self->workbench), "show-command-bar");
+  g_action_map_remove_action (G_ACTION_MAP (workbench), "show-command-bar");
+  ide_clear_weak_pointer (&self->workbench);
 }
 
 GtkWidget *
@@ -641,25 +640,6 @@ gb_command_bar_finalize (GObject *object)
 }
 
 static void
-gb_command_bar_set_property (GObject      *object,
-                             guint         prop_id,
-                             const GValue *value,
-                             GParamSpec   *pspec)
-{
-  GbCommandBar *self = (GbCommandBar *)object;
-
-  switch (prop_id)
-    {
-    case PROP_WORKBENCH:
-      ide_set_weak_pointer (&self->workbench, g_value_get_object (value));
-      break;
-
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-    }
-}
-
-static void
 gb_command_bar_class_init (GbCommandBarClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -668,19 +648,9 @@ gb_command_bar_class_init (GbCommandBarClass *klass)
 
   object_class->constructed = gb_command_bar_constructed;
   object_class->finalize = gb_command_bar_finalize;
-  object_class->set_property = gb_command_bar_set_property;
 
   widget_class->grab_focus = gb_command_bar_grab_focus;
 
-  gParamSpecs [PROP_WORKBENCH] =
-    g_param_spec_object ("workbench",
-                         "Workbench",
-                         "Workbench",
-                         GB_TYPE_WORKBENCH,
-                         (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-
-  g_object_class_install_properties (object_class, LAST_PROP, gParamSpecs);
-
   /**
    * GbCommandBar::complete:
    * @bar: the object which received the signal.
diff --git a/plugins/devhelp/gb-devhelp-panel.c b/plugins/devhelp/gb-devhelp-panel.c
index d4cb3e7..cdce771 100644
--- a/plugins/devhelp/gb-devhelp-panel.c
+++ b/plugins/devhelp/gb-devhelp-panel.c
@@ -28,6 +28,7 @@
 #include "gb-editor-view.h"
 #include "gb-view.h"
 #include "gb-view-grid.h"
+#include "gb-widget.h"
 #include "gb-workbench-addin.h"
 #include "gb-workbench.h"
 #include "gb-workspace.h"
@@ -36,7 +37,6 @@ struct _GbDevhelpPanel
 {
   GtkBin             parent_instance;
 
-  GbWorkbench       *workbench;
   DhBookManager     *book_manager;
   GbDevhelpDocument *document;
 
@@ -52,26 +52,20 @@ G_DEFINE_DYNAMIC_TYPE_EXTENDED (GbDevhelpPanel, gb_devhelp_panel, GTK_TYPE_BIN,
                                 G_IMPLEMENT_INTERFACE_DYNAMIC (GB_TYPE_WORKBENCH_ADDIN,
                                                                workbench_addin_iface_init))
 
-enum {
-  PROP_0,
-  PROP_WORKBENCH,
-  LAST_PROP
-};
-
-static GParamSpec *gParamSpecs [LAST_PROP];
-
 static void
 focus_devhelp_search_cb (GSimpleAction  *action,
                          GVariant       *variant,
                          GbDevhelpPanel *self)
 {
+  GbWorkbench *workbench;
   GtkWidget *workspace;
   GtkWidget *pane;
 
   g_assert (G_IS_SIMPLE_ACTION (action));
   g_assert (GB_IS_DEVHELP_PANEL (self));
 
-  workspace = gb_workbench_get_workspace (self->workbench);
+  workbench = gb_widget_get_workbench (GTK_WIDGET (self));
+  workspace = gb_workbench_get_workspace (workbench);
   pane = gb_workspace_get_right_pane (GB_WORKSPACE (workspace));
 
   gtk_container_child_set (GTK_CONTAINER (workspace), pane,
@@ -130,7 +124,8 @@ notify_active_view_cb (GbDevhelpPanel *self,
 }
 
 static void
-gb_devhelp_panel_load (GbWorkbenchAddin *addin)
+gb_devhelp_panel_load (GbWorkbenchAddin *addin,
+                       GbWorkbench      *workbench)
 {
   GbDevhelpPanel *self = (GbDevhelpPanel *)addin;
   GtkWidget *workspace;
@@ -141,8 +136,9 @@ gb_devhelp_panel_load (GbWorkbenchAddin *addin)
   GtkWidget *parent;
 
   g_assert (GB_IS_DEVHELP_PANEL (self));
+  g_assert (GB_IS_WORKBENCH (workbench));
 
-  workspace = gb_workbench_get_workspace (self->workbench);
+  workspace = gb_workbench_get_workspace (workbench);
   pane = gb_workspace_get_right_pane (GB_WORKSPACE (workspace));
   gb_workspace_pane_add_page (GB_WORKSPACE_PANE (pane), GTK_WIDGET (self),
                               _("Documentation"), "help-contents-symbolic");
@@ -158,7 +154,7 @@ gb_devhelp_panel_load (GbWorkbenchAddin *addin)
                            G_CALLBACK (focus_devhelp_search_cb),
                            self,
                            0);
-  g_action_map_add_action (G_ACTION_MAP (self->workbench), G_ACTION (action));
+  g_action_map_add_action (G_ACTION_MAP (workbench), G_ACTION (action));
   g_clear_object (&action);
 
   app = g_application_get_default ();
@@ -170,7 +166,7 @@ gb_devhelp_panel_load (GbWorkbenchAddin *addin)
 
   gtk_stack_set_visible_child (GTK_STACK (parent), GTK_WIDGET (self));
 
-  g_signal_connect_object (self->workbench,
+  g_signal_connect_object (workbench,
                            "notify::active-view",
                            G_CALLBACK (notify_active_view_cb),
                            self,
@@ -178,24 +174,27 @@ gb_devhelp_panel_load (GbWorkbenchAddin *addin)
 }
 
 static void
-gb_devhelp_panel_unload (GbWorkbenchAddin *addin)
+gb_devhelp_panel_unload (GbWorkbenchAddin *addin,
+                         GbWorkbench      *workbench)
 {
-  GbDevhelpPanel *self = (GbDevhelpPanel *)addin;
-
-  g_assert (GB_IS_DEVHELP_PANEL (self));
-
-  ide_clear_weak_pointer (&self->workbench);
+  /*
+   * TODO: We shouldn't use ourself as the workbench addin because it is
+   *       too difficult to reliably control lifecycle. Instead use another
+   *       addin object and make this code only deal with the panel.
+   */
 }
 
 void
 gb_devhelp_panel_set_uri (GbDevhelpPanel *self,
                           const gchar    *uri)
 {
+  GbWorkbench *workbench;
   GbViewGrid *view_grid;
 
   g_return_if_fail (GB_IS_DEVHELP_PANEL (self));
 
-  view_grid = GB_VIEW_GRID (gb_workbench_get_view_grid (self->workbench));
+  workbench = gb_widget_get_workbench (GTK_WIDGET (self));
+  view_grid = GB_VIEW_GRID (gb_workbench_get_view_grid (workbench));
 
   dh_sidebar_select_uri (DH_SIDEBAR (self->sidebar), uri);
   gb_devhelp_document_set_uri (GB_DEVHELP_DOCUMENT (self->document), uri);
@@ -207,6 +206,7 @@ link_selected_cb (GbDevhelpPanel *self,
                   DhLink         *link,
                   DhSidebar      *sidebar)
 {
+  GbWorkbench *workbench;
   GbViewGrid *view_grid;
   gchar *uri;
 
@@ -214,7 +214,8 @@ link_selected_cb (GbDevhelpPanel *self,
   g_assert (link != NULL);
   g_assert (DH_IS_SIDEBAR (sidebar));
 
-  view_grid = GB_VIEW_GRID (gb_workbench_get_view_grid (self->workbench));
+  workbench = gb_widget_get_workbench (GTK_WIDGET (self));
+  view_grid = GB_VIEW_GRID (gb_workbench_get_view_grid (workbench));
 
   uri = dh_link_get_uri (link);
   gb_devhelp_document_set_uri (GB_DEVHELP_DOCUMENT (self->document), uri);
@@ -244,8 +245,6 @@ gb_devhelp_panel_finalize (GObject *object)
 {
   GbDevhelpPanel *self = (GbDevhelpPanel *)object;
 
-  ide_clear_weak_pointer (&self->workbench);
-
   g_clear_object (&self->book_manager);
   g_clear_object (&self->document);
   ide_clear_weak_pointer (&self->current_view);
@@ -254,57 +253,14 @@ gb_devhelp_panel_finalize (GObject *object)
 }
 
 static void
-gb_devhelp_panel_get_property (GObject    *object,
-                               guint       prop_id,
-                               GValue     *value,
-                               GParamSpec *pspec)
-{
-  switch (prop_id)
-    {
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-    }
-}
-
-static void
-gb_devhelp_panel_set_property (GObject      *object,
-                               guint         prop_id,
-                               const GValue *value,
-                               GParamSpec   *pspec)
-{
-  GbDevhelpPanel *self = GB_DEVHELP_PANEL (object);
-
-  switch (prop_id)
-    {
-    case PROP_WORKBENCH:
-      ide_set_weak_pointer (&self->workbench, g_value_get_object (value));
-      break;
-
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-    }
-}
-
-static void
 gb_devhelp_panel_class_init (GbDevhelpPanelClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
   object_class->finalize = gb_devhelp_panel_finalize;
-  object_class->get_property = gb_devhelp_panel_get_property;
-  object_class->set_property = gb_devhelp_panel_set_property;
 
   widget_class->grab_focus = gb_devhelp_panel_grab_focus;
-
-  gParamSpecs [PROP_WORKBENCH] =
-    g_param_spec_object ("workbench",
-                         "Workbench",
-                         "Workbench",
-                         GB_TYPE_WORKBENCH,
-                         (G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-
-  g_object_class_install_properties (object_class, LAST_PROP, gParamSpecs);
 }
 
 static void
diff --git a/plugins/device-manager/gb-device-manager-panel.c 
b/plugins/device-manager/gb-device-manager-panel.c
index 8eb4102..f81059b 100644
--- a/plugins/device-manager/gb-device-manager-panel.c
+++ b/plugins/device-manager/gb-device-manager-panel.c
@@ -26,10 +26,8 @@
 
 struct _GbDeviceManagerPanel
 {
-  GtkBox       parent_instance;
-
-  GbWorkbench *workbench;
-  GbTree      *tree;
+  GtkBox  parent_instance;
+  GbTree *tree;
 };
 
 static void workbench_addin_iface_init (GbWorkbenchAddinInterface *iface);
@@ -41,16 +39,10 @@ G_DEFINE_DYNAMIC_TYPE_EXTENDED (GbDeviceManagerPanel,
                                 G_IMPLEMENT_INTERFACE_DYNAMIC (GB_TYPE_WORKBENCH_ADDIN,
                                                                workbench_addin_iface_init))
 
-enum {
-  PROP_0,
-  PROP_WORKBENCH,
-  LAST_PROP
-};
-
-static GParamSpec *gParamSpecs [LAST_PROP];
 
 static void
-gb_device_manager_panel_load (GbWorkbenchAddin *addin)
+gb_device_manager_panel_load (GbWorkbenchAddin *addin,
+                              GbWorkbench      *workbench)
 {
   GbDeviceManagerPanel *self = (GbDeviceManagerPanel *)addin;
   IdeContext *context;
@@ -61,14 +53,14 @@ gb_device_manager_panel_load (GbWorkbenchAddin *addin)
 
   g_return_if_fail (GB_IS_DEVICE_MANAGER_PANEL (self));
 
-  context = gb_workbench_get_context (self->workbench);
+  context = gb_workbench_get_context (workbench);
   device_manager = ide_context_get_device_manager (context);
 
   root = gb_tree_node_new ();
   gb_tree_node_set_item (root, G_OBJECT (device_manager));
   gb_tree_set_root (self->tree, root);
 
-  workspace = gb_workbench_get_workspace (self->workbench);
+  workspace = gb_workbench_get_workspace (workbench);
   pane = gb_workspace_get_left_pane (GB_WORKSPACE (workspace));
   gb_workspace_pane_add_page (GB_WORKSPACE_PANE (pane),
                               GTK_WIDGET (self),
@@ -77,64 +69,20 @@ gb_device_manager_panel_load (GbWorkbenchAddin *addin)
 }
 
 static void
-gb_device_manager_panel_unload (GbWorkbenchAddin *addin)
-{
-  GbDeviceManagerPanel *self = (GbDeviceManagerPanel *)addin;
-  GtkWidget *parent;
-
-  g_return_if_fail (GB_IS_DEVICE_MANAGER_PANEL (self));
-
-  parent = gtk_widget_get_parent (GTK_WIDGET (self));
-  gtk_container_remove (GTK_CONTAINER (parent), GTK_WIDGET (self));
-}
-
-static void
-gb_device_manager_panel_finalize (GObject *object)
+gb_device_manager_panel_unload (GbWorkbenchAddin *addin,
+                                GbWorkbench      *workbench)
 {
-  GbDeviceManagerPanel *self = (GbDeviceManagerPanel *)object;
-
-  ide_clear_weak_pointer (&self->workbench);
-
-  G_OBJECT_CLASS (gb_device_manager_panel_parent_class)->finalize (object);
-}
-
-static void
-gb_device_manager_panel_set_property (GObject      *object,
-                                      guint         prop_id,
-                                      const GValue *value,
-                                      GParamSpec   *pspec)
-{
-  GbDeviceManagerPanel *self = GB_DEVICE_MANAGER_PANEL (object);
-
-  switch (prop_id)
-    {
-    case PROP_WORKBENCH:
-      ide_set_weak_pointer (&self->workbench, g_value_get_object (value));
-      break;
-
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-    }
+  /*
+   * TODO: We shouldn't add/remove ourselves. Instead, we should make
+   *       the addin structure a separate object which adds this panel.
+   */
 }
 
 static void
 gb_device_manager_panel_class_init (GbDeviceManagerPanelClass *klass)
 {
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
-  object_class->finalize = gb_device_manager_panel_finalize;
-  object_class->set_property = gb_device_manager_panel_set_property;
-
-  gParamSpecs [PROP_WORKBENCH] =
-    g_param_spec_object ("workbench",
-                         "Workbench",
-                         "Workbench",
-                         GB_TYPE_WORKBENCH,
-                         (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-
-  g_object_class_install_properties (object_class, LAST_PROP, gParamSpecs);
-
   gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/builder/plugins/device-manager/gb-device-manager-panel.ui");
   gtk_widget_class_bind_template_child (widget_class, GbDeviceManagerPanel, tree);
 
diff --git a/plugins/symbol-tree/symbol-tree.c b/plugins/symbol-tree/symbol-tree.c
index f3e7645..88f19e3 100644
--- a/plugins/symbol-tree/symbol-tree.c
+++ b/plugins/symbol-tree/symbol-tree.c
@@ -39,21 +39,12 @@ struct _SymbolTree
 
   GCancellable   *cancellable;
   EggTaskCache   *symbols_cache;
-  GbWorkbench    *workbench;
   GbTree         *tree;
   GtkSearchEntry *search_entry;
 
   guint           refresh_tree_timeout;
 };
 
-enum {
-  PROP_0,
-  PROP_WORKBENCH,
-  LAST_PROP
-};
-
-static GParamSpec *gParamSpecs [LAST_PROP];
-
 static void workbench_addin_init (GbWorkbenchAddinInterface *iface);
 
 G_DEFINE_DYNAMIC_TYPE_EXTENDED (SymbolTree, symbol_tree, GTK_TYPE_BOX, 0,
@@ -241,22 +232,23 @@ populate_cache_cb (EggTaskCache  *cache,
 }
 
 static void
-symbol_tree_load (GbWorkbenchAddin *addin)
+symbol_tree_load (GbWorkbenchAddin *addin,
+                  GbWorkbench      *workbench)
 {
   SymbolTree *self = (SymbolTree *)addin;
   GbWorkspace *workspace;
   GtkWidget *right_pane;
 
   g_assert (SYMBOL_IS_TREE (self));
-  g_assert (GB_IS_WORKBENCH (self->workbench));
+  g_assert (GB_IS_WORKBENCH (workbench));
 
-  g_signal_connect_object (self->workbench,
+  g_signal_connect_object (workbench,
                            "notify::active-view",
                            G_CALLBACK (notify_active_view_cb),
                            self,
                            G_CONNECT_SWAPPED);
 
-  workspace = GB_WORKSPACE (gb_workbench_get_workspace (self->workbench));
+  workspace = GB_WORKSPACE (gb_workbench_get_workspace (workbench));
   right_pane = gb_workspace_get_right_pane (workspace);
   gb_workspace_pane_add_page (GB_WORKSPACE_PANE (right_pane),
                               GTK_WIDGET (self),
@@ -270,28 +262,25 @@ symbol_tree_load (GbWorkbenchAddin *addin)
 }
 
 static void
-symbol_tree_unload (GbWorkbenchAddin *addin)
+symbol_tree_unload (GbWorkbenchAddin *addin,
+                    GbWorkbench      *workbench)
 {
   SymbolTree *self = (SymbolTree *)addin;
-  GbWorkspace *workspace;
-  GtkWidget *right_pane;
 
   g_assert (SYMBOL_IS_TREE (self));
-  g_assert (GB_IS_WORKBENCH (self->workbench));
+  g_assert (GB_IS_WORKBENCH (workbench));
 
-  workspace = GB_WORKSPACE (gb_workbench_get_workspace (self->workbench));
+  /*
+   * TODO: We don't want this to be the addin and the widget added to the pane.
+   *       It makes object lifecycle difficult to manage. We basically rely
+   *       on being destroyed right now until we rewrite this (which will happen soon).
+   */
+
+#if 0
+  workspace = GB_WORKSPACE (gb_workbench_get_workspace (workbench));
   right_pane = gb_workspace_get_right_pane (workspace);
   gb_workspace_pane_remove_page (GB_WORKSPACE_PANE (right_pane), GTK_WIDGET (self));
-}
-
-static void
-symbol_tree_set_workbench (SymbolTree  *self,
-                           GbWorkbench *workbench)
-{
-  g_assert (SYMBOL_IS_TREE (self));
-  g_assert (GB_IS_WORKBENCH (workbench));
-
-  ide_set_weak_pointer (&self->workbench, workbench);
+#endif
 }
 
 static gboolean
@@ -332,31 +321,11 @@ symbol_tree__search_entry_changed (SymbolTree     *self,
 }
 
 static void
-symbol_tree_set_property (GObject      *object,
-                          guint         prop_id,
-                          const GValue *value,
-                          GParamSpec   *pspec)
-{
-  SymbolTree *self = (SymbolTree *)object;
-
-  switch (prop_id)
-    {
-    case PROP_WORKBENCH:
-      symbol_tree_set_workbench (self, g_value_get_object (value));
-      break;
-
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-    }
-}
-
-static void
 symbol_tree_finalize (GObject *object)
 {
   SymbolTree *self = (SymbolTree *)object;
 
   ide_clear_source (&self->refresh_tree_timeout);
-  ide_clear_weak_pointer (&self->workbench);
   g_clear_object (&self->cancellable);
 
   G_OBJECT_CLASS (symbol_tree_parent_class)->finalize (object);
@@ -376,16 +345,6 @@ symbol_tree_class_init (SymbolTreeClass *klass)
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
   object_class->finalize = symbol_tree_finalize;
-  object_class->set_property = symbol_tree_set_property;
-
-  gParamSpecs [PROP_WORKBENCH] =
-    g_param_spec_object ("workbench",
-                         "Workbench",
-                         "Workbench",
-                         GB_TYPE_WORKBENCH,
-                         (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-
-  g_object_class_install_properties (object_class, LAST_PROP, gParamSpecs);
 
   gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/builder/plugins/symbol-tree/symbol-tree.ui");
   gtk_widget_class_bind_template_child (widget_class, SymbolTree, tree);
diff --git a/plugins/sysmon/gb-sysmon-addin.c b/plugins/sysmon/gb-sysmon-addin.c
index 0fce699..0663a18 100644
--- a/plugins/sysmon/gb-sysmon-addin.c
+++ b/plugins/sysmon/gb-sysmon-addin.c
@@ -28,8 +28,6 @@
 struct _GbSysmonAddin
 {
   GObject      parent_instance;
-
-  GbWorkbench *workbench;
   GtkWidget   *panel;
 };
 
@@ -39,70 +37,34 @@ G_DEFINE_DYNAMIC_TYPE_EXTENDED (GbSysmonAddin, gb_sysmon_addin, G_TYPE_OBJECT, 0
                                 G_IMPLEMENT_INTERFACE_DYNAMIC (GB_TYPE_WORKBENCH_ADDIN,
                                                                workbench_addin_iface_init))
 
-enum {
-  PROP_0,
-  PROP_WORKBENCH,
-  LAST_PROP
-};
-
-static GParamSpec *gParamSpecs [LAST_PROP];
-
 static void
-gb_sysmon_addin_load (GbWorkbenchAddin *addin)
+gb_sysmon_addin_load (GbWorkbenchAddin *addin,
+                      GbWorkbench      *workbench)
 {
   GbSysmonAddin *self = (GbSysmonAddin *)addin;
   GtkWidget *workspace;
   GtkWidget *pane;
+  GtkWidget *panel;
 
   g_assert (GB_IS_SYSMON_ADDIN (self));
+  g_assert (GB_IS_WORKBENCH (workbench));
 
-  workspace = gb_workbench_get_workspace (self->workbench);
+  workspace = gb_workbench_get_workspace (workbench);
   pane = gb_workspace_get_bottom_pane (GB_WORKSPACE (workspace));
-  self->panel = g_object_new (GB_TYPE_SYSMON_PANEL, "visible", TRUE, NULL);
+  panel = g_object_new (GB_TYPE_SYSMON_PANEL, "visible", TRUE, NULL);
+  ide_set_weak_pointer (&self->panel, panel);
   gb_workspace_pane_add_page (GB_WORKSPACE_PANE (pane),
-                              GTK_WIDGET (self->panel),
+                              GTK_WIDGET (panel),
                               _("System Monitor"),
                               "utilities-system-monitor-symbolic");
 }
 
 static void
-gb_sysmon_addin_unload (GbWorkbenchAddin *addin)
+gb_sysmon_addin_unload (GbWorkbenchAddin *addin,
+                        GbWorkbench      *workbench)
 {
-  GbSysmonAddin *self = (GbSysmonAddin *)addin;
-  GtkWidget *parent;
-
-  parent = gtk_widget_get_parent (self->panel);
-  gtk_container_remove (GTK_CONTAINER (parent), self->panel);
-  self->panel = NULL;
-}
-
-static void
-gb_sysmon_addin_finalize (GObject *object)
-{
-  GbSysmonAddin *self = (GbSysmonAddin *)object;
-
-  ide_clear_weak_pointer (&self->workbench);
-
-  G_OBJECT_CLASS (gb_sysmon_addin_parent_class)->finalize (object);
-}
-
-static void
-gb_sysmon_addin_set_property (GObject      *object,
-                              guint         prop_id,
-                              const GValue *value,
-                              GParamSpec   *pspec)
-{
-  GbSysmonAddin *self = GB_SYSMON_ADDIN (object);
-
-  switch (prop_id)
-    {
-    case PROP_WORKBENCH:
-      ide_set_weak_pointer (&self->workbench, g_value_get_object (value));
-      break;
-
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-    }
+  g_assert (GB_IS_SYSMON_ADDIN (addin));
+  g_assert (GB_IS_WORKBENCH (workbench));
 }
 
 static void
@@ -115,19 +77,6 @@ workbench_addin_iface_init (GbWorkbenchAddinInterface *iface)
 static void
 gb_sysmon_addin_class_init (GbSysmonAddinClass *klass)
 {
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
-  object_class->finalize = gb_sysmon_addin_finalize;
-  object_class->set_property = gb_sysmon_addin_set_property;
-
-  gParamSpecs [PROP_WORKBENCH] =
-    g_param_spec_object ("workbench",
-                         "Workbench",
-                         "Workbench",
-                         GB_TYPE_WORKBENCH,
-                         (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-
-  g_object_class_install_properties (object_class, LAST_PROP, gParamSpecs);
 }
 
 static void
diff --git a/plugins/terminal/gb-terminal-workbench-addin.c b/plugins/terminal/gb-terminal-workbench-addin.c
index 5f16483..176aa34 100644
--- a/plugins/terminal/gb-terminal-workbench-addin.c
+++ b/plugins/terminal/gb-terminal-workbench-addin.c
@@ -41,17 +41,9 @@ G_DEFINE_DYNAMIC_TYPE_EXTENDED (GbTerminalWorkbenchAddin,
                                 G_IMPLEMENT_INTERFACE (GB_TYPE_WORKBENCH_ADDIN,
                                                        workbench_addin_iface_init))
 
-enum {
-  PROP_0,
-  PROP_WORKBENCH,
-  LAST_PROP
-};
-
-static GParamSpec *gParamSpecs [LAST_PROP];
-
 static void
-new_terminal_activate_cb (GSimpleAction   *action,
-                          GVariant        *param,
+new_terminal_activate_cb (GSimpleAction            *action,
+                          GVariant                 *param,
                           GbTerminalWorkbenchAddin *self)
 {
   GbTerminalDocument *document;
@@ -67,7 +59,8 @@ new_terminal_activate_cb (GSimpleAction   *action,
 }
 
 static void
-gb_terminal_workbench_addin_load (GbWorkbenchAddin *addin)
+gb_terminal_workbench_addin_load (GbWorkbenchAddin *addin,
+                                  GbWorkbench      *workbench)
 {
   GbTerminalWorkbenchAddin *self = (GbTerminalWorkbenchAddin *)addin;
   GbWorkspace *workspace;
@@ -75,7 +68,9 @@ gb_terminal_workbench_addin_load (GbWorkbenchAddin *addin)
   g_autoptr(GSimpleAction) action = NULL;
 
   g_assert (GB_IS_TERMINAL_WORKBENCH_ADDIN (self));
-  g_assert (GB_IS_WORKBENCH (self->workbench));
+  g_assert (GB_IS_WORKBENCH (workbench));
+
+  ide_set_weak_pointer (&self->workbench, workbench);
 
   action = g_simple_action_new ("new-terminal", NULL);
   g_signal_connect_object (action,
@@ -83,7 +78,7 @@ gb_terminal_workbench_addin_load (GbWorkbenchAddin *addin)
                            G_CALLBACK (new_terminal_activate_cb),
                            self,
                            0);
-  g_action_map_add_action (G_ACTION_MAP (self->workbench), G_ACTION (action));
+  g_action_map_add_action (G_ACTION_MAP (workbench), G_ACTION (action));
 
   if (self->panel_terminal == NULL)
     {
@@ -94,7 +89,7 @@ gb_terminal_workbench_addin_load (GbWorkbenchAddin *addin)
                                  (gpointer *)&self->panel_terminal);
     }
 
-  workspace = GB_WORKSPACE (gb_workbench_get_workspace (self->workbench));
+  workspace = GB_WORKSPACE (gb_workbench_get_workspace (workbench));
   bottom_pane = gb_workspace_get_bottom_pane (workspace);
   gb_workspace_pane_add_page (GB_WORKSPACE_PANE (bottom_pane),
                               GTK_WIDGET (self->panel_terminal),
@@ -103,7 +98,8 @@ gb_terminal_workbench_addin_load (GbWorkbenchAddin *addin)
 }
 
 static void
-gb_terminal_workbench_addin_unload (GbWorkbenchAddin *addin)
+gb_terminal_workbench_addin_unload (GbWorkbenchAddin *addin,
+                                    GbWorkbench      *workbench)
 {
   GbTerminalWorkbenchAddin *self = (GbTerminalWorkbenchAddin *)addin;
 
@@ -121,50 +117,8 @@ gb_terminal_workbench_addin_unload (GbWorkbenchAddin *addin)
 }
 
 static void
-gb_terminal_workbench_addin_finalize (GObject *object)
-{
-  GbTerminalWorkbenchAddin *self = (GbTerminalWorkbenchAddin *)object;
-
-  ide_clear_weak_pointer (&self->workbench);
-
-  G_OBJECT_CLASS (gb_terminal_workbench_addin_parent_class)->finalize (object);
-}
-
-static void
-gb_terminal_workbench_addin_set_property (GObject      *object,
-                                guint         prop_id,
-                                const GValue *value,
-                                GParamSpec   *pspec)
-{
-  GbTerminalWorkbenchAddin *self = GB_TERMINAL_WORKBENCH_ADDIN (object);
-
-  switch (prop_id)
-    {
-    case PROP_WORKBENCH:
-      ide_set_weak_pointer (&self->workbench, g_value_get_object (value));
-      break;
-
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-    }
-}
-
-static void
 gb_terminal_workbench_addin_class_init (GbTerminalWorkbenchAddinClass *klass)
 {
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
-  object_class->finalize = gb_terminal_workbench_addin_finalize;
-  object_class->set_property = gb_terminal_workbench_addin_set_property;
-
-  gParamSpecs [PROP_WORKBENCH] =
-    g_param_spec_object ("workbench",
-                         "Workbench",
-                         "The workbench window.",
-                         GB_TYPE_WORKBENCH,
-                         (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-
-  g_object_class_install_properties (object_class, LAST_PROP, gParamSpecs);
 }
 
 static void
diff --git a/src/workbench/gb-workbench-addin.c b/src/workbench/gb-workbench-addin.c
index e49897f..d7585cc 100644
--- a/src/workbench/gb-workbench-addin.c
+++ b/src/workbench/gb-workbench-addin.c
@@ -23,56 +23,33 @@
 
 G_DEFINE_INTERFACE (GbWorkbenchAddin, gb_workbench_addin, G_TYPE_OBJECT)
 
-enum {
-  PROP_0,
-  PROP_WORKBENCH,
-  LAST_PROP
-};
-
-enum {
-  LOAD,
-  UNLOAD,
-  LAST_SIGNAL
-};
-
-static GParamSpec *gParamSpecs [LAST_PROP];
-static guint gSignals [LAST_SIGNAL];
+static void
+gb_workbench_addin_dummy (GbWorkbenchAddin *self,
+                          GbWorkbench      *workbench)
+{
+}
 
 static void
 gb_workbench_addin_default_init (GbWorkbenchAddinInterface *iface)
 {
-  gParamSpecs [PROP_WORKBENCH] =
-    g_param_spec_object ("workbench",
-                         "Workbench",
-                         "The workbench window.",
-                         GB_TYPE_WORKBENCH,
-                         (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-  g_object_interface_install_property (iface, gParamSpecs [PROP_WORKBENCH]);
-
-  gSignals [LOAD] = g_signal_new ("load",
-                                  G_TYPE_FROM_INTERFACE (iface),
-                                  G_SIGNAL_RUN_LAST,
-                                  G_STRUCT_OFFSET (GbWorkbenchAddinInterface, load),
-                                  NULL, NULL, NULL, G_TYPE_NONE, 0);
-
-  gSignals [UNLOAD] = g_signal_new ("unload",
-                                    G_TYPE_FROM_INTERFACE (iface),
-                                    G_SIGNAL_RUN_LAST,
-                                    G_STRUCT_OFFSET (GbWorkbenchAddinInterface, unload),
-                                    NULL, NULL, NULL, G_TYPE_NONE, 0);
+  iface->load = gb_workbench_addin_dummy;
+  iface->unload = gb_workbench_addin_dummy;
 }
 
 void
-gb_workbench_addin_load (GbWorkbenchAddin *self)
+gb_workbench_addin_load (GbWorkbenchAddin *self,
+                         GbWorkbench      *workbench)
 {
   g_return_if_fail (GB_IS_WORKBENCH_ADDIN (self));
+  g_return_if_fail (GB_IS_WORKBENCH (workbench));
 
-  g_signal_emit (self, gSignals [LOAD], 0);
+  GB_WORKBENCH_ADDIN_GET_IFACE (self)->load (self, workbench);
 }
 void
-gb_workbench_addin_unload (GbWorkbenchAddin *self)
+gb_workbench_addin_unload (GbWorkbenchAddin *self,
+                           GbWorkbench      *workbench)
 {
   g_return_if_fail (GB_IS_WORKBENCH_ADDIN (self));
 
-  g_signal_emit (self, gSignals [UNLOAD], 0);
+  GB_WORKBENCH_ADDIN_GET_IFACE (self)->unload (self, workbench);
 }
diff --git a/src/workbench/gb-workbench-addin.h b/src/workbench/gb-workbench-addin.h
index 84f42cc..2f4bb82 100644
--- a/src/workbench/gb-workbench-addin.h
+++ b/src/workbench/gb-workbench-addin.h
@@ -19,8 +19,6 @@
 #ifndef GB_WORKBENCH_ADDIN_H
 #define GB_WORKBENCH_ADDIN_H
 
-#include <glib-object.h>
-
 #include "gb-workbench.h"
 
 G_BEGIN_DECLS
@@ -33,12 +31,16 @@ struct _GbWorkbenchAddinInterface
 {
   GTypeInterface parent;
 
-  void (*load)   (GbWorkbenchAddin *self);
-  void (*unload) (GbWorkbenchAddin *self);
+  void (*load)   (GbWorkbenchAddin *self,
+                  GbWorkbench      *workbench);
+  void (*unload) (GbWorkbenchAddin *self,
+                  GbWorkbench      *workbench);
 };
 
-void gb_workbench_addin_load   (GbWorkbenchAddin *self);
-void gb_workbench_addin_unload (GbWorkbenchAddin *self);
+void gb_workbench_addin_load   (GbWorkbenchAddin *self,
+                                GbWorkbench      *workbench);
+void gb_workbench_addin_unload (GbWorkbenchAddin *self,
+                                GbWorkbench      *workbench);
 
 G_END_DECLS
 
diff --git a/src/workbench/gb-workbench.c b/src/workbench/gb-workbench.c
index 1ba2ef7..b7b61e3 100644
--- a/src/workbench/gb-workbench.c
+++ b/src/workbench/gb-workbench.c
@@ -358,6 +358,8 @@ gb_workbench_delete_event (GtkWidget   *widget,
     {
       g_assert (self->unload_cancellable == NULL);
 
+      g_clear_object (&self->extensions);
+
       self->unloading = TRUE;
       self->unload_cancellable = g_cancellable_new ();
       g_signal_emit (self, gSignals [UNLOAD], 0, self->context);
@@ -452,23 +454,42 @@ gb_workbench_active_view_unref (gpointer  data,
 static void
 gb_workbench__extension_added (PeasExtensionSet *set,
                                PeasPluginInfo   *plugin_info,
-                               GbWorkbenchAddin *addin)
+                               GbWorkbenchAddin *addin,
+                               GbWorkbench      *self)
 {
-  gb_workbench_addin_load (addin);
+  g_assert (PEAS_IS_EXTENSION_SET (set));
+  g_assert (plugin_info != NULL);
+  g_assert (GB_IS_WORKBENCH_ADDIN (addin));
+  g_assert (GB_IS_WORKBENCH (self));
+
+  /*
+   * XXX: Temporary hack until we fix plugins to not subclass GtkWidget.
+   */
+  if (G_IS_INITIALLY_UNOWNED (addin))
+    g_object_ref_sink (addin);
+
+  gb_workbench_addin_load (addin, self);
 }
 
 static void
 gb_workbench__extension_removed (PeasExtensionSet *set,
                                  PeasPluginInfo   *plugin_info,
-                                 GbWorkbenchAddin *addin)
+                                 GbWorkbenchAddin *addin,
+                                 GbWorkbench      *self)
 {
-  gb_workbench_addin_unload (addin);
+  g_assert (PEAS_IS_EXTENSION_SET (set));
+  g_assert (plugin_info != NULL);
+  g_assert (GB_IS_WORKBENCH_ADDIN (addin));
+  g_assert (GB_IS_WORKBENCH (self));
+
+  gb_workbench_addin_unload (addin, self);
 }
 
 static void
 gb_workbench_constructed (GObject *object)
 {
   GbWorkbench *self = (GbWorkbench *)object;
+  PeasEngine *engine;
   GtkApplication *app;
   GMenu *menu;
 
@@ -482,13 +503,12 @@ gb_workbench_constructed (GObject *object)
   menu = gtk_application_get_menu_by_id (app, "gear-menu");
   gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (self->gear_menu_button), G_MENU_MODEL (menu));
 
-  self->extensions = peas_extension_set_new (peas_engine_get_default (),
-                                             GB_TYPE_WORKBENCH_ADDIN,
-                                             "workbench", self,
-                                             NULL);
+  engine = peas_engine_get_default ();
+
+  self->extensions = peas_extension_set_new (engine, GB_TYPE_WORKBENCH_ADDIN, NULL);
   peas_extension_set_foreach (self->extensions,
                               (PeasExtensionSetForeachFunc)gb_workbench__extension_added,
-                              NULL);
+                              self);
   g_signal_connect (self->extensions,
                     "extension-added",
                     G_CALLBACK (gb_workbench__extension_added),
@@ -586,7 +606,6 @@ gb_workbench_finalize (GObject *object)
 
   g_clear_object (&self->context);
   g_clear_pointer (&self->current_folder_uri, g_free);
-  g_clear_object (&self->extensions);
 
   G_OBJECT_CLASS (gb_workbench_parent_class)->finalize (object);
 


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