summaryrefslogtreecommitdiff
path: root/gtk/gtkbuilder.c
diff options
context:
space:
mode:
authorJohan Dahlin <jdahlin@async.com.br>2007-06-29 18:14:14 +0000
committerJohan Dahlin <johan@src.gnome.org>2007-06-29 18:14:14 +0000
commit571e8e1a4adb911a7127049c3607200be442c93c (patch)
tree8569f6ab5699896c59e6808f42bd318cc662a890 /gtk/gtkbuilder.c
parente8e5af2d8cf5327bed9601572978478954580977 (diff)
downloadgtk+-571e8e1a4adb911a7127049c3607200be442c93c.tar.gz
Improve reference counting, #447967
2007-06-29 Johan Dahlin <jdahlin@async.com.br> * gtk/gtkbuilder.c: (gtk_builder_finalize), (gtk_builder_get_parameters), (_gtk_builder_construct): * tests/buildertest.c: Improve reference counting, #447967 svn path=/trunk/; revision=18292
Diffstat (limited to 'gtk/gtkbuilder.c')
-rw-r--r--gtk/gtkbuilder.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/gtk/gtkbuilder.c b/gtk/gtkbuilder.c
index 213fc9c935..de4e43a3ac 100644
--- a/gtk/gtkbuilder.c
+++ b/gtk/gtkbuilder.c
@@ -33,6 +33,7 @@
#include "gtkintl.h"
#include "gtkprivate.h"
#include "gtktypebuiltins.h"
+#include "gtkwindow.h"
#include "gtkalias.h"
static void gtk_builder_class_init (GtkBuilderClass *klass);
@@ -62,7 +63,8 @@ struct _GtkBuilderPrivate
GHashTable *objects;
GHashTable *delayed_properties;
GSList *signals;
- gchar *current_toplevel;
+ gchar *current_root;
+ GSList *root_objects;
};
G_DEFINE_TYPE (GtkBuilder, gtk_builder, G_TYPE_OBJECT)
@@ -116,12 +118,14 @@ gtk_builder_finalize (GObject *object)
g_free (builder->priv->domain);
- g_free (builder->priv->current_toplevel);
+ g_free (builder->priv->current_root);
g_hash_table_destroy (builder->priv->delayed_properties);
builder->priv->delayed_properties = NULL;
g_slist_foreach (builder->priv->signals, (GFunc)_free_signal_info, NULL);
g_slist_free (builder->priv->signals);
g_hash_table_destroy (builder->priv->objects);
+ g_slist_foreach (builder->priv->root_objects, (GFunc)g_object_unref, NULL);
+ g_slist_free (builder->priv->root_objects);
}
static void
@@ -282,21 +286,21 @@ gtk_builder_get_parameters (GtkBuilder *builder,
continue;
}
g_value_init (&parameter.value, G_OBJECT_TYPE (object));
- g_value_set_object (&parameter.value, g_object_ref (object));
+ g_value_set_object (&parameter.value, object);
}
else
{
GSList *delayed_properties;
delayed_properties = g_hash_table_lookup (builder->priv->delayed_properties,
- builder->priv->current_toplevel);
+ builder->priv->current_root);
property = g_slice_new (DelayedProperty);
property->object = g_strdup (object_name);
property->name = g_strdup (prop->name);
property->value = g_strdup (prop->data);
delayed_properties = g_slist_prepend (delayed_properties, property);
g_hash_table_insert (builder->priv->delayed_properties,
- g_strdup (builder->priv->current_toplevel),
+ g_strdup (builder->priv->current_root),
delayed_properties);
continue;
}
@@ -371,6 +375,12 @@ _gtk_builder_construct (GtkBuilder *builder,
if (object_type == G_TYPE_INVALID)
g_error ("Invalid type: %s", info->class_name);
+ if (!info->parent)
+ {
+ g_free (builder->priv->current_root);
+ builder->priv->current_root = g_strdup (info->id);
+ }
+
gtk_builder_get_parameters (builder, object_type,
info->id,
info->properties,
@@ -458,10 +468,14 @@ _gtk_builder_construct (GtkBuilder *builder,
g_strdup (info->id),
g_free);
- if (!info->parent)
+
+ if (!info->parent && !GTK_IS_WINDOW (obj))
{
- g_free (builder->priv->current_toplevel);
- builder->priv->current_toplevel = g_strdup (info->id);
+ if (g_object_is_floating (obj))
+ g_object_ref_sink (obj);
+
+ builder->priv->root_objects =
+ g_slist_prepend (builder->priv->root_objects, obj);
}
g_hash_table_insert (builder->priv->objects, g_strdup (info->id), obj);