Fix accessibility of root apps on Linux
[platform/core/uifw/at-spi2-atk.git] / atk-adaptor / adaptors / accessible-adaptor.c
index b40c5f9..d0d77e7 100644 (file)
@@ -141,12 +141,14 @@ static dbus_bool_t
 impl_get_ChildCount (DBusMessageIter * iter, void *user_data)
 {
   AtkObject *object = (AtkObject *) user_data;
+  int childCount;
 
   g_return_val_if_fail (ATK_IS_OBJECT (user_data), FALSE);
 
-  return droute_return_v_int32 (iter,
-                                atk_object_get_n_accessible_children
-                                (object));
+  childCount = (ATK_IS_SOCKET (object) && atk_socket_is_occupied (ATK_SOCKET (object)))
+               ? 1
+               : atk_object_get_n_accessible_children (object);
+  return droute_return_v_int32 (iter, childCount);
 }
 
 static DBusMessage *
@@ -154,6 +156,7 @@ impl_GetChildAtIndex (DBusConnection * bus,
                       DBusMessage * message, void *user_data)
 {
   AtkObject *object = (AtkObject *) user_data;
+  DBusMessage *reply;
   DBusError error;
   dbus_int32_t i;
   AtkObject *child;
@@ -166,8 +169,35 @@ impl_GetChildAtIndex (DBusConnection * bus,
     {
       return droute_invalid_arguments_error (message);
     }
+
+  if (ATK_IS_SOCKET (object) && atk_socket_is_occupied (ATK_SOCKET (object)) && i == 0)
+    {
+      AtkSocket *socket = ATK_SOCKET (object);
+      gchar *child_name, *child_path;
+      child_name = g_strdup (socket->embedded_plug_id);
+      child_path = g_utf8_strchr (child_name + 1, -1, ':');
+      if (child_path)
+        {
+          DBusMessageIter iter, iter_socket;
+          *(child_path++) = '\0';
+          reply = dbus_message_new_method_return (message);
+          if (!reply)
+            return NULL;
+          dbus_message_iter_init_append (reply, &iter);
+          dbus_message_iter_open_container (&iter, DBUS_TYPE_STRUCT, NULL,
+                                            &iter_socket);
+          dbus_message_iter_append_basic (&iter_socket, DBUS_TYPE_STRING, &child_name);
+          dbus_message_iter_append_basic (&iter_socket, DBUS_TYPE_OBJECT_PATH, &child_path);
+          dbus_message_iter_close_container (&iter, &iter_socket);
+          return reply;
+        }
+      g_free (child_name);
+    }
   child = atk_object_ref_accessible_child (object, i);
-  return spi_object_return_reference (message, child);
+  reply = spi_object_return_reference (message, child);
+  g_object_unref (child);
+
+  return reply;
 }
 
 static DBusMessage *
@@ -468,8 +498,7 @@ static DBusMessage *
 impl_GetApplication (DBusConnection * bus,
                      DBusMessage * message, void *user_data)
 {
-  AtkObject *root = g_object_ref (atk_get_root ());
-  return spi_object_return_reference (message, root);
+  return spi_object_return_reference (message, atk_get_root ());
 }
 
 static DBusMessage *
@@ -477,8 +506,6 @@ impl_GetInterfaces (DBusConnection * bus,
                     DBusMessage * message, void *user_data)
 {
   AtkObject *object = (AtkObject *) user_data;
-  gint role;
-  const char *role_name;
   DBusMessage *reply;
   DBusMessageIter iter, iter_array;