diff options
author | Johan Dahlin <jdahlin@async.com.br> | 2007-06-29 18:14:14 +0000 |
---|---|---|
committer | Johan Dahlin <johan@src.gnome.org> | 2007-06-29 18:14:14 +0000 |
commit | 571e8e1a4adb911a7127049c3607200be442c93c (patch) | |
tree | 8569f6ab5699896c59e6808f42bd318cc662a890 /gtk/gtkbuilder.c | |
parent | e8e5af2d8cf5327bed9601572978478954580977 (diff) | |
download | gtk+-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.c | 30 |
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 (¶meter.value, G_OBJECT_TYPE (object)); - g_value_set_object (¶meter.value, g_object_ref (object)); + g_value_set_object (¶meter.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); |