diff options
author | Matthias Clasen <maclas@gmx.de> | 2003-09-11 21:02:24 +0000 |
---|---|---|
committer | Matthias Clasen <matthiasc@src.gnome.org> | 2003-09-11 21:02:24 +0000 |
commit | 6f81c10a54833b4a449b1e3131689225dde85ca3 (patch) | |
tree | efb600095f3d7746bc7a9ab081e8ff355cef18b4 /gtk | |
parent | fdb5605164905579b8d4676158d9b065ec2ce262 (diff) | |
download | gdk-pixbuf-6f81c10a54833b4a449b1e3131689225dde85ca3.tar.gz |
Add table menu tests.
2003-09-11 Matthias Clasen <maclas@gmx.de>
* tests/testgtk.c: Add table menu tests.
* gtk/gtkmenu.c (gtk_menu_free_private): Don't forget to free the
GtkMenuPrivate struct itself. Pointed out by valgrind.
* gtk/gtkuimanager.c (gtk_ui_manager_finalize): Clean up
properly. (#121998)
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtkmenu.c | 40 | ||||
-rw-r--r-- | gtk/gtkuimanager.c | 89 |
2 files changed, 98 insertions, 31 deletions
diff --git a/gtk/gtkmenu.c b/gtk/gtkmenu.c index 0de978549..ed0b2e3a3 100644 --- a/gtk/gtkmenu.c +++ b/gtk/gtkmenu.c @@ -28,6 +28,7 @@ #include <string.h> /* memset */ #include "gdk/gdkkeysyms.h" +#include "gtkaccellabel.h" #include "gtkaccelmap.h" #include "gtkbindings.h" #include "gtklabel.h" @@ -226,6 +227,8 @@ gtk_menu_free_private (gpointer data) GtkMenuPrivate *priv = (GtkMenuPrivate *)data; g_free (priv->heights); + + g_free (priv); } GtkMenuPrivate * @@ -2303,6 +2306,41 @@ gtk_menu_button_release (GtkWidget *widget, return GTK_WIDGET_CLASS (parent_class)->button_release_event (widget, event); } +static const gchar * +get_accel_path (GtkWidget *menu_item, + gboolean *locked) +{ + const gchar *path; + GtkWidget *label; + GClosure *accel_closure; + GtkAccelGroup *accel_group; + + path = _gtk_widget_get_accel_path (menu_item, locked); + if (!path) + { + path = GTK_MENU_ITEM (menu_item)->accel_path; + + if (locked) + { + *locked = TRUE; + + label = GTK_BIN (menu_item)->child; + + if (GTK_IS_ACCEL_LABEL (label)) + { + g_object_get (label, + "accel_closure", &accel_closure, + NULL); + accel_group = gtk_accel_group_from_accel_closure (accel_closure); + + *locked = accel_group->lock_count > 0; + } + } + } + + return path; +} + static gboolean gtk_menu_key_press (GtkWidget *widget, GdkEventKey *event) @@ -2397,7 +2435,7 @@ gtk_menu_key_press (GtkWidget *widget, gboolean locked, replace_accels = TRUE; const gchar *path; - path = _gtk_widget_get_accel_path (menu_item, &locked); + path = get_accel_path (menu_item, &locked); if (!path || locked) { /* can't change accelerators on menu_items without paths diff --git a/gtk/gtkuimanager.c b/gtk/gtkuimanager.c index d03f3006e..03a978dbd 100644 --- a/gtk/gtkuimanager.c +++ b/gtk/gtkuimanager.c @@ -64,7 +64,7 @@ typedef struct _Node Node; struct _Node { NodeType type; - const gchar *name; + gchar *name; GQuark action_name; GtkAction *action; @@ -126,6 +126,7 @@ static GNode *get_node (GtkUIManager *self, const gchar *path, NodeType node_type, gboolean create); +static gboolean free_node (GNode *node); static void node_prepend_ui_reference (Node *node, guint merge_id, @@ -269,10 +270,9 @@ gtk_ui_manager_init (GtkUIManager *self) self->private_data->last_merge_id = 0; self->private_data->add_tearoffs = FALSE; - merge_id = gtk_ui_manager_new_merge_id (self); - node = get_child_node (self, NULL, "ui", 4, - NODE_TYPE_ROOT, TRUE, FALSE); + node = get_child_node (self, NULL, "ui", 2, + NODE_TYPE_ROOT, TRUE, FALSE); node_prepend_ui_reference (NODE_INFO (node), merge_id, 0); } @@ -286,6 +286,20 @@ gtk_ui_manager_finalize (GObject *object) g_source_remove (self->private_data->update_tag); self->private_data->update_tag = 0; } + + g_node_traverse (self->private_data->root_node, + G_POST_ORDER, G_TRAVERSE_ALL, -1, + (GNodeTraverseFunc)free_node, 0); + g_node_destroy (self->private_data->root_node); + self->private_data->root_node = NULL; + + g_list_foreach (self->private_data->action_groups, + (GFunc) g_object_unref, NULL); + g_list_free (self->private_data->action_groups); + self->private_data->action_groups = NULL; + + g_object_unref (self->private_data->accel_group); + self->private_data->accel_group = NULL; } static void @@ -462,7 +476,7 @@ gtk_ui_manager_remove_action_group (GtkUIManager *self, * Since: 2.4 **/ GList * -gtk_ui_manager_get_action_groups (GtkUIManager *self) +gtk_ui_manager_get_action_groups (GtkUIManager *self) { g_return_val_if_fail (GTK_IS_UI_MANAGER (self), NULL); @@ -480,7 +494,7 @@ gtk_ui_manager_get_action_groups (GtkUIManager *self) * Since: 2.4 **/ GtkAccelGroup * -gtk_ui_manager_get_accel_group (GtkUIManager *self) +gtk_ui_manager_get_accel_group (GtkUIManager *self) { g_return_val_if_fail (GTK_IS_UI_MANAGER (self), NULL); @@ -538,8 +552,8 @@ gtk_ui_manager_get_widget (GtkUIManager *self, * Since: 2.4 **/ GtkAction * -gtk_ui_manager_get_action (GtkUIManager *self, - const gchar *path) +gtk_ui_manager_get_action (GtkUIManager *self, + const gchar *path) { GNode *node; @@ -559,13 +573,13 @@ gtk_ui_manager_get_action (GtkUIManager *self, } static GNode * -get_child_node (GtkUIManager *self, - GNode *parent, - const gchar *childname, - gint childname_length, - NodeType node_type, - gboolean create, - gboolean top) +get_child_node (GtkUIManager *self, + GNode *parent, + const gchar *childname, + gint childname_length, + NodeType node_type, + gboolean create, + gboolean top) { GNode *child = NULL; @@ -644,10 +658,10 @@ get_child_node (GtkUIManager *self, } static GNode * -get_node (GtkUIManager *self, - const gchar *path, - NodeType node_type, - gboolean create) +get_node (GtkUIManager *self, + const gchar *path, + NodeType node_type, + gboolean create) { const gchar *pos, *end; GNode *parent, *node; @@ -677,9 +691,26 @@ get_node (GtkUIManager *self, if (node != NULL && NODE_INFO (node)->type == NODE_TYPE_UNDECIDED) NODE_INFO (node)->type = node_type; + return node; } +static gboolean +free_node (GNode *node) +{ + Node *info = NODE_INFO (node); + + g_list_foreach (info->uifiles, (GFunc) g_free, NULL); + g_list_free (info->uifiles); + + if (info->action) + g_object_unref (info->action); + g_free (info->name); + g_chunk_free (info, merge_node_chunk); + + return FALSE; +} + /** * gtk_ui_manager_new_merge_id: * @self: a #GtkUIManager @@ -700,9 +731,9 @@ gtk_ui_manager_new_merge_id (GtkUIManager *self) } static void -node_prepend_ui_reference (Node *node, - guint merge_id, - GQuark action_quark) +node_prepend_ui_reference (Node *node, + guint merge_id, + GQuark action_quark) { NodeUIReference *reference; @@ -717,8 +748,8 @@ node_prepend_ui_reference (Node *node, } static void -node_remove_ui_reference (Node *node, - guint merge_id) +node_remove_ui_reference (Node *node, + guint merge_id) { GList *p; @@ -1900,11 +1931,9 @@ update_node (GtkUIManager *self, { if (info->proxy) gtk_widget_destroy (info->proxy); - if ((info->type == NODE_TYPE_MENU_PLACEHOLDER || - info->type == NODE_TYPE_TOOLBAR_PLACEHOLDER) && - info->extra) + if (info->extra) gtk_widget_destroy (info->extra); - g_chunk_free (info, merge_node_chunk); + free_node (node); g_node_destroy (node); } } @@ -2056,8 +2085,8 @@ print_node (GtkUIManager *self, * * Since: 2.4 **/ -gchar* -gtk_ui_manager_get_ui (GtkUIManager *self) +gchar * +gtk_ui_manager_get_ui (GtkUIManager *self) { GString *buffer; |