[gnome-builder] workbench: use proxy GActionGroup to dispatch actions to workspaces.



commit edeae4c4372aad91ec725832bbcf15b54255a06e
Author: Christian Hergert <christian hergert me>
Date:   Tue Sep 9 22:58:34 2014 -0700

    workbench: use proxy GActionGroup to dispatch actions to workspaces.
    
    Previously, we would have had to proxy all global commands via the
    workspace interface. This is pretty tedious and britle. So instead,
    you can now just define the actions in the workspace and the proxy
    will hook them up to "workbench.<action>" if they are also defined
    in gb-workbench-actions.

 src/devhelp/gb-devhelp-workspace.c    |   39 +++++-
 src/editor/gb-editor-workspace.c      |   20 ++-
 src/gnome-builder.mk                  |    2 +
 src/resources/keybindings/default.ini |    2 +-
 src/resources/ui/gb-workbench.ui      |    2 +-
 src/workbench/gb-workbench-actions.c  |  231 +++++++++++++++++++++++++++++++++
 src/workbench/gb-workbench-actions.h  |   58 ++++++++
 src/workbench/gb-workbench.c          |  105 +++------------
 src/workbench/gb-workspace.h          |    3 -
 9 files changed, 356 insertions(+), 106 deletions(-)
---
diff --git a/src/devhelp/gb-devhelp-workspace.c b/src/devhelp/gb-devhelp-workspace.c
index 8661022..9aecf40 100644
--- a/src/devhelp/gb-devhelp-workspace.c
+++ b/src/devhelp/gb-devhelp-workspace.c
@@ -26,11 +26,12 @@
 
 struct _GbDevhelpWorkspacePrivate
 {
-  DhBookManager   *book_manager;
+  DhBookManager      *book_manager;
+  GSimpleActionGroup *actions;
 
-  GtkPaned        *paned;
-  DhSidebar       *sidebar;
-  GbMultiNotebook *multi_notebook;
+  GtkPaned           *paned;
+  DhSidebar          *sidebar;
+  GbMultiNotebook    *multi_notebook;
 };
 
 G_DEFINE_TYPE_WITH_PRIVATE (GbDevhelpWorkspace,
@@ -59,16 +60,19 @@ update_show_tabs (GbDevhelpWorkspace *workspace)
 }
 
 static void
-gb_devhelp_workspace_new_tab (GbWorkspace *workspace)
+on_new_tab_activated (GSimpleAction *action,
+                      GVariant      *parameter,
+                      gpointer       user_data)
 {
   GbDevhelpWorkspacePrivate *priv;
+  GbDevhelpWorkspace *workspace = user_data;
   GbNotebook *notebook;
   GbTab *tab;
   gint page = -1;
 
   g_return_if_fail (GB_IS_DEVHELP_WORKSPACE (workspace));
 
-  priv = GB_DEVHELP_WORKSPACE (workspace)->priv;
+  priv = workspace->priv;
 
   tab = g_object_new (GB_TYPE_DEVHELP_TAB,
                       "title", _ ("Empty Page"),
@@ -131,10 +135,30 @@ static void
 gb_devhelp_workspace_constructed (GObject *object)
 {
   GbDevhelpWorkspacePrivate *priv = GB_DEVHELP_WORKSPACE (object)->priv;
+  static const GActionEntry action_entries[] = {
+     { "new-tab", on_new_tab_activated },
+  };
 
   g_return_if_fail (GB_IS_DEVHELP_WORKSPACE (object));
 
   dh_book_manager_populate (priv->book_manager);
+
+  priv->actions = g_simple_action_group_new ();
+
+  g_action_map_add_action_entries (G_ACTION_MAP (priv->actions),
+                                   action_entries,
+                                   G_N_ELEMENTS (action_entries),
+                                   object);
+}
+
+static GActionGroup *
+gb_devhelp_workspace_get_actions (GbWorkspace *workspace)
+{
+   GbDevhelpWorkspacePrivate *priv = GB_DEVHELP_WORKSPACE (workspace)->priv;
+
+   g_assert (GB_IS_DEVHELP_WORKSPACE (workspace));
+
+   return G_ACTION_GROUP (priv->actions);
 }
 
 static void
@@ -144,6 +168,7 @@ gb_devhelp_workspace_finalize (GObject *object)
 
   priv = GB_DEVHELP_WORKSPACE (object)->priv;
 
+  g_clear_object (&priv->actions);
   g_clear_object (&priv->book_manager);
 
   G_OBJECT_CLASS (gb_devhelp_workspace_parent_class)->finalize (object);
@@ -158,7 +183,7 @@ gb_devhelp_workspace_class_init (GbDevhelpWorkspaceClass *klass)
   object_class->constructed = gb_devhelp_workspace_constructed;
   object_class->finalize = gb_devhelp_workspace_finalize;
 
-  workspace_class->new_tab = gb_devhelp_workspace_new_tab;
+  workspace_class->get_actions = gb_devhelp_workspace_get_actions;
 }
 
 static void
diff --git a/src/editor/gb-editor-workspace.c b/src/editor/gb-editor-workspace.c
index ccfe621..ba22e37 100644
--- a/src/editor/gb-editor-workspace.c
+++ b/src/editor/gb-editor-workspace.c
@@ -45,16 +45,19 @@ gb_editor_workspace_get_actions (GbWorkspace * workspace)
 }
 
 static void
-gb_editor_workspace_new_tab (GbWorkspace *workspace)
+on_new_tab_activate (GSimpleAction *action,
+                     GVariant      *parameter,
+                     gpointer       user_data)
 {
   GbEditorWorkspacePrivate *priv;
+  GbEditorWorkspace *workspace = user_data;
   GbNotebook *notebook;
   GbTab *tab;
   gint page;
 
   g_return_if_fail (GB_IS_EDITOR_WORKSPACE (workspace));
 
-  priv = GB_EDITOR_WORKSPACE (workspace)->priv;
+  priv = workspace->priv;
 
   notebook = gb_multi_notebook_get_active_notebook (priv->multi_notebook);
   tab = g_object_new (GB_TYPE_EDITOR_TAB,
@@ -69,18 +72,19 @@ gb_editor_workspace_new_tab (GbWorkspace *workspace)
 }
 
 static void
-gb_editor_workspace_find (GbWorkspace *workspace)
+on_find_activate (GSimpleAction *action,
+                  GVariant      *parameter,
+                  gpointer       user_data)
 {
   GbEditorWorkspacePrivate *priv;
+  GbEditorWorkspace *workspace = user_data;
   GbTab *tab;
 
   g_return_if_fail (GB_IS_EDITOR_WORKSPACE (workspace));
 
-  priv = GB_EDITOR_WORKSPACE (workspace)->priv;
+  priv = workspace->priv;
 
   tab = gb_multi_notebook_get_active_tab (priv->multi_notebook);
-  g_assert (GB_IS_EDITOR_TAB (tab));
-
   if (tab)
     gb_editor_tab_focus_search (GB_EDITOR_TAB (tab));
 }
@@ -281,8 +285,6 @@ gb_editor_workspace_class_init (GbEditorWorkspaceClass *klass)
 
   object_class->finalize = gb_editor_workspace_finalize;
 
-  workspace_class->find = gb_editor_workspace_find;
-  workspace_class->new_tab = gb_editor_workspace_new_tab;
   workspace_class->get_actions = gb_editor_workspace_get_actions;
 
   widget_class->grab_focus = gb_editor_workspace_grab_focus;
@@ -292,8 +294,10 @@ static void
 gb_editor_workspace_init (GbEditorWorkspace *workspace)
 {
   static const GActionEntry action_entries[] = {
+    { "find", on_find_activate },
     { "go-to-end", on_go_to_end_activate },
     { "go-to-start", on_go_to_start_activate },
+    { "new-tab", on_new_tab_activate },
     { "open", on_open_activate },
     { "reformat", on_reformat_activate },
     { "save", on_save_activate },
diff --git a/src/gnome-builder.mk b/src/gnome-builder.mk
index a235502..68f760a 100644
--- a/src/gnome-builder.mk
+++ b/src/gnome-builder.mk
@@ -78,6 +78,8 @@ gnome_builder_SOURCES = \
        src/util/gb-widget.h \
        src/workbench/gb-workbench.c \
        src/workbench/gb-workbench.h \
+       src/workbench/gb-workbench-actions.c \
+       src/workbench/gb-workbench-actions.h \
        src/workbench/gb-workspace.c \
        src/workbench/gb-workspace.h \
        src/main.c
diff --git a/src/resources/keybindings/default.ini b/src/resources/keybindings/default.ini
index 0a638ba..1a4eab5 100644
--- a/src/resources/keybindings/default.ini
+++ b/src/resources/keybindings/default.ini
@@ -1,4 +1,4 @@
-[win]
+[workbench]
 new-tab = <Control><Shift>T
 find = <Control>F
 
diff --git a/src/resources/ui/gb-workbench.ui b/src/resources/ui/gb-workbench.ui
index acae07d..fcd8b7c 100644
--- a/src/resources/ui/gb-workbench.ui
+++ b/src/resources/ui/gb-workbench.ui
@@ -51,7 +51,7 @@
         <child>
           <object class="GtkButton" id="new_tab">
             <property name="visible">True</property>
-            <property name="action_name">win.new-tab</property>
+            <property name="action_name">workbench.new-tab</property>
             <style>
               <class name="image-button"/>
             </style>
diff --git a/src/workbench/gb-workbench-actions.c b/src/workbench/gb-workbench-actions.c
new file mode 100644
index 0000000..b652744
--- /dev/null
+++ b/src/workbench/gb-workbench-actions.c
@@ -0,0 +1,231 @@
+/* gb-workbench-actions.c
+ *
+ * Copyright (C) 2014 Christian Hergert <christian hergert me>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <glib/gi18n.h>
+
+#include "gb-workbench-actions.h"
+
+enum
+{
+   PROP_0,
+   PROP_WORKBENCH,
+   LAST_PROP
+};
+
+struct _GbWorkbenchActionsPrivate
+{
+   GbWorkspace *workspace;
+   GSList      *bindings;
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE (GbWorkbenchActions,
+                            gb_workbench_actions,
+                            G_TYPE_SIMPLE_ACTION_GROUP)
+
+static GParamSpec *gParamSpecs [LAST_PROP];
+
+GbWorkbenchActions *
+gb_workbench_actions_new (GbWorkbench *workbench)
+{
+   return g_object_new (GB_TYPE_WORKBENCH_ACTIONS,
+                        "workbench", workbench,
+                        NULL);
+}
+
+static void
+disconnect_bindings (GbWorkbenchActions *actions)
+{
+   GSList *iter;
+   GSList *list;
+
+   g_return_if_fail (GB_IS_WORKBENCH_ACTIONS (actions));
+
+   list = actions->priv->bindings;
+   actions->priv->bindings = NULL;
+
+   for (iter = list; iter; iter = iter->next) {
+      g_binding_unbind (iter->data);
+   }
+
+   g_slist_free (list);
+}
+
+static void
+connect_bindings (GbWorkbenchActions *actions,
+                  GbWorkspace        *workspace)
+{
+   GbWorkbenchActionsPrivate *priv;
+   GActionGroup *workspace_actions;
+   GBinding *binding;
+   GAction *action;
+   GAction *workspace_action;
+   gchar **names;
+   guint i;
+
+   g_return_if_fail (GB_IS_WORKBENCH_ACTIONS (actions));
+   g_return_if_fail (GB_IS_WORKSPACE (workspace));
+
+   priv = actions->priv;
+
+   workspace_actions = gb_workspace_get_actions (workspace);
+
+   names = g_action_group_list_actions (G_ACTION_GROUP (actions));
+
+   for (i = 0; names [i]; i++) {
+      action = g_action_map_lookup_action (G_ACTION_MAP (actions),
+                                           names [i]);
+      workspace_action = g_action_map_lookup_action (G_ACTION_MAP (workspace_actions),
+                                                     names [i]);
+
+      if (workspace_action) {
+         binding = g_object_bind_property (workspace_action, "enabled",
+                                           action, "enabled",
+                                           G_BINDING_SYNC_CREATE);
+         priv->bindings = g_slist_prepend (priv->bindings, binding);
+      }
+   }
+}
+
+static void
+on_workspace_changed (GbWorkbench        *workbench,
+                      GbWorkspace        *workspace,
+                      GbWorkbenchActions *actions)
+{
+   GbWorkbenchActionsPrivate *priv;
+
+   g_return_if_fail (GB_IS_WORKBENCH_ACTIONS (actions));
+   g_return_if_fail (!workspace || GB_IS_WORKSPACE (workspace));
+   g_return_if_fail (GB_IS_WORKBENCH (workbench));
+
+   priv = actions->priv;
+
+   disconnect_bindings (actions);
+
+   if (priv->workspace) {
+      g_object_remove_weak_pointer (G_OBJECT (priv->workspace),
+                                    (gpointer *)&priv->workspace);
+   }
+
+   priv->workspace = gb_workbench_get_active_workspace (workbench);
+
+   if (priv->workspace) {
+      g_object_add_weak_pointer (G_OBJECT (priv->workspace),
+                                 (gpointer *)&priv->workspace);
+      connect_bindings (actions, priv->workspace);
+   }
+}
+
+static void
+proxy_action (GSimpleAction *action,
+              GVariant      *parameter,
+              gpointer       user_data)
+{
+   GbWorkbenchActionsPrivate *priv;
+   GbWorkbenchActions *actions = user_data;
+   GActionGroup *workspace_actions;
+   const gchar *action_name;
+   GAction *proxy;
+
+   g_assert (GB_IS_WORKBENCH_ACTIONS (actions));
+
+   priv = actions->priv;
+
+   if (priv->workspace) {
+      workspace_actions = gb_workspace_get_actions (priv->workspace);
+      action_name = g_action_get_name (G_ACTION (action));
+      proxy = g_action_map_lookup_action (G_ACTION_MAP (workspace_actions),
+                                          action_name);
+      if (proxy) {
+         g_action_activate (proxy, parameter);
+      }
+   }
+}
+
+static void
+gb_workbench_actions_set_workbench (GbWorkbenchActions *actions,
+                                    GbWorkbench        *workbench)
+{
+   g_return_if_fail (GB_IS_WORKBENCH_ACTIONS (actions));
+   g_return_if_fail (GB_IS_WORKBENCH (workbench));
+
+   g_signal_connect_object (workbench,
+                            "workspace-changed",
+                            G_CALLBACK (on_workspace_changed),
+                            actions,
+                            0);
+}
+
+static void
+gb_workbench_actions_constructed (GObject *object)
+{
+   GbWorkbenchActions *actions = (GbWorkbenchActions *)object;
+   static const GActionEntry action_entries[] = {
+      { "new-tab", proxy_action },
+      { "find", proxy_action },
+   };
+
+   g_assert (GB_IS_WORKBENCH_ACTIONS (actions));
+
+   g_action_map_add_action_entries (G_ACTION_MAP (actions),
+                                    action_entries,
+                                    G_N_ELEMENTS (action_entries),
+                                    actions);
+}
+
+static void
+gb_workbench_actions_set_property (GObject      *object,
+                                   guint         prop_id,
+                                   const GValue *value,
+                                   GParamSpec   *pspec)
+{
+   GbWorkbenchActions *actions = GB_WORKBENCH_ACTIONS (object);
+
+   switch (prop_id) {
+   case PROP_WORKBENCH:
+      gb_workbench_actions_set_workbench (actions, g_value_get_object (value));
+      break;
+   default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+   }
+}
+
+static void
+gb_workbench_actions_class_init (GbWorkbenchActionsClass *klass)
+{
+   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+   object_class->constructed = gb_workbench_actions_constructed;
+   object_class->set_property = gb_workbench_actions_set_property;
+
+   gParamSpecs [PROP_WORKBENCH] =
+      g_param_spec_object ("workbench",
+                           _("Workbench"),
+                           _("The workbench for the actions."),
+                           GB_TYPE_WORKBENCH,
+                           (G_PARAM_WRITABLE |
+                            G_PARAM_CONSTRUCT_ONLY |
+                            G_PARAM_STATIC_STRINGS));
+   g_object_class_install_property (object_class, PROP_WORKBENCH,
+                                    gParamSpecs [PROP_WORKBENCH]);
+}
+
+static void
+gb_workbench_actions_init (GbWorkbenchActions *actions)
+{
+   actions->priv = gb_workbench_actions_get_instance_private (actions);
+}
diff --git a/src/workbench/gb-workbench-actions.h b/src/workbench/gb-workbench-actions.h
new file mode 100644
index 0000000..2317972
--- /dev/null
+++ b/src/workbench/gb-workbench-actions.h
@@ -0,0 +1,58 @@
+/* gb-workbench-actions.h
+ *
+ * Copyright (C) 2014 Christian Hergert <christian hergert me>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GB_WORKBENCH_ACTIONS_H
+#define GB_WORKBENCH_ACTIONS_H
+
+#include <gtk/gtk.h>
+
+#include "gb-workbench.h"
+
+G_BEGIN_DECLS
+
+#define GB_TYPE_WORKBENCH_ACTIONS            (gb_workbench_actions_get_type())
+#define GB_WORKBENCH_ACTIONS(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_WORKBENCH_ACTIONS, 
GbWorkbenchActions))
+#define GB_WORKBENCH_ACTIONS_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_WORKBENCH_ACTIONS, 
GbWorkbenchActions const))
+#define GB_WORKBENCH_ACTIONS_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GB_TYPE_WORKBENCH_ACTIONS, 
GbWorkbenchActionsClass))
+#define GB_IS_WORKBENCH_ACTIONS(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_WORKBENCH_ACTIONS))
+#define GB_IS_WORKBENCH_ACTIONS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GB_TYPE_WORKBENCH_ACTIONS))
+#define GB_WORKBENCH_ACTIONS_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GB_TYPE_WORKBENCH_ACTIONS, 
GbWorkbenchActionsClass))
+
+typedef struct _GbWorkbenchActions        GbWorkbenchActions;
+typedef struct _GbWorkbenchActionsClass   GbWorkbenchActionsClass;
+typedef struct _GbWorkbenchActionsPrivate GbWorkbenchActionsPrivate;
+
+struct _GbWorkbenchActions
+{
+   GSimpleActionGroup parent;
+
+   /*< private >*/
+   GbWorkbenchActionsPrivate *priv;
+};
+
+struct _GbWorkbenchActionsClass
+{
+   GSimpleActionGroupClass parent_class;
+};
+
+GType               gb_workbench_actions_get_type (void) G_GNUC_CONST;
+GbWorkbenchActions *gb_workbench_actions_new      (GbWorkbench *workbench);
+
+G_END_DECLS
+
+#endif /* GB_WORKBENCH_ACTIONS_H */
diff --git a/src/workbench/gb-workbench.c b/src/workbench/gb-workbench.c
index e2662bb..accb35c 100644
--- a/src/workbench/gb-workbench.c
+++ b/src/workbench/gb-workbench.c
@@ -25,12 +25,15 @@
 #include "gb-log.h"
 #include "gb-widget.h"
 #include "gb-workbench.h"
+#include "gb-workbench-actions.h"
 #include "gedit-menu-stack-switcher.h"
 
 #define UI_RESOURCE_PATH "/org/gnome/builder/ui/gb-workbench.ui"
 
 struct _GbWorkbenchPrivate
 {
+  GbWorkbenchActions     *actions;
+
   GbWorkspace            *active_workspace;
   GbWorkspace            *devhelp;
   GbWorkspace            *editor;
@@ -61,36 +64,6 @@ G_DEFINE_TYPE_WITH_PRIVATE (GbWorkbench,
 
 static guint gSignals[LAST_SIGNAL];
 
-static void gb_workbench_action_set (GbWorkbench *workbench,
-                                     const gchar *action_name,
-                                     const gchar *first_property,
-                                     ...) G_GNUC_NULL_TERMINATED;
-
-static void
-gb_workbench_action_set (GbWorkbench *workbench,
-                         const gchar *action_name,
-                         const gchar *first_property,
-                         ...)
-{
-  GAction *action;
-  va_list args;
-
-  g_return_if_fail (GB_IS_WORKBENCH (workbench));
-  g_return_if_fail (action_name);
-  g_return_if_fail (first_property);
-
-  action = g_action_map_lookup_action (G_ACTION_MAP (workbench), action_name);
-  if (!action)
-    {
-      g_warning ("No such action: \"%s\"", action_name);
-      return;
-    }
-
-  va_start (args, first_property);
-  g_object_set_valist (G_OBJECT (action), first_property, args);
-  va_end (args);
-}
-
 GbWorkspace *
 gb_workbench_get_active_workspace (GbWorkbench *workbench)
 {
@@ -108,8 +81,6 @@ gb_workbench_workspace_changed (GbWorkbench *workbench,
                                 GbWorkspace *workspace)
 {
   GbWorkbenchPrivate *priv;
-  gboolean new_tab_enabled = FALSE;
-  gboolean find_enabled = FALSE;
 
   ENTRY;
 
@@ -128,57 +99,14 @@ gb_workbench_workspace_changed (GbWorkbench *workbench,
   if (workspace)
     {
       priv->active_workspace = workspace;
-      new_tab_enabled = !!GB_WORKSPACE_GET_CLASS (workspace)->new_tab;
-      find_enabled = !!GB_WORKSPACE_GET_CLASS (workspace)->find;
       g_object_add_weak_pointer (G_OBJECT (priv->active_workspace),
                                  (gpointer *) &priv->active_workspace);
     }
 
-  gb_workbench_action_set (workbench, "new-tab",
-                           "enabled", new_tab_enabled,
-                           NULL);
-  gb_workbench_action_set (workbench, "find",
-                           "enabled", find_enabled,
-                           NULL);
-
   EXIT;
 }
 
 static void
-gb_workbench_activate_new_tab (GSimpleAction *action,
-                               GVariant      *parameters,
-                               gpointer       user_data)
-{
-  GbWorkbench *workbench = user_data;
-  GbWorkspace *workspace;
-
-  g_return_if_fail (GB_IS_WORKBENCH (workbench));
-  g_return_if_fail (workbench->priv->active_workspace);
-
-  workspace = workbench->priv->active_workspace;
-
-  if (GB_WORKSPACE_GET_CLASS (workspace)->new_tab)
-    GB_WORKSPACE_GET_CLASS (workspace)->new_tab (workspace);
-}
-
-static void
-gb_workbench_activate_find (GSimpleAction *action,
-                            GVariant      *parameters,
-                            gpointer       user_data)
-{
-  GbWorkbench *workbench = user_data;
-  GbWorkspace *workspace;
-
-  g_return_if_fail (GB_IS_WORKBENCH (workbench));
-  g_return_if_fail (workbench->priv->active_workspace);
-
-  workspace = workbench->priv->active_workspace;
-
-  if (GB_WORKSPACE_GET_CLASS (workspace)->find)
-    GB_WORKSPACE_GET_CLASS (workspace)->find (workspace);
-}
-
-static void
 gb_workbench_stack_child_changed (GbWorkbench *workbench,
                                   GParamSpec  *pspec,
                                   GtkStack    *stack)
@@ -225,11 +153,6 @@ gb_workbench_realize (GtkWidget *widget)
   gtk_widget_grab_focus (GTK_WIDGET (workbench->priv->editor));
 }
 
-static const GActionEntry gActionEntries[] = {
-  { "new-tab", gb_workbench_activate_new_tab },
-  { "find", gb_workbench_activate_find },
-};
-
 static void
 gb_workbench_constructed (GObject *object)
 {
@@ -244,9 +167,6 @@ gb_workbench_constructed (GObject *object)
 
   priv = workbench->priv;
 
-  g_action_map_add_action_entries (G_ACTION_MAP (workbench), gActionEntries,
-                                   G_N_ELEMENTS (gActionEntries), workbench);
-
   load_actions (workbench, GB_WORKSPACE (priv->editor));
   load_actions (workbench, GB_WORKSPACE (priv->devhelp));
 
@@ -269,10 +189,18 @@ gb_workbench_constructed (GObject *object)
 }
 
 static void
-gb_workbench_finalize (GObject *object)
+gb_workbench_dispose (GObject *object)
 {
+  GbWorkbenchPrivate *priv;
+
   ENTRY;
-  G_OBJECT_CLASS (gb_workbench_parent_class)->finalize (object);
+
+  priv = GB_WORKBENCH (object)->priv;
+
+  g_clear_object (&priv->actions);
+
+  G_OBJECT_CLASS (gb_workbench_parent_class)->dispose (object);
+
   EXIT;
 }
 
@@ -309,7 +237,7 @@ gb_workbench_class_init (GbWorkbenchClass *klass)
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
   object_class->constructed = gb_workbench_constructed;
-  object_class->finalize = gb_workbench_finalize;
+  object_class->dispose = gb_workbench_dispose;
   object_class->get_property = gb_workbench_get_property;
   object_class->set_property = gb_workbench_set_property;
 
@@ -364,4 +292,9 @@ gb_workbench_init (GbWorkbench *workbench)
   workbench->priv = gb_workbench_get_instance_private (workbench);
 
   gtk_widget_init_template (GTK_WIDGET (workbench));
+
+  workbench->priv->actions = gb_workbench_actions_new (workbench);
+  gtk_widget_insert_action_group (GTK_WIDGET (workbench),
+                                  "workbench",
+                                  G_ACTION_GROUP (workbench->priv->actions));
 }
diff --git a/src/workbench/gb-workspace.h b/src/workbench/gb-workspace.h
index e3d4931..d24fd26 100644
--- a/src/workbench/gb-workspace.h
+++ b/src/workbench/gb-workspace.h
@@ -48,9 +48,6 @@ struct _GbWorkspaceClass
   GtkBinClass parent_class;
 
   GActionGroup *(*get_actions) (GbWorkspace *workspace);
-
-  void (*new_tab) (GbWorkspace *workspace);
-  void (*find)    (GbWorkspace *workspace);
 };
 
 GType         gb_workspace_get_type      (void) G_GNUC_CONST;


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