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.
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 timing_test_event (const AccessibleEvent *event, void *user_data);
34 static AccessibleEventListener *generic_listener;
35 static AccessibleEventListener *specific_listener;
36 static AccessibleEventListener *test_listener;
37 static gint n_elements_traversed = 0;
40 static gboolean report_mouse_events = TRUE;
43 usage_and_exit( void )
45 g_print("\nUsage: event-listener-test [-h] [-m]\n");
46 g_print(" -h : prints this usage message.\n");
47 g_print(" -m : disable mouse event reporting.\n\n");
53 main (int argc, char **argv)
61 Accessible *application;
64 /* Parse Command-line */
66 while ( ( c = getopt( argc, argv, "hm")) != EOF ) {
69 report_mouse_events = FALSE;
76 if ( optind < argc ) {
83 generic_listener = SPI_createAccessibleEventListener (
85 specific_listener = SPI_createAccessibleEventListener (
86 report_detail_event, NULL);
87 test_listener = SPI_createAccessibleEventListener (
88 timing_test_event, NULL);
90 SPI_registerGlobalEventListener (generic_listener,
92 if ( report_mouse_events ) {
93 SPI_registerGlobalEventListener (specific_listener,
95 SPI_registerGlobalEventListener (specific_listener,
97 SPI_registerGlobalEventListener (specific_listener,
100 SPI_registerGlobalEventListener (specific_listener,
101 "keyboard:modifiers");
102 SPI_registerGlobalEventListener (generic_listener,
103 "object:property-change");
104 /* SPI_registerGlobalEventListener (specific_listener,
105 "object:property-change:accessible-name");*/
106 SPI_registerGlobalEventListener (generic_listener,
107 "object:state-changed");
108 /* SPI_registerGlobalEventListener (specific_listener,
109 "object:state-changed:focused"); */
110 SPI_registerGlobalEventListener (generic_listener,
111 "object:selection-changed");
112 SPI_registerGlobalEventListener (generic_listener,
113 "object:children-changed");
114 /* SPI_registerGlobalEventListener (specific_listener,
115 "object:children-changed:add"); */
116 SPI_registerGlobalEventListener (generic_listener,
117 "object:active-descendant");
118 SPI_registerGlobalEventListener (generic_listener,
119 "object:visible-data-changed");
120 SPI_registerGlobalEventListener (generic_listener,
121 "object:text-selection-changed");
123 SPI_registerGlobalEventListener (generic_listener,
124 "object:text-caret-moved");
125 SPI_registerGlobalEventListener (generic_listener,
126 "object:text-changed");
127 SPI_registerGlobalEventListener (generic_listener,
128 "object:column-inserted");
129 SPI_registerGlobalEventListener (generic_listener,
130 "object:row-inserted");
131 SPI_registerGlobalEventListener (generic_listener,
132 "object:column-reordered");
133 SPI_registerGlobalEventListener (generic_listener,
134 "object:row-reordered");
135 SPI_registerGlobalEventListener (generic_listener,
136 "object:column-deleted");
137 SPI_registerGlobalEventListener (generic_listener,
138 "object:row-deleted");
139 SPI_registerGlobalEventListener (generic_listener,
140 "object:model-changed");
141 SPI_registerGlobalEventListener (generic_listener,
143 SPI_registerGlobalEventListener (generic_listener,
145 SPI_registerGlobalEventListener (generic_listener,
147 SPI_registerGlobalEventListener (generic_listener,
149 SPI_registerGlobalEventListener (generic_listener,
150 "window:deactivate");
151 SPI_registerGlobalEventListener (generic_listener,
153 SPI_registerGlobalEventListener (generic_listener,
155 SPI_registerGlobalEventListener (generic_listener,
157 SPI_registerGlobalEventListener (generic_listener,
159 SPI_registerGlobalEventListener (generic_listener,
161 SPI_registerGlobalEventListener (generic_listener,
163 SPI_registerGlobalEventListener (test_listener,
165 #ifdef NOT_YET_IMPLEMENTED
166 /* event below possibly should just be property change? */
167 SPI_registerGlobalEventListener (generic_listener,
169 SPI_registerGlobalEventListener (generic_listener,
170 "window:desktop-create");
171 SPI_registerGlobalEventListener (generic_listener,
172 "window:desktop-destroy");
175 timer = g_timer_new ();
176 traverse_accessible_tree (SPI_getDesktop (0));
177 g_print ("Time for first traversal of %d elements: %lf\n",
178 n_elements_traversed,
179 g_timer_elapsed (timer, NULL));
180 g_timer_start (timer);
181 traverse_accessible_tree (SPI_getDesktop (0));
182 g_timer_stop (timer);
183 g_print ("Time for subsequent traversal %f\n", g_timer_elapsed (timer, NULL));
184 g_print ("[%f elements/sec, %f SPI calls/sec]\n",
185 n_elements_traversed/g_timer_elapsed(timer, NULL),
186 (n_elements_traversed*8+1)/g_timer_elapsed(timer, NULL));
187 g_timer_reset (timer);
190 putenv ("AT_BRIDGE_SHUTDOWN=1");
193 * TODO: Add a key event listener that calls test_exit, to
194 * deregister and cleanup appropriately.
201 traverse_accessible_tree (Accessible *accessible)
209 n_elements_traversed++;
210 name = Accessible_getName (accessible);
211 role_name = Accessible_getRoleName (accessible);
213 fprintf (stdout, "[%s] \"%s\"\n",
216 SPI_freeString (name);
217 SPI_freeString (role_name);
218 n_children = Accessible_getChildCount (accessible);
219 if (!Accessible_isTable (accessible))
221 for (i = 0; i < n_children; ++i)
223 child = Accessible_getChildAtIndex (accessible, i);
224 traverse_accessible_tree (child);
225 Accessible_unref (child);
231 report_event (const AccessibleEvent *event, void *user_data)
233 static long count = 0;
234 char *s = Accessible_getName (event->source);
235 fprintf (stderr, "%s %s\n", event->type, s);
236 if (s) SPI_freeString (s);
238 g_timer_reset (timer);
239 g_timer_start (timer);
242 if ((count % 100) == 0) {
243 g_print ("%d events received, %f events/sec\n",
245 count/g_timer_elapsed(timer, NULL));
250 report_detail_event (const AccessibleEvent *event, void *user_data)
252 char *s = Accessible_getName (event->source);
253 fprintf (stderr, "(detail) %s %s %d %d\n", event->type, s,
254 event->detail1, event->detail2);
255 if (s) SPI_freeString (s);
259 timing_test_event (const AccessibleEvent *event, void *user_data)
261 static long count = 0;
262 if (count == 0) g_timer_start (timer);
264 if ((count % 500) == 0) {
265 g_print ("%d events received, %f events/sec\n",
267 count/g_timer_elapsed(timer, NULL));
274 SPI_deregisterGlobalEventListenerAll (generic_listener);
275 AccessibleEventListener_unref (generic_listener);
276 SPI_deregisterGlobalEventListenerAll (specific_listener);
277 AccessibleEventListener_unref (specific_listener);