Add navigation helper functions for screen-reader and friends
[platform/upstream/at-spi2-core.git] / atspi / atspi-accessible.c
index 9461ece..a579254 100644 (file)
  */
 
 #include "atspi-private.h"
+#include "atspi-accessible-private.h"
 #include <string.h>
 
+static gboolean enable_caching = FALSE;
+static guint quark_locale;
+
 static void
 atspi_action_interface_init (AtspiAction *action)
 {
@@ -71,6 +75,11 @@ atspi_table_interface_init (AtspiTable *table)
 }
 
 static void
+atspi_table_cell_interface_init (AtspiTableCell *cell)
+{
+}
+
+static void
 atspi_text_interface_init (AtspiText *text)
 {
 }
@@ -81,6 +90,7 @@ atspi_value_interface_init (AtspiValue *value)
 }
 
 G_DEFINE_TYPE_WITH_CODE (AtspiAccessible, atspi_accessible, ATSPI_TYPE_OBJECT,
+                         G_ADD_PRIVATE (AtspiAccessible)
                          G_IMPLEMENT_INTERFACE (ATSPI_TYPE_ACTION, atspi_action_interface_init)
                          G_IMPLEMENT_INTERFACE (ATSPI_TYPE_COLLECTION, atspi_collection_interface_init)
                          G_IMPLEMENT_INTERFACE (ATSPI_TYPE_COMPONENT, atspi_component_interface_init)
@@ -90,6 +100,7 @@ G_DEFINE_TYPE_WITH_CODE (AtspiAccessible, atspi_accessible, ATSPI_TYPE_OBJECT,
                          G_IMPLEMENT_INTERFACE (ATSPI_TYPE_IMAGE, atspi_image_interface_init)
                          G_IMPLEMENT_INTERFACE (ATSPI_TYPE_SELECTION, atspi_selection_interface_init)
                          G_IMPLEMENT_INTERFACE (ATSPI_TYPE_TABLE, atspi_table_interface_init)
+                         G_IMPLEMENT_INTERFACE (ATSPI_TYPE_TABLE_CELL, atspi_table_cell_interface_init)
                          G_IMPLEMENT_INTERFACE (ATSPI_TYPE_TEXT, atspi_text_interface_init)
                          G_IMPLEMENT_INTERFACE (ATSPI_TYPE_VALUE, atspi_value_interface_init))
 
@@ -102,8 +113,11 @@ atspi_accessible_init (AtspiAccessible *accessible)
 {
 #ifdef DEBUG_REF_COUNTS
   accessible_count++;
-  printf("at-spi: init: %d objects\n", accessible_count);
+  g_hash_table_insert (_atspi_get_live_refs (), accessible, NULL);
+  g_print("at-spi: init: %d objects\n", accessible_count);
 #endif
+
+  accessible->priv = atspi_accessible_get_instance_private (accessible);
 }
 
 static void
@@ -112,10 +126,12 @@ atspi_accessible_dispose (GObject *object)
   AtspiAccessible *accessible = ATSPI_ACCESSIBLE (object);
   AtspiEvent e;
   AtspiAccessible *parent;
+  GList *children;
+  GList *l;
 
   /* TODO: Only fire if object not already marked defunct */
   memset (&e, 0, sizeof (e));
-  e.type = "object:state-change:defunct";
+  e.type = "object:state-changed:defunct";
   e.source = accessible;
   e.detail1 = 1;
   e.detail2 = 0;
@@ -147,6 +163,20 @@ atspi_accessible_dispose (GObject *object)
     accessible->accessible_parent = NULL;
   }
 
+  children = accessible->children;
+  accessible->children = NULL;
+  for (l = children; l; l = l->next)
+  {
+    AtspiAccessible *child = l->data;
+    if (child && child->accessible_parent == accessible)
+    {
+      g_object_unref (accessible);
+      child->accessible_parent = NULL;
+    }
+    g_object_unref (child);
+  }
+  g_list_free (children);
+
   G_OBJECT_CLASS (atspi_accessible_parent_class) ->dispose (object);
 }
 
@@ -160,8 +190,12 @@ atspi_accessible_finalize (GObject *object)
   if (accessible->attributes)
     g_hash_table_unref (accessible->attributes);
 
+    if (accessible->priv->cache)
+      g_hash_table_destroy (accessible->priv->cache);
+
 #ifdef DEBUG_REF_COUNTS
   accessible_count--;
+  g_hash_table_remove (_atspi_get_live_refs (), accessible);
   g_print ("at-spi: finalize: %d objects\n", accessible_count);
 #endif
 
@@ -176,17 +210,18 @@ atspi_accessible_class_init (AtspiAccessibleClass *klass)
 
   object_class->dispose = atspi_accessible_dispose;
   object_class->finalize = atspi_accessible_finalize;
-}
 
+  quark_locale = g_quark_from_string ("accessible-locale");
+}
 
 /**
  * atspi_accessible_get_name:
  * @obj: a pointer to the #AtspiAccessible object on which to operate.
  *
- * Get the name of an #AtspiAccessible object.
+ * Gets the name of an #AtspiAccessible object.
  *
- * Returns: a UTF-8 string indicating the name of the #AtspiAccessible object.
- * or NULL on exception
+ * Returns: a UTF-8 string indicating the name of the #AtspiAccessible object
+ * or NULL on exception.
  **/
 gchar *
 atspi_accessible_get_name (AtspiAccessible *obj, GError **error)
@@ -202,14 +237,131 @@ atspi_accessible_get_name (AtspiAccessible *obj, GError **error)
   return g_strdup (obj->name);
 }
 
+
+/**
+ * atspi_accessible_get_unique_id:
+ * @obj: a pointer to the #AtspiAccessible object on which to operate.
+ *
+ * Gets the identificator, uniquely identifying object, or NULL if an error occured.
+ *
+ * Returns: a UTF-8 string describing the #AtspiAccessible object
+ * or NULL on exception or NULL object passed.
+ **/
+gchar *
+atspi_accessible_get_unique_id(AtspiAccessible *obj, GError **error)
+{
+  if (!obj) {
+    g_set_error(error, ATSPI_ERROR, ATSPI_ERROR_IPC, "argument is null");
+    return NULL;
+  }
+
+  gchar *id = NULL;
+  gchar *bus_name = atspi_accessible_get_bus_name(obj, error);
+  if (bus_name && bus_name[0]) {
+    gchar *path = atspi_accessible_get_path(obj, error);
+    if (path && path[0])
+      id = g_strdup_printf("%s:%s", bus_name, path);
+         else
+      g_set_error(error, ATSPI_ERROR, ATSPI_ERROR_IPC, "failed to get path");
+    g_free(path);
+  }
+  else
+    g_set_error(error, ATSPI_ERROR, ATSPI_ERROR_IPC, "failed to get bus name");
+  g_free(bus_name);
+  return id;
+}
+
+/**
+ * atspi_accessible_get_bus_name:
+ * @obj: a pointer to the #AtspiAccessible object on which to operate.
+ *
+ * Gets the bus name, where object belongs.
+ *
+ * Returns: a UTF-8 string describing the #AtspiAccessible object's
+ * bus name or empty string on exception or NULL object passed.
+ **/
+gchar *
+atspi_accessible_get_bus_name(AtspiAccessible *obj, GError **error)
+{
+  if (!obj || !obj->parent.app)
+    return g_strdup("");
+  return g_strdup (obj->parent.app->bus_name);
+}
+
+/**
+ * atspi_accessible_get_path:
+ * @obj: a pointer to the #AtspiAccessible object on which to operate.
+ *
+ * Gets the path, uniquely identifying object over its bus name.
+ *
+ * Returns: a UTF-8 string describing the #AtspiAccessible object
+ * or empty string on exception or NULL object passed.
+ **/
+gchar *
+atspi_accessible_get_path(AtspiAccessible *obj, GError **error)
+{
+  static const char *prefix = "/org/a11y/atspi/accessible/";
+  static int prefix_len = 27;
+
+  if (!obj)
+    return g_strdup("");
+  AtspiObject *o = ATSPI_OBJECT (obj);
+  if (!o)
+    return g_strdup("");
+  if (strncmp(o->path, prefix, prefix_len) == 0)
+    return g_strdup(o->path + prefix_len);
+  return g_strdup (o->path);
+}
+
+/**
+ * atspi_accessible_get_navigable_at_point:
+ * @root: a pointer to the #AtspiAccessible to start search from.
+ * @x: a #gint specifying the x coordinate of the point in question.
+ * @y: a #gint specifying the y coordinate of the point in question.
+ * @ctype: the coordinate system of the point (@x, @y)
+ *         (e.g. ATSPI_COORD_TYPE_WINDOW, ATSPI_COORD_TYPE_SCREEN).
+ *
+ * Finds the accessible element closest to user (highest in z-order), at a given coordinate within an #AtspiAccessible.
+ * This should be the element, that should be picked, when doing mouse click or finger tap at given coordinates.
+ *
+ * Returns: (nullable) (transfer full): a pointer to an
+ *          #AtspiAccessible descendant (of any depth) of the specified component which
+ *          contains the point (@x, @y), or NULL if no descendant contains
+ *          the point.
+ **/
+AtspiAccessible *
+atspi_accessible_get_navigable_at_point (AtspiAccessible *root,
+                                          gint x,
+                                          gint y,
+                                          AtspiCoordType ctype, GError **error)
+{
+  dbus_int32_t d_x = x, d_y = y;
+  dbus_uint32_t d_ctype = ctype;
+  DBusMessage *reply;
+  AtspiAccessible *return_value = NULL;
+  unsigned char recurse = 0;
+
+  g_return_val_if_fail (root != NULL, FALSE);
+  do {
+    reply = _atspi_dbus_call_partial (root, atspi_interface_accessible, "GetNavigableAtPoint", error, "iiu", d_x, d_y, d_ctype);
+
+    AtspiAccessible *tmp = _atspi_dbus_return_accessible_and_recurse_info_from_message (reply, &recurse);
+    if (!tmp) break;
+    if (return_value)
+      g_object_unref(return_value);
+    return_value = root = tmp;
+  } while(recurse);
+  return return_value;
+}
+
 /**
  * atspi_accessible_get_description:
  * @obj: a pointer to the #AtspiAccessible object on which to operate.
  *
- * Get the description of an #AtspiAccessible object.
+ * Gets the description of an #AtspiAccessible object.
  *
- * Returns: a UTF-8 string describing the #AtspiAccessible object.
- * or NULL on exception
+ * Returns: a UTF-8 string describing the #AtspiAccessible object
+ * or NULL on exception.
  **/
 gchar *
 atspi_accessible_get_description (AtspiAccessible *obj, GError **error)
@@ -233,11 +385,12 @@ const char *str_parent = "Parent";
  * atspi_accessible_get_parent:
  * @obj: a pointer to the #AtspiAccessible object to query.
  *
- * Get an #AtspiAccessible object's parent container.
+ * Gets an #AtspiAccessible object's parent container.
  *
- * Returns: (transfer full): a pointer to the #AtspiAccessible object which
- *          contains the given #AtspiAccessible instance, or NULL if the @obj
- *          has no parent container.
+ * Returns: (nullable) (transfer full): a pointer to the
+ *          #AtspiAccessible object which contains the given
+ *          #AtspiAccessible instance, or NULL if the @obj has no
+ *          parent container.
  *
  **/
 AtspiAccessible *
@@ -281,10 +434,10 @@ atspi_accessible_get_parent (AtspiAccessible *obj, GError **error)
  * atspi_accessible_get_child_count:
  * @obj: a pointer to the #AtspiAccessible object on which to operate.
  *
- * Get the number of children contained by an #AtspiAccessible object.
+ * Gets the number of children contained by an #AtspiAccessible object.
  *
  * Returns: a #long indicating the number of #AtspiAccessible children
- *          contained by an #AtspiAccessible object. or -1 on exception
+ *          contained by an #AtspiAccessible object or -1 on exception.
  *
  **/
 gint
@@ -309,10 +462,10 @@ atspi_accessible_get_child_count (AtspiAccessible *obj, GError **error)
  * @obj: a pointer to the #AtspiAccessible object on which to operate.
  * @child_index: a #long indicating which child is specified.
  *
- * Get the #AtspiAccessible child of an #AtspiAccessible object at a given index.
+ * Gets the #AtspiAccessible child of an #AtspiAccessible object at a given index.
  *
  * Returns: (transfer full): a pointer to the #AtspiAccessible child object at
- * index @child_index. or NULL on exception
+ * index @child_index or NULL on exception.
  **/
 AtspiAccessible *
 atspi_accessible_get_child_at_index (AtspiAccessible *obj,
@@ -339,13 +492,14 @@ atspi_accessible_get_child_at_index (AtspiAccessible *obj,
 }
 
 /**
- * atspi_accessible_get_index_in_parent
+ * atspi_accessible_get_index_in_parent:
  * @obj: a pointer to the #AtspiAccessible object on which to operate.
  *
- * Get the index of an #AtspiAccessible object in its containing #AtspiAccessible.
+ * Gets the index of an #AtspiAccessible object within its parent's
+ * #AtspiAccessible children list.
  *
  * Returns: a #glong indicating the index of the #AtspiAccessible object
- *          in its parent (i.e. containing) #AtspiAccessible instance,
+ *          in its parent,
  *          or -1 if @obj has no containing parent or on exception.
  **/
 gint
@@ -355,13 +509,16 @@ atspi_accessible_get_index_in_parent (AtspiAccessible *obj, GError **error)
   gint i = 0;
 
   g_return_val_if_fail (obj != NULL, -1);
-  if (!obj->accessible_parent) return -1;
-  if (!_atspi_accessible_test_cache (obj->accessible_parent,
+  if (_atspi_accessible_test_cache (obj, ATSPI_CACHE_PARENT) &&
+      !obj->accessible_parent)
+    return -1;
+  if (!obj->accessible_parent ||
+      !_atspi_accessible_test_cache (obj->accessible_parent,
                                      ATSPI_CACHE_CHILDREN))
   {
-    dbus_uint32_t ret = -1;
+    dbus_int32_t ret = -1;
     _atspi_dbus_call (obj, atspi_interface_accessible,
-                      "GetIndexInParent", NULL, "=>u", &ret);
+                      "GetIndexInParent", NULL, "=>i", &ret);
     return ret;
   }
 
@@ -385,11 +542,11 @@ typedef struct
  * atspi_accessible_get_relation_set:
  * @obj: a pointer to the #AtspiAccessible object on which to operate.
  *
- * Get the set of #AtspiRelation objects which describe this #AtspiAccessible object's
- *       relationships with other #AtspiAccessible objects.
+ * Gets the set of #AtspiRelation objects which describes this #AtspiAccessible object's
+ * relationships with other #AtspiAccessible objects.
  *
- * Returns: (element-type AtspiAccessible*) (transfer full): an array of
- *          #AtspiAccessibleRelation pointers. or NULL on exception
+ * Returns: (element-type AtspiRelation*) (transfer full): a #GArray of
+ *          #AtspiRelation pointers or NULL on exception.
  **/
 GArray *
 atspi_accessible_get_relation_set (AtspiAccessible *obj, GError **error)
@@ -423,10 +580,10 @@ atspi_accessible_get_relation_set (AtspiAccessible *obj, GError **error)
  * atspi_accessible_get_role:
  * @obj: a pointer to the #AtspiAccessible object on which to operate.
  *
- * Get the UI role of an #AtspiAccessible object.
- * A UTF-8 string describing this role can be obtained via atspi_accessible_getRoleName ().
+ * Gets the UI role played by an #AtspiAccessible object.
+ * This role's name can be obtained via atspi_accessible_get_role_name ().
  *
- * Returns: the #AtspiRole of the object.
+ * Returns: the #AtspiRole of an #AtspiAccessible object.
  *
  **/
 AtspiRole
@@ -451,37 +608,26 @@ atspi_accessible_get_role (AtspiAccessible *obj, GError **error)
  * atspi_accessible_get_role_name:
  * @obj: a pointer to the #AtspiAccessible object on which to operate.
  *
- * Get a UTF-8 string describing the role this object plays in the UI.
+ * Gets a UTF-8 string corresponding to the name of the role played by an object.
  * This method will return useful values for roles that fall outside the
- * enumeration used in atspi_accessible_getRole ().
+ * enumeration used in atspi_accessible_get_role ().
  *
- * Returns: a UTF-8 string specifying the role of this #AtspiAccessible object.
+ * Returns: a UTF-8 string specifying the type of UI role played by an
+ * #AtspiAccessible object.
  *
  **/
 gchar *
 atspi_accessible_get_role_name (AtspiAccessible *obj, GError **error)
 {
-  AtspiRole role = atspi_accessible_get_role (obj, error);
-  char *retval = NULL;
-  GTypeClass *type_class;
-  GEnumValue *value;
-  const gchar *name = NULL;
-
-  type_class = g_type_class_ref (ATSPI_TYPE_ROLE);
-  g_return_val_if_fail (G_IS_ENUM_CLASS (type_class), NULL);
-
-  value = g_enum_get_value (G_ENUM_CLASS (type_class), role);
-
-  if (value)
-    {
-      retval = value->value_nick;
-    }
-
-  if (retval)
-    return g_strdup (retval);
+  gchar *retval = NULL;
+  AtspiRole role;
 
   g_return_val_if_fail (obj != NULL, NULL);
 
+  role = atspi_accessible_get_role (obj, error);
+  if (role >= 0 && role < ATSPI_ROLE_COUNT && role != ATSPI_ROLE_EXTENDED)
+    return atspi_role_get_name (role);
+
   _atspi_dbus_call (obj, atspi_interface_accessible, "GetRoleName", error, "=>s", &retval);
 
   if (!retval)
@@ -494,11 +640,13 @@ atspi_accessible_get_role_name (AtspiAccessible *obj, GError **error)
  * atspi_accessible_get_localized_role_name:
  * @obj: a pointer to the #AtspiAccessible object on which to operate.
  *
- * Get a UTF-8 string describing the (localized) role this object plays in the UI.
+ * Gets a UTF-8 string corresponding to the name of the role played by an
+ * object, translated to the current locale.
  * This method will return useful values for roles that fall outside the
  * enumeration used in atspi_accessible_getRole ().
  *
- * Returns: a UTF-8 string specifying the role of this #AtspiAccessible object.
+ * Returns: a localized, UTF-8 string specifying the type of UI role played
+ * by an #AtspiAccessible object.
  *
  **/
 gchar *
@@ -528,18 +676,18 @@ defunct_set ()
  * atspi_accessible_get_state_set:
  * @obj: a pointer to the #AtspiAccessible object on which to operate.
  *
- * Gets the current state of an object.
+ * Gets the states currently held by an object.
  *
- * Returns: (transfer full): a pointer to an #AtspiStateSet representing the
- *          object's current state.
+ * Returns: (transfer full): a pointer to an #AtspiStateSet representing an
+ * object's current state set.
  **/
 AtspiStateSet *
 atspi_accessible_get_state_set (AtspiAccessible *obj)
 {
+  /* TODO: Should take a GError **, but would be an API break */
   if (!obj->parent.app || !obj->parent.app->bus)
     return defunct_set ();
 
-
   if (!_atspi_accessible_test_cache (obj, ATSPI_CACHE_STATES))
   {
     DBusMessage *reply;
@@ -552,7 +700,6 @@ atspi_accessible_get_state_set (AtspiAccessible *obj)
     dbus_message_unref (reply);
     _atspi_accessible_add_cache (obj, ATSPI_CACHE_STATES);
   }
-
   return g_object_ref (obj->states);
 }
 
@@ -560,13 +707,13 @@ atspi_accessible_get_state_set (AtspiAccessible *obj)
  * atspi_accessible_get_attributes:
  * @obj: The #AtspiAccessible being queried.
  *
- * Get the #AttributeSet representing any assigned 
+ * Gets the #AttributeSet representing any assigned
  * name-value pair attributes or annotations for this object.
  * For typographic, textual, or textually-semantic attributes, see
  * atspi_text_get_attributes instead.
  *
  * Returns: (element-type gchar* gchar*) (transfer full): The name-value-pair
- *          attributes assigned to this object.
+ * attributes assigned to this object.
  */
 GHashTable *
 atspi_accessible_get_attributes (AtspiAccessible *obj, GError **error)
@@ -575,6 +722,13 @@ atspi_accessible_get_attributes (AtspiAccessible *obj, GError **error)
 
     g_return_val_if_fail (obj != NULL, NULL);
 
+  if (obj->priv->cache)
+  {
+    GValue *val = g_hash_table_lookup (obj->priv->cache, "Attributes");
+    if (val)
+      return g_value_dup_boxed (val);
+  }
+
   if (!_atspi_accessible_test_cache (obj, ATSPI_CACHE_ATTRIBUTES))
   {
     message = _atspi_dbus_call_partial (obj, atspi_interface_accessible,
@@ -600,7 +754,7 @@ add_to_attribute_array (gpointer key, gpointer value, gpointer data)
  * atspi_accessible_get_attributes_as_array:
  * @obj: The #AtspiAccessible being queried.
  *
- * Get the #AttributeSet representing any assigned 
+ * Gets a #GArray representing any assigned
  * name-value pair attributes or annotations for this object.
  * For typographic, textual, or textually-semantic attributes, see
  * atspi_text_get_attributes_as_array instead.
@@ -615,15 +769,16 @@ atspi_accessible_get_attributes_as_array (AtspiAccessible *obj, GError **error)
 
     g_return_val_if_fail (obj != NULL, NULL);
 
-  if (_atspi_accessible_get_cache_mask (obj) & ATSPI_CACHE_ATTRIBUTES)
+  if (obj->priv->cache)
   {
-    GArray *array = g_array_new (TRUE, TRUE, sizeof (gchar *));
-    GHashTable *attributes = atspi_accessible_get_attributes (obj, error);
-    if (!attributes)
-      return NULL;
-    g_hash_table_foreach (attributes, add_to_attribute_array, &array);
-    g_hash_table_unref (attributes);
-    return array;
+    GValue *val = g_hash_table_lookup (obj->priv->cache, "Attributes");
+    if (val)
+    {
+      GArray *array = g_array_new (TRUE, TRUE, sizeof (gchar *));
+      GHashTable *attributes = g_value_get_boxed (val);
+      g_hash_table_foreach (attributes, add_to_attribute_array, &array);
+      return array;
+    }
   }
 
   message = _atspi_dbus_call_partial (obj, atspi_interface_accessible, "GetAttributes", error, "");
@@ -634,9 +789,9 @@ atspi_accessible_get_attributes_as_array (AtspiAccessible *obj, GError **error)
  * atspi_accessible_get_application:
  * @obj: The #AtspiAccessible being queried.
  *
- * Get the containing #AtspiApplication for an object.
+ * Gets the containing #AtspiApplication for an object.
  *
- * Returns: (transfer full): the containing AtspiApplication instance for
+ * Returns: (transfer full): the containing #AtspiApplication instance for
  *          this object.
  */
 AtspiAccessible *
@@ -665,7 +820,11 @@ atspi_accessible_get_application (AtspiAccessible *obj, GError **error)
     }
     if (!parent || parent == obj ||
         atspi_accessible_get_role (parent, NULL) == ATSPI_ROLE_DESKTOP_FRAME)
+  {
+    if (parent)
+      g_object_unref (parent);
     return obj;
+  }
     g_object_unref (obj);
     obj = parent;
   }
@@ -677,11 +836,10 @@ atspi_accessible_get_application (AtspiAccessible *obj, GError **error)
  * atspi_accessible_get_toolkit_name:
  * @obj: a pointer to the #AtspiAccessible object on which to operate.
  *
- * Get the toolkit for a #AtspiAccessible object.
+ * Gets the toolkit name for an #AtspiAccessible object.
  * Only works on application root objects.
  *
- * Returns: a UTF-8 string indicating the toolkit name for the #AtspiAccessible object.
- * or NULL on exception
+ * Returns: a UTF-8 string indicating the toolkit name for the #AtspiAccessible object or NULL on exception.
  **/
 gchar *
 atspi_accessible_get_toolkit_name (AtspiAccessible *obj, GError **error)
@@ -702,11 +860,10 @@ atspi_accessible_get_toolkit_name (AtspiAccessible *obj, GError **error)
  * atspi_accessible_get_toolkit_version:
  * @obj: a pointer to the #AtspiAccessible object on which to operate.
  *
- * Get the toolkit version for a #AtspiAccessible object.
+ * Gets the toolkit version for an #AtspiAccessible object.
  * Only works on application root objects.
  *
- * Returns: a UTF-8 string indicating the toolkit ersion for the #AtspiAccessible object.
- * or NULL on exception
+ * Returns: a UTF-8 string indicating the toolkit version for the #AtspiAccessible object or NULL on exception.
  **/
 gchar *
 atspi_accessible_get_toolkit_version (AtspiAccessible *obj, GError **error)
@@ -727,12 +884,11 @@ atspi_accessible_get_toolkit_version (AtspiAccessible *obj, GError **error)
  * atspi_accessible_get_atspi_version:
  * @obj: a pointer to the #AtspiAccessible object on which to operate.
  *
- * Get the AT-SPI IPC specification version supported by the application
+ * Gets the AT-SPI IPC specification version supported by the application
  * pointed to by the #AtspiAccessible object.
  * Only works on application root objects.
  *
- * Returns: a UTF-8 string indicating the AT-SPI ersion for the #AtspiAccessible object.
- * or NULL on exception
+ * Returns: a UTF-8 string indicating the AT-SPI version for the #AtspiAccessible object or NULL on exception.
  **/
 gchar *
 atspi_accessible_get_atspi_version (AtspiAccessible *obj, GError **error)
@@ -750,14 +906,14 @@ atspi_accessible_get_atspi_version (AtspiAccessible *obj, GError **error)
 }
 
 /**
- * atspi_accessible_get_toolkit_version:
+ * atspi_accessible_get_id:
  * @obj: a pointer to the #AtspiAccessible object on which to operate.
  *
- * Get the application id for a #AtspiAccessible object.
+ * Gets the application id for a #AtspiAccessible object.
  * Only works on application root objects.
  *
- * Returns: a gint indicating the id for the #AtspiAccessible object.
- * or -1 on exception
+ * Returns: a positive #gint indicating the id for the #AtspiAccessible object
+ * or -1 on exception.
  **/
 gint
 atspi_accessible_get_id (AtspiAccessible *obj, GError **error)
@@ -807,7 +963,8 @@ _atspi_accessible_is_a (AtspiAccessible *accessible,
  * atspi_accessible_is_action:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Query whether the specified #AtspiAccessible implements #AtspiAction.
+ * Query whether the specified #AtspiAccessible implements the
+ * #AtspiAction interface.
  *
  * Returns: #TRUE if @obj implements the #AtspiAction interface,
  *          #FALSE otherwise.
@@ -823,7 +980,8 @@ atspi_accessible_is_action (AtspiAccessible *obj)
  * atspi_accessible_is_application:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Query whether the specified #AtspiAccessible implements #AtspiApplication.
+ * Query whether the specified #AtspiAccessible implements the
+ * #AtspiApplication interface.
  *
  * Returns: #TRUE if @obj implements the #AtspiApplication interface,
  *          #FALSE otherwise.
@@ -835,11 +993,14 @@ atspi_accessible_is_application (AtspiAccessible *obj)
                              atspi_interface_application);
 }
 
-/**                      
- * atspi_accessible_is_collection:                                                                                                                                                                          * @obj: a pointer to the #AtspiAccessible instance to query.                                                                                                                                          
- *                          
- * Query whether the specified #AtspiAccessible implements #AtspiCollection.    
- * Returns: #TRUE if @obj implements the #AtspiCollection interface,                                                                                                               
+/**
+ * atspi_accessible_is_collection:
+ * @obj: a pointer to the #AtspiAccessible instance to query.
+ *
+ * Query whether the specified #AtspiAccessible implements the
+ * #AtspiCollection interface.
+ *
+ * Returns: #TRUE if @obj implements the #AtspiCollection interface,
  *          #FALSE otherwise.
  **/
 gboolean
@@ -869,7 +1030,8 @@ atspi_accessible_is_component (AtspiAccessible *obj)
  * atspi_accessible_is_document:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Query whether the specified #AtspiAccessible implements #AtspiDocument.
+ * Query whether the specified #AtspiAccessible implements the
+ * #AtspiDocument interface.
  *
  * Returns: #TRUE if @obj implements the #AtspiDocument interface,
  *          #FALSE otherwise.
@@ -885,7 +1047,8 @@ atspi_accessible_is_document (AtspiAccessible *obj)
  * atspi_accessible_is_editable_text:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Query whether the specified #AtspiAccessible implements #AtspiEditableText.
+ * Query whether the specified #AtspiAccessible implements the
+ * #AtspiEditableText interface.
  *
  * Returns: #TRUE if @obj implements the #AtspiEditableText interface,
  *          #FALSE otherwise.
@@ -896,12 +1059,13 @@ atspi_accessible_is_editable_text (AtspiAccessible *obj)
   return _atspi_accessible_is_a (obj,
                              atspi_interface_editable_text);
 }
-                                                                                                                                                                        
+
 /**
  * atspi_accessible_is_hypertext:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Query whether the specified #AtspiAccessible implements #AtspiHypertext.
+ * Query whether the specified #AtspiAccessible implements the
+ * #AtspiHypertext interface.
  *
  * Returns: #TRUE if @obj implements the #AtspiHypertext interface,
  *          #FALSE otherwise.
@@ -917,7 +1081,8 @@ atspi_accessible_is_hypertext (AtspiAccessible *obj)
  * atspi_accessible_is_hyperlink:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Query whether the specified #AtspiAccessible implements #AtspiHyperlink.
+ * Query whether the specified #AtspiAccessible implements the
+ * #AtspiHyperlink interface.
  *
  * Returns: #TRUE if @obj implements the #AtspiHypertext interface,
  *          #FALSE otherwise.
@@ -933,7 +1098,8 @@ atspi_accessible_is_hyperlink (AtspiAccessible *obj)
  * atspi_accessible_is_image:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Query whether the specified #AtspiAccessible implements #AtspiImage.
+ * Query whether the specified #AtspiAccessible implements the
+ * #AtspiImage interface.
  *
  * Returns: #TRUE if @obj implements the #AtspiImage interface,
  *          #FALSE otherwise.
@@ -949,7 +1115,8 @@ atspi_accessible_is_image (AtspiAccessible *obj)
  * atspi_accessible_is_selection:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Query whether the specified #AtspiAccessible implements #AtspiSelection.
+ * Query whether the specified #AtspiAccessible implements the
+ * #AtspiSelection interface.
  *
  * Returns: #TRUE if @obj implements the #AtspiSelection interface,
  *          #FALSE otherwise.
@@ -965,7 +1132,8 @@ atspi_accessible_is_selection (AtspiAccessible *obj)
  * atspi_accessible_is_table:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Query whether the specified #AtspiAccessible implements #AtspiTable.
+ * Query whether the specified #AtspiAccessible implements the
+ * #AtspiTable interface.
  *
  * Returns: #TRUE if @obj implements the #AtspiTable interface,
  *          #FALSE otherwise.
@@ -978,11 +1146,28 @@ atspi_accessible_is_table (AtspiAccessible *obj)
 }
 
 /**
+ * atspi_accessible_is_table_cell:
+ * @obj: a pointer to the #AtspiAccessible instance to query.
+ *
+ * Query whether the specified #AtspiAccessible implements the
+ * #AtspiTableCell interface.
+ *
+ * Returns: #TRUE if @obj implements the #AtspiTable interface,
+ *          #FALSE otherwise.
+**/
+gboolean
+atspi_accessible_is_table_cell (AtspiAccessible *obj)
+{
+  return _atspi_accessible_is_a (obj,
+                             atspi_interface_table_cell);
+}
+
+/**
  * atspi_accessible_is_streamable_content:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Query whether the specified #AtspiAccessible implements
- *          #AtspiStreamableContent.
+ * Query whether the specified #AtspiAccessible implements the
+ * #AtspiStreamableContent interface.
  *
  * Returns: #TRUE if @obj implements the #AtspiStreamableContent interface,
  *          #FALSE otherwise.
@@ -1003,7 +1188,8 @@ atspi_accessible_is_streamable_content (AtspiAccessible *obj)
  * atspi_accessible_is_text:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Query whether the specified #AtspiAccessible implements #AtspiText.
+ * Query whether the specified #AtspiAccessible implements the
+ * #AtspiText interface.
  *
  * Returns: #TRUE if @obj implements the #AtspiText interface,
  *          #FALSE otherwise.
@@ -1019,7 +1205,8 @@ atspi_accessible_is_text (AtspiAccessible *obj)
  * atspi_accessible_is_value:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Query whether the specified #AtspiAccessible implements #AtspiValue.
+ * Query whether the specified #AtspiAccessible implements the
+ * #AtspiValue interface.
  *
  * Returns: #TRUE if @obj implements the #AtspiValue interface,
  *          #FALSE otherwise.
@@ -1032,45 +1219,83 @@ atspi_accessible_is_value (AtspiAccessible *obj)
 }
 
 /**
- * atspi_accessible_get_action:
+ * atspi_accessible_get_action: (rename-to atspi_accessible_get_action_iface)
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Get the #AtspiAction interface for an #AtspiAccessible.
+ * Gets the #AtspiAction interface for an #AtspiAccessible.
  *
  * Returns: (transfer full): a pointer to an #AtspiAction interface
  *          instance, or NULL if @obj does not implement #AtspiAction.
+ *
+ * Deprecated: 2.10: Use atspi_accessible_get_action_iface instead.
  **/
 AtspiAction *
 atspi_accessible_get_action (AtspiAccessible *accessible)
 {
   return (_atspi_accessible_is_a (accessible, atspi_interface_action) ?
-          g_object_ref (ATSPI_ACTION (accessible)) : NULL);  
+          g_object_ref (ATSPI_ACTION (accessible)) : NULL);
+}
+
+/**
+ * atspi_accessible_get_action_iface:
+ * @obj: a pointer to the #AtspiAccessible instance to query.
+ *
+ * Gets the #AtspiAction interface for an #AtspiAccessible.
+ *
+ * Returns: (transfer full): a pointer to an #AtspiAction interface
+ *          instance, or NULL if @obj does not implement #AtspiAction.
+ **/
+AtspiAction *
+atspi_accessible_get_action_iface (AtspiAccessible *accessible)
+{
+  return (_atspi_accessible_is_a (accessible, atspi_interface_action) ?
+          g_object_ref (ATSPI_ACTION (accessible)) : NULL);
 }
 
 /**
- * atspi_accessible_get_collection:
+ * atspi_accessible_get_collection: (rename-to atspi_accessible_get_collection_iface)
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Get the #AtspiCollection interface for an #AtspiAccessible.
+ * Gets the #AtspiCollection interface for an #AtspiAccessible.
  *
  * Returns: (transfer full): a pointer to an #AtspiCollection interface
  *          instance, or NULL if @obj does not implement #AtspiCollection.
+ *
+ * Deprecated: 2.10: Use atspi_accessible_get_collection_iface instead.
  **/
 AtspiCollection *
 atspi_accessible_get_collection (AtspiAccessible *accessible)
 {
   return (_atspi_accessible_is_a (accessible, atspi_interface_collection) ?
-          g_object_ref (ATSPI_COLLECTION (accessible)) : NULL);  
+          g_object_ref (ATSPI_COLLECTION (accessible)) : NULL);
+}
+
+/**
+ * atspi_accessible_get_collection_iface:
+ * @obj: a pointer to the #AtspiAccessible instance to query.
+ *
+ * Gets the #AtspiCollection interface for an #AtspiAccessible.
+ *
+ * Returns: (transfer full): a pointer to an #AtspiCollection interface
+ *          instance, or NULL if @obj does not implement #AtspiCollection.
+ **/
+AtspiCollection *
+atspi_accessible_get_collection_iface (AtspiAccessible *accessible)
+{
+  return (_atspi_accessible_is_a (accessible, atspi_interface_collection) ?
+          g_object_ref (ATSPI_COLLECTION (accessible)) : NULL);
 }
 
 /**
- * atspi_accessible_get_component:
+ * atspi_accessible_get_component: (rename-to atspi_accessible_get_component_iface)
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Get the #AtspiComponent interface for an #AtspiAccessible.
+ * Gets the #AtspiComponent interface for an #AtspiAccessible.
  *
  * Returns: (transfer full): a pointer to an #AtspiComponent interface
  *          instance, or NULL if @obj does not implement #AtspiComponent.
+ *
+ * Deprecated: 2.10: Use atspi_accessible_get_component_iface instead.
  **/
 AtspiComponent *
 atspi_accessible_get_component (AtspiAccessible *obj)
@@ -1080,43 +1305,94 @@ atspi_accessible_get_component (AtspiAccessible *obj)
 }
 
 /**
- * atspi_accessible_get_document:
+ * atspi_accessible_get_component_iface:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Get the #AtspiDocument interface for an #AtspiAccessible.
+ * Gets the #AtspiComponent interface for an #AtspiAccessible.
+ *
+ * Returns: (transfer full): a pointer to an #AtspiComponent interface
+ *          instance, or NULL if @obj does not implement #AtspiComponent.
+ **/
+AtspiComponent *
+atspi_accessible_get_component_iface (AtspiAccessible *obj)
+{
+  return (_atspi_accessible_is_a (obj, atspi_interface_component) ?
+          g_object_ref (ATSPI_COMPONENT (obj)) : NULL);
+}
+
+/**
+ * atspi_accessible_get_document: (rename-to atspi_accessible_get_document_iface)
+ * @obj: a pointer to the #AtspiAccessible instance to query.
+ *
+ * Gets the #AtspiDocument interface for an #AtspiAccessible.
  *
  * Returns: (transfer full): a pointer to an #AtspiDocument interface
  *          instance, or NULL if @obj does not implement #AtspiDocument.
+ *
+ * Deprecated: 2.10: Use atspi_accessible_get_document_iface instead.
  **/
 AtspiDocument *
 atspi_accessible_get_document (AtspiAccessible *accessible)
 {
   return (_atspi_accessible_is_a (accessible, atspi_interface_document) ?
-          g_object_ref (ATSPI_DOCUMENT (accessible)) : NULL);  
+          g_object_ref (ATSPI_DOCUMENT (accessible)) : NULL);
+}
+
+/**
+ * atspi_accessible_get_document_iface:
+ * @obj: a pointer to the #AtspiAccessible instance to query.
+ *
+ * Gets the #AtspiDocument interface for an #AtspiAccessible.
+ *
+ * Returns: (transfer full): a pointer to an #AtspiDocument interface
+ *          instance, or NULL if @obj does not implement #AtspiDocument.
+ **/
+AtspiDocument *
+atspi_accessible_get_document_iface (AtspiAccessible *accessible)
+{
+  return (_atspi_accessible_is_a (accessible, atspi_interface_document) ?
+          g_object_ref (ATSPI_DOCUMENT (accessible)) : NULL);
 }
 
 /**
- * atspi_accessible_get_editable_text:
+ * atspi_accessible_get_editable_text: (rename-to atspi_accessible_get_editable_text_iface)
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Get the #AtspiEditableText interface for an #AtspiAccessible.
+ * Gets the #AtspiEditableText interface for an #AtspiAccessible.
  *
  * Returns: (transfer full): a pointer to an #AtspiEditableText interface
  *          instance, or NULL if @obj does not implement #AtspiEditableText.
+ *
+ * Deprecated: 2.10: Use atspi_accessible_get_editable_text_iface instead.
  **/
 AtspiEditableText *
 atspi_accessible_get_editable_text (AtspiAccessible *accessible)
 {
   return (_atspi_accessible_is_a (accessible, atspi_interface_editable_text) ?
-          g_object_ref (ATSPI_EDITABLE_TEXT (accessible)) : NULL);  
+          g_object_ref (ATSPI_EDITABLE_TEXT (accessible)) : NULL);
+}
+
+/**
+ * atspi_accessible_get_editable_text_iface:
+ * @obj: a pointer to the #AtspiAccessible instance to query.
+ *
+ * Gets the #AtspiEditableText interface for an #AtspiAccessible.
+ *
+ * Returns: (transfer full): a pointer to an #AtspiEditableText interface
+ *          instance, or NULL if @obj does not implement #AtspiEditableText.
+ **/
+AtspiEditableText *
+atspi_accessible_get_editable_text_iface (AtspiAccessible *accessible)
+{
+  return (_atspi_accessible_is_a (accessible, atspi_interface_editable_text) ?
+          g_object_ref (ATSPI_EDITABLE_TEXT (accessible)) : NULL);
 }
 
 /**
  * atspi_accessible_get_hyperlink:
  * @obj: a pointer to the #AtspiAccessible object on which to operate.
  *
- * Get the #AtspiHyperlink associated with the given #AtspiAccessible, if
- * supported.
+ * Gets the #AtspiHyperlink interface for an #AtspiAccessible.
  *
  * Returns: (transfer full): the #AtspiHyperlink object associated with
  *          the given #AtspiAccessible, or NULL if not supported.
@@ -1125,55 +1401,109 @@ AtspiHyperlink *
 atspi_accessible_get_hyperlink (AtspiAccessible *accessible)
 {
   return (_atspi_accessible_is_a (accessible, atspi_interface_hyperlink) ?
-          atspi_hyperlink_new (accessible->parent.app, accessible->parent.path) : NULL);
+          _atspi_hyperlink_new (accessible->parent.app, accessible->parent.path) : NULL);
 }
 
 /**
- * atspi_accessible_get_hypertext:
+ * atspi_accessible_get_hypertext: (rename-to atspi_accessible_get_hypertext_iface)
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Get the #AtspiHypertext interface for an #AtspiAccessible.
+ * Gets the #AtspiHypertext interface for an #AtspiAccessible.
  *
  * Returns: (transfer full): a pointer to an #AtspiHypertext interface
  *          instance, or NULL if @obj does not implement #AtspiHypertext.
+ *
+ * Deprecated: 2.10: Use atspi_accessible_get_hypertext_iface instead.
  **/
 AtspiHypertext *
 atspi_accessible_get_hypertext (AtspiAccessible *accessible)
 {
   return (_atspi_accessible_is_a (accessible, atspi_interface_hypertext) ?
-          g_object_ref (ATSPI_HYPERTEXT (accessible)) : NULL);  
+          g_object_ref (ATSPI_HYPERTEXT (accessible)) : NULL);
+}
+
+/**
+ * atspi_accessible_get_hypertext_iface:
+ * @obj: a pointer to the #AtspiAccessible instance to query.
+ *
+ * Gets the #AtspiHypertext interface for an #AtspiAccessible.
+ *
+ * Returns: (transfer full): a pointer to an #AtspiHypertext interface
+ *          instance, or NULL if @obj does not implement #AtspiHypertext.
+ **/
+AtspiHypertext *
+atspi_accessible_get_hypertext_iface (AtspiAccessible *accessible)
+{
+  return (_atspi_accessible_is_a (accessible, atspi_interface_hypertext) ?
+          g_object_ref (ATSPI_HYPERTEXT (accessible)) : NULL);
 }
 
 /**
- * atspi_accessible_get_image:
+ * atspi_accessible_get_image: (rename-to atspi_accessible_get_image_iface)
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Get the #AtspiImage interface for an #AtspiAccessible.
+ * Gets the #AtspiImage interface for an #AtspiAccessible.
  *
  * Returns: (transfer full): a pointer to an #AtspiImage interface instance, or
  *          NULL if @obj does not implement #AtspiImage.
+ *
+ * Deprecated: 2.10: Use atspi_accessible_get_image_iface instead.
  **/
 AtspiImage *
 atspi_accessible_get_image (AtspiAccessible *accessible)
 {
   return (_atspi_accessible_is_a (accessible, atspi_interface_image) ?
-          g_object_ref (ATSPI_IMAGE (accessible)) : NULL);  
+          g_object_ref (ATSPI_IMAGE (accessible)) : NULL);
+}
+
+/**
+ * atspi_accessible_get_image_iface:
+ * @obj: a pointer to the #AtspiAccessible instance to query.
+ *
+ * Gets the #AtspiImage interface for an #AtspiAccessible.
+ *
+ * Returns: (transfer full): a pointer to an #AtspiImage interface instance, or
+ *          NULL if @obj does not implement #AtspiImage.
+ **/
+AtspiImage *
+atspi_accessible_get_image_iface (AtspiAccessible *accessible)
+{
+  return (_atspi_accessible_is_a (accessible, atspi_interface_image) ?
+          g_object_ref (ATSPI_IMAGE (accessible)) : NULL);
 }
 
 /**
- * atspi_accessible_get_selection:
+ * atspi_accessible_get_selection: (rename-to atspi_accessible_get_selection_iface)
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Get the #AtspiSelection interface for an #AtspiAccessible.
+ * Gets the #AtspiSelection interface for an #AtspiAccessible.
  *
  * Returns: (transfer full): a pointer to an #AtspiSelection interface
  *          instance, or NULL if @obj does not implement #AtspiSelection.
+ *
+ * Deprecated: 2.10: Use atspi_accessible_get_selection_iface instead.
  **/
 AtspiSelection *
 atspi_accessible_get_selection (AtspiAccessible *accessible)
 {
   return (_atspi_accessible_is_a (accessible, atspi_interface_selection) ?
-          g_object_ref (ATSPI_SELECTION (accessible)) : NULL);  
+          g_object_ref (ATSPI_SELECTION (accessible)) : NULL);
+}
+
+/**
+ * atspi_accessible_get_selection_iface:
+ * @obj: a pointer to the #AtspiAccessible instance to query.
+ *
+ * Gets the #AtspiSelection interface for an #AtspiAccessible.
+ *
+ * Returns: (transfer full): a pointer to an #AtspiSelection interface
+ *          instance, or NULL if @obj does not implement #AtspiSelection.
+ **/
+AtspiSelection *
+atspi_accessible_get_selection_iface (AtspiAccessible *accessible)
+{
+  return (_atspi_accessible_is_a (accessible, atspi_interface_selection) ?
+          g_object_ref (ATSPI_SELECTION (accessible)) : NULL);
 }
 
 #if 0
@@ -1181,7 +1511,7 @@ atspi_accessible_get_selection (AtspiAccessible *accessible)
  * atspi_accessible_get_streamable_content:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Get the #AtspiStreamableContent interface for an #AtspiAccessible.
+ * Gets the #AtspiStreamableContent interface for an #AtspiAccessible.
  *
  * Returns: (transfer full): a pointer to an #AtspiStreamableContent interface
  *          instance, or NULL if @obj does not implement #AtspiStreamableContent.
@@ -1190,34 +1520,70 @@ AtspiStreamableContent *
 atspi_accessible_get_streamable_content (AtspiAccessible *accessible)
 {
   return (_atspi_accessible_is_a (accessible, atspi_interface_streamable_content) ?
-          accessible : NULL);  
+          accessible : NULL);
 }
 #endif
 
 /**
- * atspi_accessible_get_table:
+ * atspi_accessible_get_table: (rename-to atspi_accessible_get_table_iface)
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Get the #AtspiTable interface for an #AtspiAccessible.
+ * Gets the #AtspiTable interface for an #AtspiAccessible.
  *
  * Returns: (transfer full): a pointer to an #AtspiTable interface instance, or
  *          NULL if @obj does not implement #AtspiTable.
+ *
+ * Deprecated: 2.10: Use atspi_accessible_get_table_iface instead.
  **/
 AtspiTable *
 atspi_accessible_get_table (AtspiAccessible *obj)
 {
   return (_atspi_accessible_is_a (obj, atspi_interface_table) ?
-          g_object_ref (ATSPI_TABLE (obj)) : NULL);  
+          g_object_ref (ATSPI_TABLE (obj)) : NULL);
 }
 
 /**
- * atspi_accessible_get_text:
+ * atspi_accessible_get_table_iface:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Get the #AtspiTable interface for an #AtspiAccessible.
+ * Gets the #AtspiTable interface for an #AtspiAccessible.
+ *
+ * Returns: (transfer full): a pointer to an #AtspiTable interface instance, or
+ *          NULL if @obj does not implement #AtspiTable.
+ **/
+AtspiTable *
+atspi_accessible_get_table_iface (AtspiAccessible *obj)
+{
+  return (_atspi_accessible_is_a (obj, atspi_interface_table) ?
+          g_object_ref (ATSPI_TABLE (obj)) : NULL);
+}
+
+/**
+ * atspi_accessible_get_table_cell:
+ * @obj: a pointer to the #AtspiAccessible instance to query.
+ *
+ * Gets the #AtspiTableCell interface for an #AtspiAccessible.
+ *
+ * Returns: (transfer full): a pointer to an #AtspiTableCell interface instance,
+ *          or NULL if @obj does not implement #AtspiTable.
+ **/
+AtspiTableCell *
+atspi_accessible_get_table_cell (AtspiAccessible *obj)
+{
+  return (_atspi_accessible_is_a (obj, atspi_interface_table_cell) ?
+          g_object_ref (ATSPI_TABLE_CELL (obj)) : NULL);
+}
+
+/**
+ * atspi_accessible_get_text: (rename-to atspi_accessible_get_text_iface)
+ * @obj: a pointer to the #AtspiAccessible instance to query.
+ *
+ * Gets the #AtspiTable interface for an #AtspiAccessible.
  *
  * Returns: (transfer full): a pointer to an #AtspiText interface instance, or
  *          NULL if @obj does not implement #AtspiText.
+ *
+ * Deprecated: 2.10: Use atspi_accessible_get_text_iface instead.
  **/
 AtspiText *
 atspi_accessible_get_text (AtspiAccessible *obj)
@@ -1227,19 +1593,53 @@ atspi_accessible_get_text (AtspiAccessible *obj)
 }
 
 /**
- * atspi_accessible_get_value:
+ * atspi_accessible_get_text_iface:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Get the #AtspiTable interface for an #AtspiAccessible.
+ * Gets the #AtspiTable interface for an #AtspiAccessible.
+ *
+ * Returns: (transfer full): a pointer to an #AtspiText interface instance, or
+ *          NULL if @obj does not implement #AtspiText.
+ **/
+AtspiText *
+atspi_accessible_get_text_iface (AtspiAccessible *obj)
+{
+  return (_atspi_accessible_is_a (obj, atspi_interface_text) ?
+          g_object_ref (ATSPI_TEXT (obj)) : NULL);
+}
+
+/**
+ * atspi_accessible_get_value: (rename-to atspi_accessible_get_value_iface)
+ * @obj: a pointer to the #AtspiAccessible instance to query.
+ *
+ * Gets the #AtspiTable interface for an #AtspiAccessible.
  *
  * Returns: (transfer full): a pointer to an #AtspiValue interface instance, or
  *          NULL if @obj does not implement #AtspiValue.
+ *
+ * Deprecated: 2.10: Use atspi_accessible_get_value_iface instead.
  **/
 AtspiValue *
 atspi_accessible_get_value (AtspiAccessible *accessible)
 {
   return (_atspi_accessible_is_a (accessible, atspi_interface_value) ?
-          g_object_ref (ATSPI_VALUE (accessible)) : NULL);  
+          g_object_ref (ATSPI_VALUE (accessible)) : NULL);
+}
+
+/**
+ * atspi_accessible_get_value_iface:
+ * @obj: a pointer to the #AtspiAccessible instance to query.
+ *
+ * Gets the #AtspiTable interface for an #AtspiAccessible.
+ *
+ * Returns: (transfer full): a pointer to an #AtspiValue interface instance, or
+ *          NULL if @obj does not implement #AtspiValue.
+ **/
+AtspiValue *
+atspi_accessible_get_value_iface (AtspiAccessible *accessible)
+{
+  return (_atspi_accessible_is_a (accessible, atspi_interface_value) ?
+          g_object_ref (ATSPI_VALUE (accessible)) : NULL);
 }
 
 static void
@@ -1253,12 +1653,13 @@ append_const_val (GArray *array, const gchar *val)
 
 /**
  * atspi_accessible_get_interfaces:
+ * @obj: The #AtspiAccessible to query.
  *
- * #obj: The #AtspiAccessible to query.
+ * A set of pointers to all interfaces supported by an #AtspiAccessible.
  *
  * Returns: (element-type gchar*) (transfer full): A #GArray of strings
  *          describing the interfaces supported by the object.  Interfaces are
- *          denoted in short-hand (ie, "Component", "Text", etc.)
+ *          denoted in short-hand (i.e. "Component", "Text" etc.).
  **/
 GArray *
 atspi_accessible_get_interfaces (AtspiAccessible *obj)
@@ -1288,6 +1689,8 @@ atspi_accessible_get_interfaces (AtspiAccessible *obj)
     append_const_val (ret, "Selection");
   if (atspi_accessible_is_table (obj))
     append_const_val (ret, "Table");
+  if (atspi_accessible_is_table_cell (obj))
+    append_const_val (ret, "TableCell");
   if (atspi_accessible_is_text (obj))
     append_const_val (ret, "Text");
   if (atspi_accessible_is_value (obj))
@@ -1297,10 +1700,10 @@ atspi_accessible_get_interfaces (AtspiAccessible *obj)
 }
 
 AtspiAccessible *
-atspi_accessible_new (AtspiApplication *app, const gchar *path)
+_atspi_accessible_new (AtspiApplication *app, const gchar *path)
 {
   AtspiAccessible *accessible;
-  
+
   accessible = g_object_new (ATSPI_TYPE_ACCESSIBLE, NULL);
   g_return_val_if_fail (accessible != NULL, NULL);
 
@@ -1312,7 +1715,6 @@ atspi_accessible_new (AtspiApplication *app, const gchar *path)
 
 /**
  * atspi_accessible_set_cache_mask:
- *
  * @accessible: The #AtspiAccessible to operate on.  Must be the desktop or
  *             the root of an application.
  * @mask: An #AtspiCache specifying a bit mask of the types of data to cache.
@@ -1332,6 +1734,7 @@ atspi_accessible_set_cache_mask (AtspiAccessible *accessible, AtspiCache mask)
   g_return_if_fail (accessible->parent.app != NULL);
   g_return_if_fail (accessible == accessible->parent.app->root);
   accessible->parent.app->cache = mask;
+  enable_caching = TRUE;
 }
 
 /**
@@ -1354,6 +1757,55 @@ atspi_accessible_clear_cache (AtspiAccessible *accessible)
   }
 }
 
+/**
+ * atspi_accessible_get_process_id:
+ * @accessible: The #AtspiAccessible to query.
+ * @error: a pointer to a %NULL #GError pointer
+ *
+ * Returns the process id associated with the given accessible.  Mainly
+ * added for debugging; it is a shortcut to explicitly querying the
+ * accessible's app->bus_name and then calling GetConnectionUnixProcessID.
+ *
+ * Returns: The process ID or undetermined value if @error is set.
+ **/
+guint
+atspi_accessible_get_process_id (AtspiAccessible *accessible, GError **error)
+{
+  DBusMessage *message, *reply;
+  DBusConnection *bus = _atspi_bus ();
+  dbus_uint32_t pid = -1;
+  DBusError d_error;
+
+  if (!accessible->parent.app || !accessible->parent.app->bus_name)
+    {
+      g_set_error_literal(error, ATSPI_ERROR, ATSPI_ERROR_IPC, "Process is defunct");
+      return -1;
+    }
+
+  message = dbus_message_new_method_call ("org.freedesktop.DBus",
+                                          "/org/freedesktop/DBus",
+                                          "org.freedesktop.DBus",
+                                          "GetConnectionUnixProcessID");
+  dbus_message_append_args (message, DBUS_TYPE_STRING,
+                            &accessible->parent.app->bus_name,
+                            DBUS_TYPE_INVALID);
+  dbus_error_init (&d_error);
+  reply = dbus_connection_send_with_reply_and_block (bus, message, -1, &d_error);
+  dbus_message_unref (message);
+  if (reply)
+  {
+    if (!strcmp (dbus_message_get_signature (reply), "u"))
+      dbus_message_get_args (reply, NULL, DBUS_TYPE_UINT32, &pid, DBUS_TYPE_INVALID);
+    dbus_message_unref (reply);
+  }
+  if (dbus_error_is_set (&d_error))
+    {
+      g_set_error_literal(error, ATSPI_ERROR, ATSPI_ERROR_IPC, "Process is defunct");
+      dbus_error_free (&d_error);
+    }
+  return pid;
+}
+
 AtspiCache
 _atspi_accessible_get_cache_mask (AtspiAccessible *accessible)
 {
@@ -1383,7 +1835,11 @@ _atspi_accessible_test_cache (AtspiAccessible *accessible, AtspiCache flag)
 {
   AtspiCache mask = _atspi_accessible_get_cache_mask (accessible);
   AtspiCache result = accessible->cached_properties & mask & flag;
-  return (result != 0 && atspi_main_loop && !atspi_no_cache);
+  if (accessible->states && atspi_state_set_contains (accessible->states, ATSPI_STATE_TRANSIENT))
+    return FALSE;
+  return (result != 0 && (atspi_main_loop || enable_caching ||
+                          flag == ATSPI_CACHE_INTERFACES) &&
+          !atspi_no_cache);
 }
 
 void
@@ -1393,3 +1849,70 @@ _atspi_accessible_add_cache (AtspiAccessible *accessible, AtspiCache flag)
 
   accessible->cached_properties |= flag & mask;
 }
+
+/**
+ * atspi_accessible_get_locale:
+ * @accessible: an #AtspiAccessible
+ *
+ * Gets a UTF-8 string indicating the POSIX-style LC_MESSAGES locale
+ * of @accessible.
+ *
+ * Since: 2.7.91
+ *
+ * Returns: a UTF-8 string indicating the POSIX-style LC_MESSAGES
+ *          locale of @accessible.
+ **/
+const gchar*
+atspi_accessible_get_object_locale (AtspiAccessible *accessible, GError **error)
+{
+  gchar *locale;
+
+  g_return_val_if_fail (accessible != NULL, NULL);
+
+  locale = g_object_get_qdata (G_OBJECT (accessible), quark_locale);
+  if (!locale)
+  {
+    if (!_atspi_dbus_get_property (accessible, atspi_interface_accessible,
+                                   "Locale", error, "s", &locale))
+      return NULL;
+    if (locale)
+      g_object_set_qdata_full (G_OBJECT (accessible), quark_locale, locale,
+                               g_free);
+  }
+  return locale;
+}
+
+void
+free_value (gpointer data)
+{
+  GValue *value = data;
+
+  g_value_unset (value);
+  g_free (value);
+}
+
+GHashTable *
+_atspi_accessible_ref_cache (AtspiAccessible *accessible)
+{
+  AtspiAccessiblePrivate *priv = accessible->priv;
+
+  priv->cache_ref_count++;
+  if (priv->cache)
+    return g_hash_table_ref (priv->cache);
+  priv->cache = g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
+                                       free_value);
+  return priv->cache;
+}
+
+void
+_atspi_accessible_unref_cache (AtspiAccessible *accessible)
+{
+  AtspiAccessiblePrivate *priv = accessible->priv;
+
+  if (priv->cache)
+  {
+    g_hash_table_unref (priv->cache);
+    if (--priv->cache_ref_count == 0)
+      priv->cache = NULL;
+  }
+}