summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPadraig O'Briain <padraig.obriain@sun.com>2003-11-03 14:38:23 +0000
committerPadraig O'Briain <padraigo@src.gnome.org>2003-11-03 14:38:23 +0000
commit4459bc29f32ecbcddbde5d282f8e14d1fea4e863 (patch)
treef76ab7a3a431acb92ba12704f5679878c51d4f2a
parent2e06ea9c9cbbf0d873a684f6ee3827c7ae058bc2 (diff)
downloadatk-4459bc29f32ecbcddbde5d282f8e14d1fea4e863.tar.gz
Use weak references for objects in a relation instead of object references
2003-11-03 Padraig O'Briain <padraig.obriain@sun.com> * atk/atkrelation.c: Use weak references for objects in a relation instead of object references so that objects are not leaked when corresponding widgets are destroyed. This fixes bug #125725.
-rw-r--r--ChangeLog10
-rwxr-xr-xatk/atkrelation.c22
2 files changed, 26 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 693c8f5..04a90fb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,8 +1,16 @@
+2003-11-03 Padraig O'Briain <padraig.obriain@sun.com>
+
+ * atk/atkrelation.c: Use weak references for objects in a relation
+ instead of object references so that objects are not leaked when
+ corresponding widgets are destroyed.
+
+ This fixes bug #125725.
+
2003-10-31 Padraig O'Briain <padraig.obriain@sun.com>
* configure.in: Add reference to docs/version.xml
- Shopuld have been done in previous commit but was omitted.
+ Should have been done in previous commit but was omitted.
Fixes build break reported in bugs #1258548 and #125902.
2003-10-29 Padraig O'Briain <padraig.obriain@sun.com>
diff --git a/atk/atkrelation.c b/atk/atkrelation.c
index 544804b..8c8cda2 100755
--- a/atk/atkrelation.c
+++ b/atk/atkrelation.c
@@ -246,6 +246,7 @@ atk_relation_new (AtkObject **targets,
g_value_init (value, ATK_TYPE_OBJECT);
g_value_set_object (value, targets[i]);
array = g_value_array_append (array, value);
+ g_value_unset (value);
g_free (value);
}
@@ -292,6 +293,18 @@ atk_relation_get_target (AtkRelation *relation)
}
static void
+delete_object_while_in_relation (gpointer callback_data,
+ GObject *where_the_object_was)
+{
+ GPtrArray *array;
+
+ g_assert (callback_data != NULL);
+
+ array = callback_data;
+ g_ptr_array_remove (array, where_the_object_was);
+}
+
+static void
atk_relation_finalize (GObject *object)
{
AtkRelation *relation;
@@ -306,10 +319,9 @@ atk_relation_finalize (GObject *object)
for (i = 0; i < relation->target->len; i++)
{
- /*
- * Remove a reference to AtkObject being removed from a relation
- */
- g_object_unref (g_ptr_array_index (relation->target, i));
+ g_object_weak_unref (G_OBJECT (g_ptr_array_index (relation->target, i)),
+ (GWeakNotify) delete_object_while_in_relation,
+ relation->target);
}
g_ptr_array_free (relation->target, TRUE);
}
@@ -381,8 +393,8 @@ atk_relation_get_ptr_array_from_value_array (GValueArray *array)
{
value = g_value_array_get_nth (array, i);
obj = g_value_get_object (value);
- g_object_ref (obj);
g_ptr_array_add (return_array, obj);
+ g_object_weak_ref (obj, (GWeakNotify) delete_object_while_in_relation, return_array);
}
return return_array;