}
/**
+ * 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.
*
gchar * atspi_accessible_get_unique_id (AtspiAccessible *obj, GError **error);
+AtspiAccessible *atspi_accessible_get_navigable_at_point (AtspiAccessible *root, gint x, gint y, AtspiCoordType ctype, GError **error);
+
AtspiAccessible * atspi_accessible_get_parent (AtspiAccessible *obj, GError **error);
gint atspi_accessible_get_child_count (AtspiAccessible *obj, GError **error);
return _atspi_dbus_return_accessible_from_message (reply);
}
+
/**
* atspi_component_get_extents:
* @obj: a pointer to the #AtspiComponent to query.
* atspi_component_get_layer:
* @obj: a pointer to the #AtspiComponent to query.
*
- * Queries which layer the component is painted into, to help determine its
+ * Queries which layer the component is painted into, to help determine its
* visibility in terms of stacking order.
*
* Returns: the #AtspiComponentLayer into which this component is painted.
* Queries the z stacking order of a component which is in the MDI or window
* layer. (Bigger z-order numbers mean nearer the top)
*
- * Returns: a #gshort indicating the stacking order of the component
+ * Returns: a #gshort indicating the stacking order of the component
* in the MDI layer, or -1 if the component is not in the MDI layer.
**/
gshort
*
* Gets the opacity/alpha value of a component, if alpha blending is in use.
*
- * Returns: the opacity value of a component, as a #gdouble between 0.0 and 1.0.
+ * Returns: the opacity value of a component, as a #gdouble between 0.0 and 1.0.
**/
-gdouble
+gdouble
atspi_component_get_alpha (AtspiComponent *obj, GError **error)
{
double retval = 1;
*
* Copyright 2002 Ximian, Inc.
* 2002 Sun Microsystems Inc.
- *
+ *
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
/**
* ATSPI_TYPE_RECT:
- *
+ *
* The #GType for a boxed type holding a #AtspiRect.
*/
#define ATSPI_TYPE_RECT (atspi_rect_get_type ())
/**
* ATSPI_TYPE_POINT:
- *
+ *
* The #GType for a boxed type holding a #AtspiPoint.
*/
#define ATSPI_TYPE_POINT (atspi_point_get_type ())
* Copyright 2002 Ximian, Inc.
* 2002 Sun Microsystems Inc.
* Copyright 2010, 2011 Novell, Inc.
- *
+ *
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
_atspi_dbus_return_accessible_from_message (DBusMessage *message);
AtspiAccessible *
+_atspi_dbus_return_accessible_and_recurse_info_from_message (DBusMessage *message, unsigned char *recurse);
+
+AtspiAccessible *
_atspi_dbus_return_accessible_from_iter (DBusMessageIter *iter);
AtspiHyperlink *
GHashTable *
_atspi_get_live_refs (void)
{
- if (!live_refs)
+ if (!live_refs)
{
live_refs = g_hash_table_new (g_direct_hash, g_direct_equal);
}
return ref_accessible (app, path);
}
-AtspiAccessible *
-_atspi_dbus_return_accessible_from_message (DBusMessage *message)
+static AtspiAccessible *
+_atspi_dbus_return_accessible_and_recurse_info_from_message_impl (DBusMessage *message, unsigned char *recurse)
{
DBusMessageIter iter;
AtspiAccessible *retval = NULL;
const char *signature;
+ const char *expected_signature = recurse ? "(so)y" : "(so)";
- if (!message)
- return NULL;
+ if (!message) return NULL;
signature = dbus_message_get_signature (message);
- if (!strcmp (signature, "(so)"))
+ if (!strcmp (signature, expected_signature))
{
dbus_message_iter_init (message, &iter);
retval = _atspi_dbus_return_accessible_from_iter (&iter);
+ if (recurse) {
+ unsigned char value = 0;
+ dbus_message_iter_get_basic (&iter, &value);
+ dbus_message_iter_next (&iter);
+ *recurse = (value != 0);
+ }
}
else
{
- g_warning ("AT-SPI: Called _atspi_dbus_return_accessible_from_message with strange signature %s", signature);
+ g_warning ("AT-SPI: Called _atspi_dbus_return_accessible_from_message with unexpected signature %s", signature);
}
dbus_message_unref (message);
return retval;
}
AtspiAccessible *
+_atspi_dbus_return_accessible_from_message (DBusMessage *message)
+{
+ return _atspi_dbus_return_accessible_and_recurse_info_from_message_impl(message, NULL);
+}
+
+AtspiAccessible *
+_atspi_dbus_return_accessible_and_recurse_info_from_message(DBusMessage *message, unsigned char *recurse)
+{
+ if (recurse == NULL) {
+ g_error("AT-SPI: Called _atspi_dbus_return_accessible_and_recurse_info_from_message with NULL argument recurse");
+ dbus_message_unref (message);
+ return NULL;
+ }
+ return _atspi_dbus_return_accessible_and_recurse_info_from_message_impl(message, recurse);
+}
+
+AtspiAccessible *
_atspi_dbus_return_accessible_from_iter (DBusMessageIter *iter)
{
const char *app_name, *path;
DBusMessageIter iter;
AtspiHyperlink *retval = NULL;
const char *signature;
-
+
if (!message)
return NULL;
*
* Connects to the accessibility registry and initializes the SPI.
*
- * Returns: 0 on success, 1 if already initialized, or an integer error code.
+ * Returns: 0 on success, 1 if already initialized, or an integer error code.
**/
int
atspi_init (void)
/**
* atspi_exit:
*
- * Disconnects from #AtspiRegistry instances and releases
+ * Disconnects from #AtspiRegistry instances and releases
* any floating resources. Call only once at exit.
*
* Returns: 0 if there were no leaks, otherwise other integer values.
{
AtspiObject *aobj = ATSPI_OBJECT (obj);
DBusError err;
- DBusMessage *msg = NULL, *reply = NULL;
- DBusMessageIter iter;
- const char *p;
+ DBusMessage *msg = NULL, *reply = NULL;
+ DBusMessageIter iter;
+ const char *p;
dbus_error_init (&err);
g_warning ("Could not open X display");
return NULL;
}
-
+
AT_SPI_BUS = XInternAtom (bridge_display, "AT_SPI_BUS", False);
XGetWindowProperty (bridge_display,
XDefaultRootWindow (bridge_display),
dbus_error_free (&error);
goto out;
}
-
+
{
const char *tmp_address;
if (!dbus_message_get_args (reply,
return NULL;
}
}
-
+
/* Simulate a weak ref on the bus */
dbus_connection_set_data (a11y_bus, a11y_dbus_slot, a11y_bus, a11y_bus_free);
g_value_set_boxed (val, &extents);
}
if (val)
- g_hash_table_insert (cache, g_strdup (key), val);
+ g_hash_table_insert (cache, g_strdup (key), val);
dbus_message_iter_next (&iter_dict);
}