summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorMatthias Clasen <maclas@gmx.de>2003-09-11 21:02:24 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2003-09-11 21:02:24 +0000
commit6f81c10a54833b4a449b1e3131689225dde85ca3 (patch)
treeefb600095f3d7746bc7a9ab081e8ff355cef18b4 /gtk
parentfdb5605164905579b8d4676158d9b065ec2ce262 (diff)
downloadgdk-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.c40
-rw-r--r--gtk/gtkuimanager.c89
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;