]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkuimanager.c
Fix actiongroup-action interaction that relied on actions connecting to
[~andy/gtk] / gtk / gtkuimanager.c
index edf2dd8f7b8ecf972f2739311fdfd2de47cde57b..5d045300578579e27cc80eb9374e13f1775a4ef5 100644 (file)
@@ -166,8 +166,6 @@ enum
 static GObjectClass *parent_class = NULL;
 static guint ui_manager_signals[LAST_SIGNAL] = { 0 };
 
-static GMemChunk *merge_node_chunk = NULL;
-
 GType
 gtk_ui_manager_get_type (void)
 {
@@ -205,10 +203,6 @@ gtk_ui_manager_class_init (GtkUIManagerClass *klass)
 
   gobject_class = G_OBJECT_CLASS (klass);
 
-  if (!merge_node_chunk)
-    merge_node_chunk = g_mem_chunk_create (Node, 64,
-                                          G_ALLOC_AND_FREE);
-
   gobject_class->finalize = gtk_ui_manager_finalize;
   gobject_class->set_property = gtk_ui_manager_set_property;
   gobject_class->get_property = gtk_ui_manager_get_property;
@@ -761,30 +755,36 @@ gtk_ui_manager_get_widget (GtkUIManager *self,
   return GTK_UI_MANAGER_GET_CLASS (self)->get_widget (self, path);
 }
 
+typedef struct {
+  GtkUIManagerItemType types;
+  GSList *list;
+} ToplevelData;
+
 static void
 collect_toplevels (GNode   *node, 
                   gpointer user_data)
 {
-  struct {
-    GtkUIManagerItemType types;
-    GSList *list;
-  } *data = user_data;
-
-  switch (NODE_INFO (node)->type) {
-  case NODE_TYPE_MENUBAR:
-    if (data->types & GTK_UI_MANAGER_MENUBAR)
-      data->list = g_slist_prepend (data->list, NODE_INFO (node)->proxy);
-    break;
-  case NODE_TYPE_TOOLBAR:
-    if (data->types & GTK_UI_MANAGER_TOOLBAR)
-      data->list = g_slist_prepend (data->list, NODE_INFO (node)->proxy);
-    break;
-  case NODE_TYPE_POPUP:
-    if (data->types & GTK_UI_MANAGER_POPUP)
-      data->list = g_slist_prepend (data->list, NODE_INFO (node)->proxy);
-    break;
-  default: ;
-  }
+  ToplevelData *data = user_data;
+
+  if (NODE_INFO (node)->proxy)
+    {
+      switch (NODE_INFO (node)->type) 
+       {
+       case NODE_TYPE_MENUBAR:
+         if (data->types & GTK_UI_MANAGER_MENUBAR)
+       data->list = g_slist_prepend (data->list, NODE_INFO (node)->proxy);
+         break;
+       case NODE_TYPE_TOOLBAR:
+      if (data->types & GTK_UI_MANAGER_TOOLBAR)
+       data->list = g_slist_prepend (data->list, NODE_INFO (node)->proxy);
+      break;
+       case NODE_TYPE_POPUP:
+         if (data->types & GTK_UI_MANAGER_POPUP)
+           data->list = g_slist_prepend (data->list, NODE_INFO (node)->proxy);
+         break;
+       default: ;
+       }
+    }
 }
 
 /**
@@ -805,10 +805,7 @@ GSList *
 gtk_ui_manager_get_toplevels (GtkUIManager         *self,
                              GtkUIManagerItemType  types)
 {
-  struct {
-    GtkUIManagerItemType types;
-    GSList *list;
-  } data;
+  ToplevelData data;
 
   g_return_val_if_fail (GTK_IS_UI_MANAGER (self), NULL);
   g_return_val_if_fail ((~(GTK_UI_MANAGER_MENUBAR | 
@@ -893,7 +890,7 @@ get_child_node (GtkUIManager *self,
        {
          Node *mnode;
          
-         mnode = g_chunk_new0 (Node, merge_node_chunk);
+         mnode = g_slice_new0 (Node);
          mnode->type = node_type;
          mnode->name = g_strndup (childname, childname_length);
 
@@ -933,7 +930,7 @@ get_child_node (GtkUIManager *self,
        {
          Node *mnode;
 
-         mnode = g_chunk_new0 (Node, merge_node_chunk);
+         mnode = g_slice_new0 (Node);
          mnode->type = node_type;
          mnode->name = g_strndup (childname, childname_length);
          mnode->dirty = TRUE;
@@ -986,12 +983,18 @@ get_node (GtkUIManager *self,
   return node;
 }
 
+static void
+node_ui_reference_free (gpointer data)
+{
+  g_slice_free (NodeUIReference, data);
+}
+
 static gboolean
 free_node (GNode *node)
 {
   Node *info = NODE_INFO (node);
   
-  g_list_foreach (info->uifiles, (GFunc) g_free, NULL);
+  g_list_foreach (info->uifiles, (GFunc) node_ui_reference_free, NULL);
   g_list_free (info->uifiles);
 
   if (info->action)
@@ -1001,7 +1004,7 @@ free_node (GNode *node)
   if (info->extra)
     g_object_unref (info->extra);
   g_free (info->name);
-  g_chunk_free (info, merge_node_chunk);
+  g_slice_free (Node, info);
 
   return FALSE;
 }
@@ -1038,7 +1041,7 @@ node_prepend_ui_reference (GNode  *gnode,
     reference = node->uifiles->data;
   else
     {
-      reference = g_new (NodeUIReference, 1);
+      reference = g_slice_new (NodeUIReference);
       node->uifiles = g_list_prepend (node->uifiles, reference);
     }
 
@@ -1064,7 +1067,7 @@ node_remove_ui_reference (GNode  *gnode,
          if (p == node->uifiles)
            mark_node_dirty (gnode);
          node->uifiles = g_list_delete_link (node->uifiles, p);
-         g_free (reference);
+         g_slice_free (NodeUIReference, reference);
 
          break;
        }
@@ -2005,10 +2008,6 @@ enum {
   SEPARATOR_MODE_HIDDEN
 };
 
-void _gtk_action_sync_menu_visible (GtkAction *action,
-                                   GtkWidget *proxy,
-                                   gboolean   empty);
-
 static void
 update_smart_separators (GtkWidget *proxy)
 {
@@ -2025,7 +2024,6 @@ update_smart_separators (GtkWidget *proxy)
       gboolean empty;
       GList *children, *cur, *last;
       GtkWidget *filler;
-      gint i;
 
       children = gtk_container_get_children (GTK_CONTAINER (parent));
       
@@ -2034,7 +2032,6 @@ update_smart_separators (GtkWidget *proxy)
       empty = TRUE;
       filler = NULL;
 
-      i = 0;
       cur = children;
       while (cur) 
        {
@@ -2211,8 +2208,7 @@ update_node (GtkUIManager *self,
       if (info->proxy == NULL)
        {
          info->proxy = gtk_menu_bar_new ();
-         g_object_ref (info->proxy);
-         gtk_object_sink (GTK_OBJECT (info->proxy));
+         g_object_ref_sink (info->proxy);
          gtk_widget_set_name (info->proxy, info->name);
          gtk_widget_show (info->proxy);
          g_signal_emit (self, ui_manager_signals[ADD_WIDGET], 0, info->proxy);
@@ -2222,8 +2218,7 @@ update_node (GtkUIManager *self,
       if (info->proxy == NULL) 
        {
          info->proxy = gtk_menu_new ();
-         g_object_ref (info->proxy);
-         gtk_object_sink (GTK_OBJECT (info->proxy));
+         g_object_ref_sink (info->proxy);
        }
       gtk_widget_set_name (info->proxy, info->name);
       break;
@@ -2280,16 +2275,14 @@ update_node (GtkUIManager *self,
                if (NODE_INFO (node->parent)->type == NODE_TYPE_TOOLITEM)
                  {
                    info->proxy = menu;
-                   g_object_ref (info->proxy);
-                   gtk_object_sink (GTK_OBJECT (info->proxy));
+                   g_object_ref_sink (info->proxy);
                    gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (NODE_INFO (node->parent)->proxy),
                                                   menu);
                  }
                else
                  {
                    info->proxy = gtk_action_create_menu_item (action);
-                   g_object_ref (info->proxy);
-                   gtk_object_sink (GTK_OBJECT (info->proxy));
+                   g_object_ref_sink (info->proxy);
                    g_signal_connect (info->proxy, "notify::visible",
                                      G_CALLBACK (update_smart_separators), NULL);
                    gtk_widget_set_name (info->proxy, info->name);
@@ -2333,8 +2326,7 @@ update_node (GtkUIManager *self,
       if (info->proxy == NULL)
        {
          info->proxy = gtk_toolbar_new ();
-         g_object_ref (info->proxy);
-         gtk_object_sink (GTK_OBJECT (info->proxy));
+         g_object_ref_sink (info->proxy);
          gtk_widget_set_name (info->proxy, info->name);
          gtk_widget_show (info->proxy);
          g_signal_emit (self, ui_manager_signals[ADD_WIDGET], 0, info->proxy);
@@ -2368,8 +2360,7 @@ update_node (GtkUIManager *self,
          if (find_menu_position (node, &menushell, &pos))
            {
              info->proxy = gtk_separator_menu_item_new ();
-             g_object_ref (info->proxy);
-             gtk_object_sink (GTK_OBJECT (info->proxy));
+             g_object_ref_sink (info->proxy);
              g_object_set_data (G_OBJECT (info->proxy),
                                 I_("gtk-separator-mode"),
                                 GINT_TO_POINTER (SEPARATOR_MODE_HIDDEN));
@@ -2378,8 +2369,7 @@ update_node (GtkUIManager *self,
                                     NODE_INFO (node)->proxy, pos);
              
              info->extra = gtk_separator_menu_item_new ();
-             g_object_ref (info->extra);
-             gtk_object_sink (GTK_OBJECT (info->extra));
+             g_object_ref_sink (info->extra);
              g_object_set_data (G_OBJECT (info->extra),
                                 I_("gtk-separator-mode"),
                                 GINT_TO_POINTER (SEPARATOR_MODE_HIDDEN));
@@ -2421,8 +2411,7 @@ update_node (GtkUIManager *self,
              item = gtk_separator_tool_item_new ();
              gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, pos);
              info->proxy = GTK_WIDGET (item);
-             g_object_ref (info->proxy);
-             gtk_object_sink (GTK_OBJECT (info->proxy));
+             g_object_ref_sink (info->proxy);
              g_object_set_data (G_OBJECT (info->proxy),
                                 I_("gtk-separator-mode"),
                                 GINT_TO_POINTER (SEPARATOR_MODE_HIDDEN));
@@ -2431,8 +2420,7 @@ update_node (GtkUIManager *self,
              item = gtk_separator_tool_item_new ();
              gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, pos+1);
              info->extra = GTK_WIDGET (item);
-             g_object_ref (info->extra);
-             gtk_object_sink (GTK_OBJECT (info->extra));
+             g_object_ref_sink (info->extra);
              g_object_set_data (G_OBJECT (info->extra),
                                 I_("gtk-separator-mode"),
                                 GINT_TO_POINTER (SEPARATOR_MODE_HIDDEN));
@@ -2463,8 +2451,7 @@ update_node (GtkUIManager *self,
          if (find_menu_position (node, &menushell, &pos))
            {
              info->proxy = gtk_action_create_menu_item (action);
-             g_object_ref (info->proxy);
-             gtk_object_sink (GTK_OBJECT (info->proxy));
+             g_object_ref_sink (info->proxy);
              gtk_widget_set_name (info->proxy, info->name);
              
              gtk_menu_shell_insert (GTK_MENU_SHELL (menushell),
@@ -2514,8 +2501,7 @@ update_node (GtkUIManager *self,
          if (find_toolbar_position (node, &toolbar, &pos))
            {
              info->proxy = gtk_action_create_tool_item (action);
-             g_object_ref (info->proxy);
-             gtk_object_sink (GTK_OBJECT (info->proxy));
+             g_object_ref_sink (info->proxy);
              gtk_widget_set_name (info->proxy, info->name);
              
              gtk_toolbar_insert (GTK_TOOLBAR (toolbar),
@@ -2560,8 +2546,7 @@ update_node (GtkUIManager *self,
              GtkToolItem *item = gtk_separator_tool_item_new ();
              gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, pos);
              info->proxy = GTK_WIDGET (item);
-             g_object_ref (info->proxy);
-             gtk_object_sink (GTK_OBJECT (info->proxy));
+             g_object_ref_sink (info->proxy);
              gtk_widget_set_no_show_all (info->proxy, TRUE);
              if (info->expand)
                {
@@ -2595,8 +2580,7 @@ update_node (GtkUIManager *self,
          if (find_menu_position (node, &menushell, &pos))
            {
              info->proxy = gtk_separator_menu_item_new ();
-             g_object_ref (info->proxy);
-             gtk_object_sink (GTK_OBJECT (info->proxy));
+             g_object_ref_sink (info->proxy);
              gtk_widget_set_no_show_all (info->proxy, TRUE);
              g_object_set_data (G_OBJECT (info->proxy),
                                 I_("gtk-separator-mode"),