2 * AT-SPI - Assistive Technology Service Provider Interface
3 * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
5 * Copyright 2001, 2002 Sun Microsystems Inc.,
6 * Copyright 2001, 2002 Ximian, Inc.
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the
20 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 * Boston, MA 02110-1301, USA.
26 * AtspiComponent function implementations
30 #include "atspi-private.h"
31 #include "atspi-accessible-private.h"
34 atspi_rect_free (AtspiRect *rect)
40 atspi_rect_copy (AtspiRect *src)
42 AtspiRect *dst = g_new (AtspiRect, 1);
45 dst->height = src->height;
46 dst->width = src->width;
50 G_DEFINE_BOXED_TYPE (AtspiRect, atspi_rect, atspi_rect_copy, atspi_rect_free)
53 atspi_point_copy (AtspiPoint *src)
55 AtspiPoint *dst = g_new (AtspiPoint, 1);
61 G_DEFINE_BOXED_TYPE (AtspiPoint, atspi_point, atspi_point_copy, g_free)
64 * atspi_component_contains:
65 * @obj: a pointer to the #AtspiComponent to query.
66 * @x: a #gint specifying the x coordinate in question.
67 * @y: a #gint specifying the y coordinate in question.
68 * @ctype: the desired coordinate system of the point (@x, @y)
69 * (e.g. CSPI_COORD_TYPE_WINDOW, CSPI_COORD_TYPE_SCREEN).
71 * Queries whether a given #AtspiComponent contains a particular point.
73 * Returns: #TRUE if the specified component contains the point (@x, @y),
77 atspi_component_contains (AtspiComponent *obj,
80 AtspiCoordType ctype, GError **error)
82 dbus_bool_t retval = FALSE;
83 dbus_int32_t d_x = x, d_y = y;
84 dbus_uint32_t d_ctype = ctype;
86 g_return_val_if_fail (obj != NULL, FALSE);
88 _atspi_dbus_call (obj, atspi_interface_component, "Contains", error, "iiu=>b", d_x, d_y, d_ctype, &retval);
94 * atspi_component_get_accessible_at_point:
95 * @obj: a pointer to the #AtspiComponent to query.
96 * @x: a #gint specifying the x coordinate of the point in question.
97 * @y: a #gint specifying the y coordinate of the point in question.
98 * @ctype: the coordinate system of the point (@x, @y)
99 * (e.g. ATSPI_COORD_TYPE_WINDOW, ATSPI_COORD_TYPE_SCREEN).
101 * Gets the accessible child at a given coordinate within an #AtspiComponent.
103 * Returns: (nullable) (transfer full): a pointer to an
104 * #AtspiAccessible child of the specified component which
105 * contains the point (@x, @y), or NULL if no child contains
109 atspi_component_get_accessible_at_point (AtspiComponent *obj,
112 AtspiCoordType ctype, GError **error)
114 dbus_int32_t d_x = x, d_y = y;
115 dbus_uint32_t d_ctype = ctype;
118 g_return_val_if_fail (obj != NULL, FALSE);
120 reply = _atspi_dbus_call_partial (obj, atspi_interface_component, "GetAccessibleAtPoint", error, "iiu", d_x, d_y, d_ctype);
122 return _atspi_dbus_return_accessible_from_message (reply);
127 * atspi_component_get_extents:
128 * @obj: a pointer to the #AtspiComponent to query.
129 * @ctype: the desired coordinate system into which to return the results,
130 * (e.g. ATSPI_COORD_TYPE_WINDOW, ATSPI_COORD_TYPE_SCREEN).
132 * Gets the bounding box of the specified #AtspiComponent.
133 * The returned values are meaningful only if the Component has both
134 * STATE_VISIBLE and STATE_SHOWING.
136 * Returns: An #AtspiRect giving the accessible's extents.
139 atspi_component_get_extents (AtspiComponent *obj,
140 AtspiCoordType ctype, GError **error)
142 dbus_uint32_t d_ctype = ctype;
144 AtspiAccessible *accessible;
146 bbox.x = bbox.y = bbox.width = bbox.height = -1;
147 g_return_val_if_fail (obj != NULL, atspi_rect_copy (&bbox));
149 accessible = ATSPI_ACCESSIBLE (obj);
150 if (accessible->priv->cache && ctype == ATSPI_COORD_TYPE_SCREEN)
152 GValue *val = g_hash_table_lookup (accessible->priv->cache, "Component.ScreenExtents");
155 return g_value_dup_boxed (val);
159 _atspi_dbus_call (obj, atspi_interface_component, "GetExtents", error, "u=>(iiii)", d_ctype, &bbox);
160 return atspi_rect_copy (&bbox);
164 * atspi_component_get_position:
165 * @obj: a pointer to the #AtspiComponent to query.
166 * @ctype: the desired coordinate system into which to return the results,
167 * (e.g. ATSPI_COORD_TYPE_WINDOW, ATSPI_COORD_TYPE_SCREEN).
169 * Gets the minimum x and y coordinates of the specified #AtspiComponent.
170 * The returned values are meaningful only if the Component has both
171 * STATE_VISIBLE and STATE_SHOWING.
173 * returns: An #AtspiPoint giving the @obj's position.
176 atspi_component_get_position (AtspiComponent *obj,
177 AtspiCoordType ctype, GError **error)
179 dbus_int32_t d_x, d_y;
180 dbus_uint32_t d_ctype = ctype;
186 return atspi_point_copy (&ret);
188 _atspi_dbus_call (obj, atspi_interface_component, "GetPosition", error, "u=>ii", d_ctype, &d_x, &d_y);
192 return atspi_point_copy (&ret);
196 * atspi_component_get_size:
197 * @obj: a pointer to the #AtspiComponent to query.
199 * Gets the size of the specified #AtspiComponent.
200 * The returned values are meaningful only if the Component has both
201 * STATE_VISIBLE and STATE_SHOWING.
203 * returns: An #AtspiPoint giving the @obj's size.
206 atspi_component_get_size (AtspiComponent *obj, GError **error)
208 dbus_int32_t d_w, d_h;
213 return atspi_point_copy (&ret);
215 _atspi_dbus_call (obj, atspi_interface_component, "GetSize", error, "=>ii", &d_w, &d_h);
218 return atspi_point_copy (&ret);
222 * atspi_component_get_layer:
223 * @obj: a pointer to the #AtspiComponent to query.
225 * Queries which layer the component is painted into, to help determine its
226 * visibility in terms of stacking order.
228 * Returns: the #AtspiComponentLayer into which this component is painted.
231 atspi_component_get_layer (AtspiComponent *obj, GError **error)
233 dbus_uint32_t zlayer = -1;
235 _atspi_dbus_call (obj, atspi_interface_component, "GetLayer", error, "=>u", &zlayer);
241 * atspi_component_get_mdi_z_order:
242 * @obj: a pointer to the #AtspiComponent to query.
244 * Queries the z stacking order of a component which is in the MDI or window
245 * layer. (Bigger z-order numbers mean nearer the top)
247 * Returns: a #gshort indicating the stacking order of the component
248 * in the MDI layer, or -1 if the component is not in the MDI layer.
251 atspi_component_get_mdi_z_order (AtspiComponent *obj, GError **error)
253 dbus_uint16_t retval = -1;
255 _atspi_dbus_call (obj, atspi_interface_component, "GetMDIZOrder", error, "=>n", &retval);
261 * atspi_component_grab_focus:
262 * @obj: a pointer to the #AtspiComponent on which to operate.
264 * Attempts to set the keyboard input focus to the specified
267 * Returns: #TRUE if successful, #FALSE otherwise.
271 atspi_component_grab_focus (AtspiComponent *obj, GError **error)
273 dbus_bool_t retval = FALSE;
275 _atspi_dbus_call (obj, atspi_interface_component, "GrabFocus", error, "=>b", &retval);
281 * atspi_component_grab_highlight:
282 * @obj: a pointer to the #AtspiComponent on which to operate.
284 * Attempts to set highlight to the specified
287 * Returns: #TRUE if successful, #FALSE otherwise.
291 atspi_component_grab_highlight (AtspiComponent *obj, GError **error)
293 dbus_bool_t retval = FALSE;
295 _atspi_dbus_call (obj, atspi_interface_component, "GrabHighlight", error, "=>b", &retval);
301 * atspi_component_clear_highlight:
302 * @obj: a pointer to the #AtspiComponent on which to operate.
304 * Attempts to clear highlight on the specified
307 * Returns: #TRUE if successful, #FALSE otherwise.
311 atspi_component_clear_highlight (AtspiComponent *obj, GError **error)
313 dbus_bool_t retval = FALSE;
315 _atspi_dbus_call (obj, atspi_interface_component, "ClearHighlight", error, "=>b", &retval);
321 * atspi_component_get_alpha:
322 * @obj: The #AtspiComponent to be queried.
324 * Gets the opacity/alpha value of a component, if alpha blending is in use.
326 * Returns: the opacity value of a component, as a #gdouble between 0.0 and 1.0.
329 atspi_component_get_alpha (AtspiComponent *obj, GError **error)
333 _atspi_dbus_call (obj, atspi_interface_component, "GetAlpha", error, "=>d", &retval);
339 * atspi_component_set_extents:
340 * @obj: a pointer to the #AtspiComponent to move.
341 * @x: the new vertical position to which the component should be moved.
342 * @y: the new horizontal position to which the component should be moved.
343 * @width: the width to which the component should be resized.
344 * @height: the height to which the component should be resized.
345 * @ctype: the coordinate system in which the position is specified.
346 * (e.g. ATSPI_COORD_TYPE_WINDOW, ATSPI_COORD_TYPE_SCREEN).
348 * Moves and resizes the specified component.
350 * Returns: #TRUE if successful; #FALSE otherwise.
353 atspi_component_set_extents (AtspiComponent *obj,
358 AtspiCoordType ctype,
361 dbus_int32_t d_x = x, d_y = y, d_width = width, d_height = height;
362 dbus_uint32_t d_ctype = ctype;
363 DBusMessageIter iter, iter_struct;
364 DBusMessage *message, *reply;
365 dbus_bool_t retval = FALSE;
366 AtspiAccessible *aobj = ATSPI_ACCESSIBLE (obj);
368 g_return_val_if_fail (obj != NULL, FALSE);
370 if (!aobj->parent.app || !aobj->parent.app->bus_name)
372 g_set_error_literal (error, ATSPI_ERROR, ATSPI_ERROR_APPLICATION_GONE,
373 _("The application no longer exists"));
377 message = dbus_message_new_method_call (aobj->parent.app->bus_name,
379 atspi_interface_component,
384 dbus_message_iter_init_append (message, &iter);
385 if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_STRUCT, NULL, &iter_struct))
387 dbus_message_unref (message);
390 dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &d_x);
391 dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &d_y);
392 dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &d_width);
393 dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &d_height);
394 dbus_message_iter_close_container (&iter, &iter_struct);
395 dbus_message_iter_append_basic (&iter, DBUS_TYPE_UINT32, &d_ctype);
397 reply = _atspi_dbus_send_with_reply_and_block (message, error);
398 dbus_message_get_args (reply, NULL, DBUS_TYPE_BOOLEAN, &retval,
400 dbus_message_unref (reply);
405 * atspi_component_set_position:
406 * @obj: a pointer to the #AtspiComponent to move.
407 * @x: the new vertical position to which the component should be moved.
408 * @y: the new horizontal position to which the component should be moved.
409 * @ctype: the coordinate system in which the position is specified.
410 * (e.g. ATSPI_COORD_TYPE_WINDOW, ATSPI_COORD_TYPE_SCREEN).
412 * Moves the component to the specified position.
414 * Returns: #TRUE if successful; #FALSE otherwise.
417 atspi_component_set_position (AtspiComponent *obj,
420 AtspiCoordType ctype,
423 dbus_int32_t d_x = x, d_y = y;
424 dbus_uint32_t d_ctype = ctype;
425 dbus_bool_t ret = FALSE;
427 g_return_val_if_fail (obj != NULL, FALSE);
429 _atspi_dbus_call (obj, atspi_interface_component, "SetPosition", error,
430 "iiu=>b", d_x, d_y, d_ctype, &ret);
436 * atspi_component_set_size:
437 * @obj: a pointer to the #AtspiComponent to query.
438 * @width: the width to which the component should be resized.
439 * @height: the height to which the component should be resized.
441 * Resizes the specified component to the given coordinates.
443 * Returns: #TRUE if successful; #FALSE otherwise.
446 atspi_component_set_size (AtspiComponent *obj,
451 dbus_int32_t d_width = width, d_height = height;
452 dbus_bool_t ret = FALSE;
454 g_return_val_if_fail (obj != NULL, FALSE);
456 _atspi_dbus_call (obj, atspi_interface_component, "SetSize", error, "ii=>b",
457 d_width, d_height, &ret);
464 * atspi_component_scroll_to:
465 * @obj: a pointer to the #AtspiComponent object on which to operate.
466 * @type: a #AtspiScrollType indicating where the object should be placed on the
469 * Scrolls whatever container of the #AtspiComponent object so it becomes
470 * visible on the screen.
472 * Returns: #TRUE if successful, #FALSE otherwise.
475 atspi_component_scroll_to (AtspiComponent *obj,
476 AtspiScrollType type,
479 dbus_bool_t retval = FALSE;
481 g_return_val_if_fail (obj != NULL, FALSE);
483 _atspi_dbus_call (obj, atspi_interface_component,
484 "ScrollTo", error, "u=>b", type, &retval);
490 * atspi_component_scroll_to_point:
491 * @obj: a pointer to the #AtspiComponent object on which to operate.
492 * @coords: a #AtspiCoordType indicating whether the coordinates are relative to
493 * the screen, to the window, or to the parent object.
494 * @x: the x coordinate of the point to reach
495 * @y: the y coordinate of the point to reach
496 * @error: return location for a #GError
498 * Scrolls whatever container of the #AtspiComponent object so it becomes
499 * visible on the screen at a given position.
501 * Returns: #TRUE if successful, #FALSE otherwise.
504 atspi_component_scroll_to_point (AtspiComponent *obj,
505 AtspiCoordType coords,
510 dbus_bool_t retval = FALSE;
512 g_return_val_if_fail (obj != NULL, FALSE);
514 _atspi_dbus_call (obj, atspi_interface_component,
515 "ScrollToPoint", error, "uii=>b", coords, x, y, &retval);
521 * atspi_component_get_highlight_index
522 * @obj: a pointer to the #AtspiComponent to query.
524 * Returns: highlight index of object if (>0), 0 if highlight index is not set
525 * or -1 if an error occured.
528 atspi_component_get_highlight_index (AtspiComponent *obj, GError **error)
531 g_return_val_if_fail (obj != NULL, -1);
532 _atspi_dbus_get_property (obj, atspi_interface_component,
533 "HighlightIndex", error, "i", &ret);
538 atspi_component_base_init (AtspiComponent *klass)
543 atspi_component_get_type (void)
545 static GType type = 0;
548 static const GTypeInfo tinfo =
550 sizeof (AtspiComponent),
551 (GBaseInitFunc) atspi_component_base_init,
552 (GBaseFinalizeFunc) NULL,
555 type = g_type_register_static (G_TYPE_INTERFACE, "AtspiComponent", &tinfo, 0);