2 * AT-SPI - Assistive Technology Service Provider Interface
3 * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
5 * Copyright 2001, 2002, 2003 Sun Microsystems Inc.,
6 * Copyright 2001, 2002, 2003 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.
26 #include "../cspi/spi-private.h" /* A hack for now */
28 static void traverse_accessible_tree (Accessible *accessible);
30 static void report_event (const AccessibleEvent *event, void *user_data);
31 static void report_detail_event (const AccessibleEvent *event, void *user_data);
32 static void report_detail1_event (const AccessibleEvent *event, void *user_data);
33 static void report_text_event (const AccessibleEvent *event, void *user_data);
34 static void report_children_changed_event (const AccessibleEvent *event, void *user_data);
35 static void timing_test_event (const AccessibleEvent *event, void *user_data);
36 static SPIBoolean report_mouse_event (const AccessibleDeviceEvent *event, void *user_data);
38 static AccessibleEventListener *generic_listener;
39 static AccessibleEventListener *specific_listener;
40 static AccessibleEventListener *detail1_listener;
41 static AccessibleEventListener *test_listener;
42 static AccessibleEventListener *text_listener;
43 static AccessibleEventListener *children_changed_listener;
44 static AccessibleDeviceListener *mouse_device_listener;
45 static gint n_elements_traversed = 0;
48 static gboolean report_mouse_events = TRUE;
51 usage_and_exit( void )
53 g_print("\nUsage: event-listener-test [-h] [-m]\n");
54 g_print(" -h : prints this usage message.\n");
55 g_print(" -m : disable mouse event reporting.\n\n");
61 main (int argc, char **argv)
69 Accessible *application;
72 /* Parse Command-line */
74 while ( ( c = getopt( argc, argv, "hm")) != EOF ) {
77 report_mouse_events = FALSE;
84 if ( optind < argc ) {
89 fprintf (stderr, "RUNNING\n");
93 generic_listener = SPI_createAccessibleEventListener (
95 specific_listener = SPI_createAccessibleEventListener (
96 report_detail_event, NULL);
97 text_listener = SPI_createAccessibleEventListener (
98 report_text_event, NULL);
99 children_changed_listener = SPI_createAccessibleEventListener (
100 report_children_changed_event, NULL);
101 test_listener = SPI_createAccessibleEventListener (
102 timing_test_event, NULL);
103 mouse_device_listener = SPI_createAccessibleDeviceListener (
104 report_mouse_event, NULL);
105 detail1_listener = SPI_createAccessibleEventListener (
106 report_detail1_event, NULL);
108 SPI_registerGlobalEventListener (generic_listener,
110 if ( report_mouse_events ) {
111 SPI_registerGlobalEventListener (specific_listener,
113 SPI_registerGlobalEventListener (specific_listener,
115 SPI_registerGlobalEventListener (specific_listener,
118 SPI_registerDeviceEventListener (mouse_device_listener,
119 SPI_BUTTON_PRESSED | SPI_BUTTON_RELEASED,
121 SPI_registerGlobalEventListener (specific_listener,
122 "keyboard:modifiers");
123 SPI_registerGlobalEventListener (generic_listener,
124 "object:property-change");
125 /* SPI_registerGlobalEventListener (specific_listener,
126 "object:property-change:accessible-name");*/
127 SPI_registerGlobalEventListener (generic_listener,
128 "object:state-changed");
129 /* SPI_registerGlobalEventListener (specific_listener,
130 "object:state-changed:focused"); */
131 SPI_registerGlobalEventListener (generic_listener,
132 "object:selection-changed");
133 SPI_registerGlobalEventListener (children_changed_listener,
134 "object:children-changed");
135 SPI_registerGlobalEventListener (generic_listener,
136 "object:active-descendant");
137 SPI_registerGlobalEventListener (generic_listener,
138 "object:visible-data-changed");
139 SPI_registerGlobalEventListener (generic_listener,
140 "object:text-selection-changed");
142 SPI_registerGlobalEventListener (generic_listener,
143 "object:text-caret-moved");
144 SPI_registerGlobalEventListener (text_listener,
145 "object:text-changed");
146 SPI_registerGlobalEventListener (generic_listener,
147 "object:column-inserted");
148 SPI_registerGlobalEventListener (generic_listener,
149 "object:row-inserted");
150 SPI_registerGlobalEventListener (generic_listener,
151 "object:column-reordered");
152 SPI_registerGlobalEventListener (generic_listener,
153 "object:row-reordered");
154 SPI_registerGlobalEventListener (generic_listener,
155 "object:column-deleted");
156 SPI_registerGlobalEventListener (generic_listener,
157 "object:row-deleted");
158 SPI_registerGlobalEventListener (generic_listener,
159 "object:model-changed");
160 SPI_registerGlobalEventListener (detail1_listener,
161 "object:link-selected");
162 SPI_registerGlobalEventListener (generic_listener,
164 SPI_registerGlobalEventListener (generic_listener,
166 SPI_registerGlobalEventListener (generic_listener,
168 SPI_registerGlobalEventListener (generic_listener,
170 SPI_registerGlobalEventListener (generic_listener,
171 "window:deactivate");
172 SPI_registerGlobalEventListener (generic_listener,
174 SPI_registerGlobalEventListener (generic_listener,
176 SPI_registerGlobalEventListener (generic_listener,
178 SPI_registerGlobalEventListener (generic_listener,
180 SPI_registerGlobalEventListener (generic_listener,
182 SPI_registerGlobalEventListener (generic_listener,
184 SPI_registerGlobalEventListener (test_listener,
186 #ifdef NOT_YET_IMPLEMENTED
187 /* event below possibly should just be property change? */
188 SPI_registerGlobalEventListener (generic_listener,
190 SPI_registerGlobalEventListener (generic_listener,
191 "window:desktop-create");
192 SPI_registerGlobalEventListener (generic_listener,
193 "window:desktop-destroy");
196 timer = g_timer_new ();
197 traverse_accessible_tree (SPI_getDesktop (0));
198 g_print ("Time for first traversal of %d elements: %lf\n",
199 n_elements_traversed,
200 g_timer_elapsed (timer, NULL));
201 g_timer_start (timer);
202 traverse_accessible_tree (SPI_getDesktop (0));
203 g_timer_stop (timer);
204 g_print ("Time for subsequent traversal %f\n", g_timer_elapsed (timer, NULL));
205 g_print ("[%f elements/sec, %f SPI calls/sec]\n",
206 n_elements_traversed/g_timer_elapsed(timer, NULL),
207 (n_elements_traversed*8+1)/g_timer_elapsed(timer, NULL));
208 g_timer_reset (timer);
211 putenv ("AT_BRIDGE_SHUTDOWN=1");
214 * TODO: Add a key event listener that calls test_exit, to
215 * deregister and cleanup appropriately.
222 traverse_accessible_tree (Accessible *accessible)
230 n_elements_traversed++;
231 name = Accessible_getName (accessible);
232 role_name = Accessible_getRoleName (accessible);
234 fprintf (stdout, "[%s] \"%s\"\n",
237 SPI_freeString (name);
238 SPI_freeString (role_name);
239 n_children = Accessible_getChildCount (accessible);
240 if (!Accessible_isTable (accessible))
242 for (i = 0; i < n_children; ++i)
244 child = Accessible_getChildAtIndex (accessible, i);
245 traverse_accessible_tree (child);
246 Accessible_unref (child);
252 report_event (const AccessibleEvent *event, void *user_data)
254 static long count = 0;
255 char *s = Accessible_getName (event->source);
256 fprintf (stderr, "%s %s\n", event->type, s);
257 if (s) SPI_freeString (s);
259 g_timer_reset (timer);
260 g_timer_start (timer);
263 if ((count % 100) == 0) {
264 g_print ("%d events received, %f events/sec\n",
266 count/g_timer_elapsed(timer, NULL));
271 report_detail_event (const AccessibleEvent *event, void *user_data)
273 char *s = Accessible_getName (event->source);
274 fprintf (stderr, "(detail) %s %s %d %d\n", event->type, s,
275 event->detail1, event->detail2);
276 if (s) SPI_freeString (s);
280 report_detail1_event (const AccessibleEvent *event, void *user_data)
282 char *s = Accessible_getName (event->source);
283 fprintf (stderr, "(detail) %s %s %d\n", event->type, s,
285 if (s) SPI_freeString (s);
289 report_text_event (const AccessibleEvent *event, void *user_data)
291 char *s = Accessible_getName (event->source);
292 fprintf (stderr, "(detail) %s %s %d %d\n", event->type, s,
293 event->detail1, event->detail2);
295 s = AccessibleTextChangedEvent_getChangeString (event);
296 fprintf (stderr, "context string %s\n", (s) ? s : "<nil>");
301 report_children_changed_event (const AccessibleEvent *event, void *user_data)
303 char *s = Accessible_getName (event->source);
307 ao = AccessibleChildChangedEvent_getChildAccessible (event);
308 s1 = Accessible_getName (ao);
309 fprintf (stderr, "(detail) %s parent: %s child: %s %d %d\n", event->type,
310 s ? s : "<null>", s1 ? s1 : "<null>",
311 event->detail1, event->detail2);
314 Accessible_unref (ao);
318 report_mouse_event (const AccessibleDeviceEvent *event, void *user_data)
320 fprintf (stderr, "mouse event %ld %d %x %x\n",
322 (int) event->keycode,
323 (unsigned) event->type,
324 (unsigned) event->modifiers);
329 timing_test_event (const AccessibleEvent *event, void *user_data)
331 static long count = 0;
332 if (count == 0) g_timer_start (timer);
334 if ((count % 500) == 0) {
335 g_print ("%d events received, %f events/sec\n",
337 count/g_timer_elapsed(timer, NULL));
344 SPI_deregisterGlobalEventListenerAll (generic_listener);
345 AccessibleEventListener_unref (generic_listener);
346 SPI_deregisterGlobalEventListenerAll (specific_listener);
347 AccessibleEventListener_unref (specific_listener);