2 * AT-SPI - Assistive Technology Service Provider Interface
3 * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
5 * Copyright 2001 Sun Microsystems Inc.
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Library General Public License for more details.
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
24 #include "../cspi/spi-private.h" /* A hack for now */
26 static void traverse_accessible_tree (Accessible *accessible);
28 static void report_event (const AccessibleEvent *event, void *user_data);
29 static void report_detail_event (const AccessibleEvent *event, void *user_data);
30 static void timing_test_event (const AccessibleEvent *event, void *user_data);
32 static AccessibleEventListener *generic_listener;
33 static AccessibleEventListener *specific_listener;
34 static AccessibleEventListener *test_listener;
35 static gint n_elements_traversed = 0;
39 main (int argc, char **argv)
47 Accessible *application;
52 generic_listener = SPI_createAccessibleEventListener (
54 specific_listener = SPI_createAccessibleEventListener (
55 report_detail_event, NULL);
56 test_listener = SPI_createAccessibleEventListener (
57 timing_test_event, NULL);
59 SPI_registerGlobalEventListener (generic_listener,
61 SPI_registerGlobalEventListener (specific_listener,
63 SPI_registerGlobalEventListener (specific_listener,
65 SPI_registerGlobalEventListener (specific_listener,
67 SPI_registerGlobalEventListener (generic_listener,
68 "object:property-change");
69 SPI_registerGlobalEventListener (specific_listener,
70 "object:property-change:accessible-name");
71 SPI_registerGlobalEventListener (generic_listener,
72 "object:state-changed");
73 SPI_registerGlobalEventListener (specific_listener,
74 "object:state-changed:focused");
75 SPI_registerGlobalEventListener (generic_listener,
76 "object:selection-changed");
77 SPI_registerGlobalEventListener (generic_listener,
78 "object:children-changed");
79 SPI_registerGlobalEventListener (specific_listener,
80 "object:children-changed:add");
81 SPI_registerGlobalEventListener (generic_listener,
82 "object:visible-data-changed");
83 SPI_registerGlobalEventListener (generic_listener,
84 "object:text-selection-changed");
86 SPI_registerGlobalEventListener (generic_listener,
87 "object:text-caret-moved");
88 SPI_registerGlobalEventListener (generic_listener,
89 "object:text-changed");
90 SPI_registerGlobalEventListener (generic_listener,
91 "object:column-inserted");
92 SPI_registerGlobalEventListener (generic_listener,
93 "object:row-inserted");
94 SPI_registerGlobalEventListener (generic_listener,
95 "object:column-reordered");
96 SPI_registerGlobalEventListener (generic_listener,
97 "object:row-reordered");
98 SPI_registerGlobalEventListener (generic_listener,
99 "object:column-deleted");
100 SPI_registerGlobalEventListener (generic_listener,
101 "object:row-deleted");
102 SPI_registerGlobalEventListener (generic_listener,
103 "object:model-changed");
104 SPI_registerGlobalEventListener (generic_listener,
106 SPI_registerGlobalEventListener (generic_listener,
108 SPI_registerGlobalEventListener (generic_listener,
110 SPI_registerGlobalEventListener (generic_listener,
112 SPI_registerGlobalEventListener (generic_listener,
113 "window:deactivate");
114 SPI_registerGlobalEventListener (generic_listener,
116 SPI_registerGlobalEventListener (generic_listener,
118 SPI_registerGlobalEventListener (generic_listener,
120 SPI_registerGlobalEventListener (generic_listener,
122 SPI_registerGlobalEventListener (generic_listener,
124 SPI_registerGlobalEventListener (generic_listener,
126 SPI_registerGlobalEventListener (test_listener,
128 #ifdef NOT_YET_IMPLEMENTED
129 /* event below possibly should just be property change? */
130 SPI_registerGlobalEventListener (generic_listener,
132 SPI_registerGlobalEventListener (generic_listener,
133 "window:desktop-create");
134 SPI_registerGlobalEventListener (generic_listener,
135 "window:desktop-destroy");
138 timer = g_timer_new ();
139 traverse_accessible_tree (SPI_getDesktop (0));
140 g_print ("Time for first traversal of %d elements: %lf\n",
141 n_elements_traversed,
142 g_timer_elapsed (timer, NULL));
143 g_timer_start (timer);
144 traverse_accessible_tree (SPI_getDesktop (0));
145 g_timer_stop (timer);
146 g_print ("Time for subsequent traversal %f\n", g_timer_elapsed (timer, NULL));
147 g_print ("[%f elements/sec, %f SPI calls/sec]\n",
148 n_elements_traversed/g_timer_elapsed(timer, NULL),
149 (n_elements_traversed*8+1)/g_timer_elapsed(timer, NULL));
150 g_timer_reset (timer);
153 putenv ("AT_BRIDGE_SHUTDOWN=1");
156 * TODO: Add a key event listener that calls test_exit, to
157 * deregister and cleanup appropriately.
164 traverse_accessible_tree (Accessible *accessible)
172 n_elements_traversed++;
173 name = Accessible_getName (accessible);
174 role_name = Accessible_getRoleName (accessible);
176 fprintf (stdout, "[%s] \"%s\"\n",
179 SPI_freeString (name);
180 SPI_freeString (role_name);
181 n_children = Accessible_getChildCount (accessible);
182 if (!Accessible_isTable (accessible))
184 for (i = 0; i < n_children; ++i)
186 child = Accessible_getChildAtIndex (accessible, i);
187 traverse_accessible_tree (child);
188 Accessible_unref (child);
194 report_event (const AccessibleEvent *event, void *user_data)
196 static long count = 0;
197 char *s = Accessible_getName (event->source);
198 fprintf (stderr, "%s %s\n", event->type, s);
199 if (s) SPI_freeString (s);
201 g_timer_reset (timer);
202 g_timer_start (timer);
205 if ((count % 100) == 0) {
206 g_print ("%d events received, %f events/sec\n",
208 count/g_timer_elapsed(timer, NULL));
213 report_detail_event (const AccessibleEvent *event, void *user_data)
215 char *s = Accessible_getName (event->source);
216 fprintf (stderr, "(detail) %s %s %d %d\n", event->type, s,
217 event->detail1, event->detail2);
218 if (s) SPI_freeString (s);
222 timing_test_event (const AccessibleEvent *event, void *user_data)
224 static long count = 0;
225 if (count == 0) g_timer_start (timer);
227 if ((count % 500) == 0) {
228 g_print ("%d events received, %f events/sec\n",
230 count/g_timer_elapsed(timer, NULL));
237 SPI_deregisterGlobalEventListenerAll (generic_listener);
238 AccessibleEventListener_unref (generic_listener);
239 SPI_deregisterGlobalEventListenerAll (specific_listener);
240 AccessibleEventListener_unref (specific_listener);