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)
{
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;
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: ;
+ }
+ }
}
/**
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 |
{
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);
{
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;
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)
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;
}
reference = node->uifiles->data;
else
{
- reference = g_new (NodeUIReference, 1);
+ reference = g_slice_new (NodeUIReference);
node->uifiles = g_list_prepend (node->uifiles, reference);
}
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;
}
SEPARATOR_MODE_HIDDEN
};
-void _gtk_action_sync_menu_visible (GtkAction *action,
- GtkWidget *proxy,
- gboolean empty);
-
static void
update_smart_separators (GtkWidget *proxy)
{
gboolean empty;
GList *children, *cur, *last;
GtkWidget *filler;
- gint i;
children = gtk_container_get_children (GTK_CONTAINER (parent));
empty = TRUE;
filler = NULL;
- i = 0;
cur = children;
while (cur)
{
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);
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;
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);
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);
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));
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));
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));
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));
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),
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),
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)
{
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"),