X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=atk-adaptor%2Faccessible-register.c;h=14f256f2dae29d6eb48cd05916be2da860fe3eb9;hb=08cd4311cdcfd3355fbde0c1e3389dbfd1417cee;hp=6be26c6eb6e9e8812da5d02fbe8fd30528eaa7bc;hpb=1d0cf6567d5a3037e9c3caa178eac9ae5a2933bd;p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git diff --git a/atk-adaptor/accessible-register.c b/atk-adaptor/accessible-register.c index 6be26c6..14f256f 100644 --- a/atk-adaptor/accessible-register.c +++ b/atk-adaptor/accessible-register.c @@ -121,11 +121,26 @@ spi_register_init (SpiRegister * reg) } static void +deregister_object (gpointer data, GObject * gobj) +{ + SpiRegister *reg = SPI_REGISTER (data); + + spi_register_deregister_object (reg, gobj, FALSE); +} + +static void +spi_register_remove_weak_ref (gpointer key, gpointer val, gpointer reg) +{ + g_object_weak_unref (val, deregister_object, reg); +} + +static void spi_register_finalize (GObject * object) { SpiRegister *reg = SPI_REGISTER (object); - g_free (reg->ref2ptr); + g_hash_table_foreach (reg->ref2ptr, spi_register_remove_weak_ref, reg); + g_hash_table_unref (reg->ref2ptr); G_OBJECT_CLASS (spi_register_parent_class)->finalize (object); } @@ -186,10 +201,9 @@ ref_to_path (guint ref) * Removes the AtkObject from the reference lookup tables, meaning * it is no longer exposed over D-Bus. */ -static void -deregister_object (gpointer data, GObject * gobj) +void +spi_register_deregister_object (SpiRegister *reg, GObject *gobj, gboolean unref) { - SpiRegister *reg = SPI_REGISTER (data); guint ref; ref = object_to_ref (gobj); @@ -199,6 +213,8 @@ deregister_object (gpointer data, GObject * gobj) register_signals [OBJECT_DEREGISTERED], 0, gobj); + if (unref) + g_object_weak_unref (gobj, deregister_object, reg); g_hash_table_remove (reg->ref2ptr, GINT_TO_POINTER (ref)); #ifdef SPI_ATK_DEBUG @@ -280,7 +296,7 @@ spi_register_object_to_path (SpiRegister * reg, GObject * gobj) return NULL; /* Map the root object to the root path. */ - if (gobj == spi_global_app_data->root) + if ((void *)gobj == (void *)spi_global_app_data->root) return g_strdup (spi_register_root_path); ref = object_to_ref (gobj);