*
*/
-#define SPI_ATK_PATH_PREFIX_LENGTH 34
-#define SPI_ATK_OBJECT_PATH_PREFIX "/org/freedesktop/atspi/accessible/"
+#define SPI_ATK_PATH_PREFIX_LENGTH 27
+#define SPI_ATK_OBJECT_PATH_PREFIX "/org/a11y/atspi/accessible/"
#define SPI_ATK_OBJECT_PATH_ROOT "root"
#define SPI_ATK_OBJECT_REFERENCE_TEMPLATE SPI_ATK_OBJECT_PATH_PREFIX "%d"
static void
spi_register_finalize (GObject * object);
-static void
-spi_register_dispose (GObject * object);
-
/*---------------------------------------------------------------------------*/
G_DEFINE_TYPE (SpiRegister, spi_register, G_TYPE_OBJECT)
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",
}
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);
}
/*---------------------------------------------------------------------------*/
* 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);
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
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);