X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git;a=blobdiff_plain;f=atk-adaptor%2Faccessible-register.c;h=7ca416fd2aef8494006e3873e3ee2d57d6157e88;hp=83c1c6d51d60d4324e05c7e68627b1e9ce3e1bb8;hb=d1e52eb847dcabf7a2be07dbd71cfcb4e0805306;hpb=c72a4b4b0330733b2c2e0ed768d76ff85cd31500 diff --git a/atk-adaptor/accessible-register.c b/atk-adaptor/accessible-register.c index 83c1c6d..7ca416f 100644 --- a/atk-adaptor/accessible-register.c +++ b/atk-adaptor/accessible-register.c @@ -72,9 +72,6 @@ static guint register_signals[LAST_SIGNAL] = { 0 }; static void spi_register_finalize (GObject * object); -static void -spi_register_dispose (GObject * object); - /*---------------------------------------------------------------------------*/ G_DEFINE_TYPE (SpiRegister, spi_register, G_TYPE_OBJECT) @@ -86,7 +83,6 @@ static void spi_register_class_init (SpiRegisterClass * klass) spi_register_parent_class = g_type_class_ref (G_TYPE_OBJECT); object_class->finalize = spi_register_finalize; - object_class->dispose = spi_register_dispose; register_signals [OBJECT_REGISTERED] = g_signal_new ("object-registered", @@ -121,21 +117,28 @@ spi_register_init (SpiRegister * reg) } static void -spi_register_finalize (GObject * object) +deregister_object (gpointer data, GObject * gobj) { - SpiRegister *reg = SPI_REGISTER (object); + SpiRegister *reg = SPI_REGISTER (data); - g_free (reg->ref2ptr); + spi_register_deregister_object (reg, gobj, FALSE); +} - G_OBJECT_CLASS (spi_register_parent_class)->finalize (object); +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_dispose (GObject * object) +spi_register_finalize (GObject * object) { SpiRegister *reg = SPI_REGISTER (object); - G_OBJECT_CLASS (spi_register_parent_class)->dispose (object); + 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,16 +189,8 @@ 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) -{ - SpiRegister *reg = SPI_REGISTER (data); - - spi_register_deregister_object (reg, gobj); -} - void -spi_register_deregister_object (SpiRegister *reg, GObject *gobj) +spi_register_deregister_object (SpiRegister *reg, GObject *gobj, gboolean unref) { guint ref; @@ -206,6 +201,8 @@ spi_register_deregister_object (SpiRegister *reg, 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