X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=atk-adaptor%2Fatk-dbus.c;h=93605c1dba15712b057f7a2eac523babe5307399;hb=f346af9d38b2a69945543e38e1109ddb8131c886;hp=ac5e3c2c372874de58cb69423f7a4112c98d04ed;hpb=ff143bfb6c3ca9e1a7362bd7f9c7c5eba31eb135;p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git diff --git a/atk-adaptor/atk-dbus.c b/atk-adaptor/atk-dbus.c index ac5e3c2..93605c1 100644 --- a/atk-adaptor/atk-dbus.c +++ b/atk-adaptor/atk-dbus.c @@ -26,7 +26,46 @@ #include "accessible.h" -extern GHashTable *path2ptr; +GHashTable *path2ptr; +static guint objindex; + +static void +deregister_object (gpointer data, GObject *obj) +{ + spi_dbus_notify_remove(ATK_OBJECT(obj), NULL); + g_hash_table_remove (path2ptr, &obj); +} + +static guint +register_object (GObject * obj) +{ + gint *new_int; + + if (!path2ptr) + { + path2ptr = g_hash_table_new_full (g_int_hash, g_int_equal, g_free, NULL); + if (!path2ptr) + return ++objindex; + } + objindex++; + while (g_hash_table_lookup (path2ptr, &objindex)) + { + objindex++; + /* g_object_get_data returning 0 means no data, so handle wrap-around */ + if (objindex == 0) + objindex++; + } + new_int = (gint *)g_malloc(sizeof(gint)); + if (new_int) + { + *new_int = objindex; + g_hash_table_insert (path2ptr, new_int, obj); + } + g_object_set_data (G_OBJECT (obj), "dbus-id", (gpointer) objindex); + g_object_weak_ref(G_OBJECT(obj), deregister_object, NULL); + spi_dbus_notify_change(obj, TRUE, NULL); + return objindex; +} AtkObject * spi_dbus_get_object (const char *path) @@ -105,7 +144,7 @@ spi_dbus_initialize (DRouteData * data) spi_initialize_table (data); spi_initialize_text (data); spi_initialize_value (data); - spi_initialize_introspectable(data); + spi_initialize_introspectable(data, (DRouteGetDatumFunction) spi_dbus_get_object); } static GString *