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 Library General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 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 * Library General Public License for more details.
18 * You should have received a copy of the GNU Library General Public
19 * License along with this library; if not, write to the
20 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 * Boston, MA 02111-1307, USA.
24 /* atspi_registry.c: Global functions wrapping the registry */
26 #include "atspi-private.h"
29 * atspi_get_desktop_count:
31 * Get the number of virtual desktops.
32 * NOTE: currently multiple virtual desktops are not implemented, this
33 * function always returns '1'.
35 * Returns: an integer indicating the number of active virtual desktops.
38 atspi_get_desktop_count ()
45 * @i: an integer indicating which of the accessible desktops is to be returned.
47 * Get the virtual desktop indicated by index @i.
48 * NOTE: currently multiple virtual desktops are not implemented.
50 * Returns: (transfer full): a pointer to the 'i-th' virtual desktop's
51 * #AtspiAccessible representation.
54 atspi_get_desktop (gint i)
56 if (i != 0) return NULL;
57 return _atspi_ref_accessible (atspi_bus_registry, atspi_path_root);
61 * atspi_get_desktop_list:
63 * Get the list of virtual desktops. On return, @list will point
64 * to a newly-created, NULL terminated array of virtual desktop
66 * It is the responsibility of the caller to free this array when
67 * it is no longer needed.
69 * Not Yet Implemented : this implementation always returns a single
70 * #Accessible desktop.
72 * Returns: (transfer full): a #GArray of desktops.
75 atspi_get_desktop_list ()
77 GArray *array = g_array_new (TRUE, TRUE, sizeof (AtspiAccessible *));
78 AtspiAccessible *desktop;
80 desktop = _atspi_ref_accessible (atspi_bus_registry, atspi_path_root);
82 g_array_index (array, AtspiAccessible *, 0) = desktop;
87 * atspi_register_keystroke_listener:
88 * @listener: a pointer to the #AtspiDeviceListener for which
89 * keystroke events are requested.
90 * @key_set: (element-type AtspiKeyDefinition) (allow-none): a pointer to the
91 * #AtspiKeyDefinition array indicating which keystroke events are
93 * to indicate that all keycodes and keyvals for the specified
94 * modifier set are to be included.
95 * @modmask: an #AtspiKeyMaskType mask indicating which
96 * key event modifiers must be set in combination with @keys,
97 * events will only be reported for key events for which all
98 * modifiers in @modmask are set. If you wish to listen for
99 * events with multiple modifier combinations you must call
100 * register_keystroke_listener() once for each
102 * @event_types: an #AtspiKeyMaskType mask indicating which
103 * types of key events are requested (#ATSPI_KEY_PRESSED, etc.).
104 * @sync_type: a #AtspiKeyListenerSyncType parameter indicating
105 * the behavior of the notification/listener transaction.
107 * Register a listener for keystroke events, either pre-emptively for
108 * all windows (ATSPI_KEYLISTENER_ALL_WINDOWS),
109 * non-preemptively (ATSPI_KEYLISTENER_NOSYNC), or
110 * pre-emptively at the toolkit level (ATSPI_KEYLISTENER_CANCONSUME).
111 * If ALL_WINDOWS or CANCONSUME are used, the event is consumed
112 * upon receipt if one of @listener's callbacks returns #TRUE.
113 * ( Other sync_type values may be available in the future )
115 * Returns: #TRUE if successful, otherwise #FALSE.
118 atspi_register_keystroke_listener (AtspiDeviceListener *listener,
120 AtspiKeyMaskType modmask,
121 AtspiKeyEventMask event_types,
122 gint sync_type, GError **error)
125 gchar *path = _atspi_device_listener_get_path (listener);
127 dbus_uint32_t d_modmask = modmask;
128 dbus_uint32_t d_event_types = event_types;
129 AtspiEventListenerMode listener_mode;
130 gboolean retval = FALSE;
138 /* copy the keyval filter values from the C api into the DBind KeySet */
141 d_key_set = g_array_sized_new (FALSE, TRUE, sizeof (AtspiKeyDefinition), key_set->len);
142 d_key_set->len = key_set->len;
143 for (i = 0; i < key_set->len; ++i)
145 AtspiKeyDefinition *kd = ((AtspiKeyDefinition *) key_set->data) + i;
146 AtspiKeyDefinition *d_kd = ((AtspiKeyDefinition *) d_key_set->data) + i;
147 d_kd->keycode = kd->keycode;
148 d_kd->keysym = kd->keysym;
151 d_kd->keystring = kd->keystring;
155 d_kd->keystring = "";
161 d_key_set = g_array_sized_new (FALSE, TRUE, sizeof (AtspiKeyDefinition), 0);
164 listener_mode.synchronous =
165 (dbus_bool_t) ((sync_type & ATSPI_KEYLISTENER_SYNCHRONOUS)!=0);
166 listener_mode.preemptive =
167 (dbus_bool_t) ((sync_type & ATSPI_KEYLISTENER_CANCONSUME)!=0);
168 listener_mode.global =
169 (dbus_bool_t) ((sync_type & ATSPI_KEYLISTENER_ALL_WINDOWS)!=0);
171 dbus_error_init (&d_error);
172 dbind_method_call_reentrant (_atspi_bus(), atspi_bus_registry, atspi_path_dec, atspi_interface_dec, "RegisterKeystrokeListener", &d_error, "oa(iisi)uu(bbb)=>b", path, d_key_set, d_modmask, d_event_types, &listener_mode, &retval);
174 g_array_free (d_key_set, TRUE);
181 * atspi_deregister_keystroke_listener:
182 * @listener: a pointer to the #AtspiDeviceListener for which
183 * keystroke events are requested.
184 * @key_set: (element-type AtspiKeyDefinition) (allow-none): a pointer to the
185 * #AtspiKeyDefinition array indicating which keystroke events are
186 * requested, or %NULL
187 * to indicate that all keycodes and keyvals for the specified
188 * modifier set are to be included.
189 * @modmask: the key modifier mask for which this listener is to be
190 * 'deregistered' (of type #AtspiKeyMaskType).
191 * @event_types: an #AtspiKeyMaskType mask indicating which
192 * types of key events were requested (#ATSPI_KEY_PRESSED, etc.).
194 * Removes a keystroke event listener from the registry's listener queue,
195 * ceasing notification of events with modifiers matching @modmask.
197 * Returns: #TRUE if successful, otherwise #FALSE.
200 atspi_deregister_keystroke_listener (AtspiDeviceListener *listener,
202 AtspiKeyMaskType modmask,
203 AtspiKeyEventMask event_types,
206 gchar *path = _atspi_device_listener_get_path (listener);
207 dbus_uint32_t d_modmask = modmask;
208 dbus_uint32_t d_event_types = event_types;
211 dbus_error_init (&d_error);
217 dbind_method_call_reentrant (_atspi_bus(), atspi_bus_registry,
218 atspi_path_dec, atspi_interface_dec,
219 "DeregisterKeystrokeListener", &d_error,
220 "oa(iisi)uu", path, &key_set, d_modmask,
227 * atspi_register_device_event_listener:
228 * @listener: a pointer to the #AtspiDeviceListener which requests
230 * @event_types: an #AtspiDeviceEventMask mask indicating which
231 * types of key events are requested (#ATSPI_KEY_PRESSED, etc.).
232 * @filter: Unused parameter.
234 * Register a listener for device events, for instance button events.
236 * Returns: #TRUE if successful, otherwise #FALSE.
239 atspi_register_device_event_listener (AtspiDeviceListener *listener,
240 AtspiDeviceEventMask event_types,
241 void *filter, GError **error)
243 gboolean retval = FALSE;
244 dbus_uint32_t d_event_types = event_types;
245 gchar *path = _atspi_device_listener_get_path (listener);
248 dbus_error_init (&d_error);
254 dbind_method_call_reentrant (_atspi_bus(), atspi_bus_registry, atspi_path_dec, atspi_interface_dec, "RegisterDeviceEventListener", &d_error, "ou=>b", path, d_event_types, &retval);
260 * atspi_deregister_device_event_listener:
261 * @listener: a pointer to the #AtspiDeviceListener for which
262 * device events are requested.
263 * @filter: Unused parameter.
265 * Removes a device event listener from the registry's listener queue,
266 * ceasing notification of events of the specified type.
268 * Returns: #TRUE if successful, otherwise #FALSE.
271 atspi_deregister_device_event_listener (AtspiDeviceListener *listener,
272 void *filter, GError **error)
274 dbus_uint32_t event_types = 0;
275 gchar *path = _atspi_device_listener_get_path (listener);
278 dbus_error_init (&d_error);
285 event_types |= (1 << ATSPI_BUTTON_PRESSED_EVENT);
286 event_types |= (1 << ATSPI_BUTTON_RELEASED_EVENT);
288 dbind_method_call_reentrant (_atspi_bus(), atspi_bus_registry, atspi_path_dec, atspi_interface_dec, "DeregisterDeviceEventListener", &d_error, "ou", path, event_types);
294 * atspi_generate_keyboard_event:
295 * @keyval: a long integer indicating the keycode or keysym of the key event
297 * @keystring: an (optional) UTF-8 string which, if @keyval is NULL,
298 * indicates a 'composed' keyboard input string which is
299 * being synthesized; this type of keyboard event synthesis does
300 * not emulate hardware keypresses but injects the string
301 * as though a composing input method (such as XIM) were used.
302 * @synth_type: a #AtspiKeySynthType flag indicating whether @keyval
303 * is to be interpreted as a keysym rather than a keycode
304 * (ATSPI_KEYSYM), or whether to synthesize
305 * ATSPI_KEY_PRESS, ATSPI_KEY_RELEASE, or both (ATSPI_KEY_PRESSRELEASE).
307 * Synthesize a keyboard event (as if a hardware keyboard event occurred in the
308 * current UI context).
310 * Returns: #TRUE if successful, otherwise #FALSE.
313 atspi_generate_keyboard_event (glong keyval,
314 const gchar *keystring,
315 AtspiKeySynthType synth_type, GError **error)
317 dbus_uint32_t d_synth_type = synth_type;
318 dbus_int32_t d_keyval = keyval;
321 dbus_error_init (&d_error);
322 if (!keystring) keystring = "";
323 dbind_method_call_reentrant (_atspi_bus(), atspi_bus_registry, atspi_path_dec, atspi_interface_dec, "GenerateKeyboardEvent", &d_error, "isu", d_keyval, keystring, d_synth_type);
329 * atspi_generate_mouse_event:
330 * @x: a #long indicating the screen x coordinate of the mouse event.
331 * @y: a #long indicating the screen y coordinate of the mouse event.
332 * @name: a string indicating which mouse event to be synthesized
333 * (e.g. "b1p", "b1c", "b2r", "rel", "abs").
335 * Synthesize a mouse event at a specific screen coordinate.
336 * Most AT clients should use the #AccessibleAction interface when
337 * tempted to generate mouse events, rather than this method.
338 * Event names: b1p = button 1 press; b2r = button 2 release;
339 * b3c = button 3 click; b2d = button 2 double-click;
340 * abs = absolute motion; rel = relative motion.
342 * Returns: #TRUE if successful, otherwise #FALSE.
345 atspi_generate_mouse_event (glong x, glong y, const gchar *name, GError **error)
347 dbus_int32_t d_x = x, d_y = y;
350 dbus_error_init (&d_error);
351 dbind_method_call_reentrant (_atspi_bus(), atspi_bus_registry,
352 atspi_path_dec, atspi_interface_dec,
353 "GenerateMouseEvent", &d_error, "iis",
359 atspi_key_definition_copy (AtspiKeyDefinition *src)
361 AtspiKeyDefinition *dst;
363 dst = g_new0 (AtspiKeyDefinition, 1);
366 dst->keycode = src->keycode;
367 dst->keysym = src->keysym;
369 dst->keystring = g_strdup (src->keystring);
370 dst->unused = src->unused;
375 atspi_key_definition_free (AtspiKeyDefinition *kd)
378 g_free (kd->keystring);
382 G_DEFINE_BOXED_TYPE (AtspiKeyDefinition, atspi_key_definition, atspi_key_definition_copy, atspi_key_definition_free)