X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=atk-adaptor%2Fadaptors%2Faccessible-adaptor.c;h=dc468505d2412ad03fa3fdc6e3fbb39c3c04ba39;hb=b3cf1376c388c7ff5cc84bca99e05833f326f919;hp=6359fa775a0db1c7e38f14257274dead5a1fe2f8;hpb=5713a8e46559b6de9fbf5fc3e073d0d482d8c7e1;p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git diff --git a/atk-adaptor/adaptors/accessible-adaptor.c b/atk-adaptor/adaptors/accessible-adaptor.c index 6359fa7..dc46850 100644 --- a/atk-adaptor/adaptors/accessible-adaptor.c +++ b/atk-adaptor/adaptors/accessible-adaptor.c @@ -28,6 +28,7 @@ #include "common/spi-dbus.h" #include "common/spi-stateset.h" #include "object.h" +#include "introspection.h" static dbus_bool_t impl_get_Name (DBusMessageIter * iter, void *user_data) @@ -76,11 +77,63 @@ impl_set_Description (DBusMessageIter * iter, void *user_data) static dbus_bool_t impl_get_Parent (DBusMessageIter * iter, void *user_data) { - AtkObject *object = (AtkObject *) user_data; + AtkObject *obj = (AtkObject *) user_data; + AtkObject *parent; + DBusMessageIter iter_variant; + dbus_uint32_t role; g_return_val_if_fail (ATK_IS_OBJECT (user_data), FALSE); - spi_object_append_v_reference (iter, atk_object_get_parent (object)); + role = spi_accessible_role_from_atk_role (atk_object_get_role (obj)); + + dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, "(so)", + &iter_variant); + + parent = atk_object_get_parent (obj); + if (parent == NULL) + { + /* TODO, move in to a 'Plug' wrapper. */ + if (ATK_IS_PLUG (obj)) + { + char *id = g_object_get_data (G_OBJECT (obj), "dbus-plug-parent"); + char *bus_parent; + char *path_parent; + + if (id) + { + bus_parent = g_strdup (id); + if (bus_parent && (path_parent = g_utf8_strchr (bus_parent + 1, -1, ':'))) + { + DBusMessageIter iter_parent; + *(path_parent++) = '\0'; + dbus_message_iter_open_container (&iter_variant, DBUS_TYPE_STRUCT, NULL, + &iter_parent); + dbus_message_iter_append_basic (&iter_parent, DBUS_TYPE_STRING, &bus_parent); + dbus_message_iter_append_basic (&iter_parent, DBUS_TYPE_OBJECT_PATH, &path_parent); + dbus_message_iter_close_container (&iter_variant, &iter_parent); + } + else + { + spi_object_append_null_reference (&iter_variant); + } + } + else + { + spi_object_append_null_reference (&iter_variant); + } + } + else if (role != Accessibility_ROLE_APPLICATION) + spi_object_append_null_reference (&iter_variant); + else + spi_object_append_desktop_reference (&iter_variant); + } + else + { + spi_object_append_reference (&iter_variant, parent); + } + + + dbus_message_iter_close_container (iter, &iter_variant); return TRUE; } @@ -413,7 +466,7 @@ static DBusMessage * impl_GetApplication (DBusConnection * bus, DBusMessage * message, void *user_data) { - AtkObject *root = atk_get_root (); + AtkObject *root = g_object_ref (atk_get_root ()); return spi_object_return_reference (message, root); } @@ -491,5 +544,6 @@ spi_initialize_accessible (DRoutePath * path) { droute_path_add_interface (path, SPI_DBUS_INTERFACE_ACCESSIBLE, + spi_org_a11y_atspi_Accessible, methods, properties); };