Fixes for #93592 and #94540.
[platform/core/uifw/at-spi2-atk.git] / test / event-listener-test.c
1 /*
2  * AT-SPI - Assistive Technology Service Provider Interface
3  * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
4  *
5  * Copyright 2001, 2002 Sun Microsystems Inc.,
6  * Copyright 2001, 2002 Ximian, Inc.
7  *
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.
12  *
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.
17  *
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.
22  */
23
24 #include <stdlib.h>
25 #include <unistd.h>
26 #include "../cspi/spi-private.h" /* A hack for now */
27
28 static void traverse_accessible_tree (Accessible *accessible);
29
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);
33
34 static AccessibleEventListener *generic_listener;
35 static AccessibleEventListener *specific_listener;
36 static AccessibleEventListener *test_listener;
37 static gint n_elements_traversed = 0;
38 static GTimer *timer;
39
40 static gboolean report_mouse_events = TRUE;
41
42 void 
43 usage_and_exit( void )
44 {
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");
48
49   exit( 1 );
50 }
51
52 int
53 main (int argc, char **argv)
54 {
55   int i, j, c;
56   int n_desktops;
57   int n_apps;
58   char *s;
59   gdouble elapsed_time;
60   Accessible *desktop;
61   Accessible *application;
62   const char *modules;
63
64   /* Parse Command-line */
65   if ( argc > 1 ) {
66       while ( ( c = getopt( argc, argv, "hm")) != EOF ) {
67           switch( c ) {
68               case 'm':
69                   report_mouse_events = FALSE;
70                   break;
71               default:
72                   usage_and_exit();
73                   break;
74           }
75       }
76       if ( optind < argc ) {
77           usage_and_exit();
78       }
79   }
80
81   SPI_init ();
82
83   generic_listener = SPI_createAccessibleEventListener (
84           report_event, NULL); 
85   specific_listener = SPI_createAccessibleEventListener (
86           report_detail_event, NULL); 
87   test_listener = SPI_createAccessibleEventListener (
88           timing_test_event, NULL);
89
90   SPI_registerGlobalEventListener (generic_listener,
91                                    "focus:");
92   if ( report_mouse_events ) {
93       SPI_registerGlobalEventListener (specific_listener,
94                                        "mouse:rel");
95       SPI_registerGlobalEventListener (specific_listener,
96                                        "mouse:button");
97       SPI_registerGlobalEventListener (specific_listener,
98                                        "mouse:abs");
99   }
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:visible-data-changed"); 
118   SPI_registerGlobalEventListener (generic_listener,
119                                    "object:text-selection-changed"); 
120
121   SPI_registerGlobalEventListener (generic_listener,
122                                    "object:text-caret-moved"); 
123   SPI_registerGlobalEventListener (generic_listener,
124                                    "object:text-changed"); 
125   SPI_registerGlobalEventListener (generic_listener,
126                                    "object:column-inserted"); 
127   SPI_registerGlobalEventListener (generic_listener,
128                                    "object:row-inserted"); 
129   SPI_registerGlobalEventListener (generic_listener,
130                                    "object:column-reordered"); 
131   SPI_registerGlobalEventListener (generic_listener,
132                                    "object:row-reordered"); 
133   SPI_registerGlobalEventListener (generic_listener,
134                                    "object:column-deleted"); 
135   SPI_registerGlobalEventListener (generic_listener,
136                                    "object:row-deleted"); 
137   SPI_registerGlobalEventListener (generic_listener,
138                                    "object:model-changed"); 
139   SPI_registerGlobalEventListener (generic_listener,
140                                    "window:minimize");
141   SPI_registerGlobalEventListener (generic_listener,
142                                    "window:maximize");
143   SPI_registerGlobalEventListener (generic_listener,
144                                    "window:restore");
145   SPI_registerGlobalEventListener (generic_listener,
146                                    "window:activate");
147   SPI_registerGlobalEventListener (generic_listener,
148                                    "window:deactivate");
149   SPI_registerGlobalEventListener (generic_listener,
150                                    "window:close");
151   SPI_registerGlobalEventListener (generic_listener,
152                                    "window:lower");
153   SPI_registerGlobalEventListener (generic_listener,
154                                    "window:raise");
155   SPI_registerGlobalEventListener (generic_listener,
156                                    "window:resize");
157   SPI_registerGlobalEventListener (generic_listener,
158                                    "window:shade");
159   SPI_registerGlobalEventListener (generic_listener,
160                                    "window:unshade");
161   SPI_registerGlobalEventListener (test_listener,
162                                    "object:test");
163 #ifdef NOT_YET_IMPLEMENTED
164   /* event below possibly should just be property change? */
165   SPI_registerGlobalEventListener (generic_listener,
166                                    "window:restyle"); 
167   SPI_registerGlobalEventListener (generic_listener,
168                                    "window:desktop-create");
169   SPI_registerGlobalEventListener (generic_listener,
170                                    "window:desktop-destroy");
171 #endif
172   
173   timer = g_timer_new ();
174   traverse_accessible_tree (SPI_getDesktop (0));
175   g_print ("Time for first traversal of %d elements: %lf\n", 
176            n_elements_traversed,
177            g_timer_elapsed (timer, NULL));
178   g_timer_start (timer);
179   traverse_accessible_tree (SPI_getDesktop (0));
180   g_timer_stop (timer);
181   g_print ("Time for subsequent traversal %f\n", g_timer_elapsed (timer, NULL));
182   g_print ("[%f elements/sec, %f SPI calls/sec]\n", 
183         n_elements_traversed/g_timer_elapsed(timer, NULL),
184         (n_elements_traversed*8+1)/g_timer_elapsed(timer, NULL));
185   g_timer_reset (timer);
186   SPI_event_main ();
187
188   putenv ("AT_BRIDGE_SHUTDOWN=1");
189
190   /*
191    * TODO: Add a key event listener that calls test_exit, to
192    * deregister and cleanup appropriately.
193    */
194
195   return SPI_exit ();
196 }
197
198 static void
199 traverse_accessible_tree (Accessible *accessible)
200 {
201         int n_children;
202         int i;
203         char *name;
204         char *role_name;
205         Accessible *child;
206         
207         n_elements_traversed++;
208         name = Accessible_getName (accessible);
209         role_name = Accessible_getRoleName (accessible);
210 #ifdef VERBOSE
211         fprintf (stdout, "[%s] \"%s\"\n",
212                  role_name, name);
213 #endif
214         SPI_freeString (name);
215         SPI_freeString (role_name);
216         n_children = Accessible_getChildCount (accessible);
217         if (!Accessible_isTable (accessible)) 
218         {
219                 for (i = 0; i < n_children; ++i)
220                 {
221                         child = Accessible_getChildAtIndex (accessible, i);
222                         traverse_accessible_tree (child);
223                         Accessible_unref (child);
224                 }
225         }
226 }
227
228 void
229 report_event (const AccessibleEvent *event, void *user_data)
230 {
231   static long count = 0;
232   char *s = Accessible_getName (event->source);
233   fprintf (stderr, "%s %s\n", event->type, s);
234   if (s) SPI_freeString (s);
235   if (count == 0) {
236           g_timer_reset (timer);
237           g_timer_start (timer);
238   }
239   ++count;
240   if ((count % 100) == 0) {
241           g_print ("%d events received, %f events/sec\n",
242                    count,
243                    count/g_timer_elapsed(timer, NULL));
244   }
245 }
246
247 void
248 report_detail_event (const AccessibleEvent *event, void *user_data)
249 {
250   char *s = Accessible_getName (event->source);
251   fprintf (stderr, "(detail) %s %s %d %d\n", event->type, s,
252            event->detail1, event->detail2);
253   if (s) SPI_freeString (s);
254 }
255
256 void
257 timing_test_event (const AccessibleEvent *event, void *user_data)
258 {
259         static long count = 0;
260         if (count == 0) g_timer_start (timer);
261         ++count;
262         if ((count % 500) == 0) {
263                 g_print ("%d events received, %f events/sec\n",
264                          count,
265                          count/g_timer_elapsed(timer, NULL));
266         }
267 }
268
269 void
270 test_exit ()
271 {
272   SPI_deregisterGlobalEventListenerAll (generic_listener);
273   AccessibleEventListener_unref (generic_listener);
274   SPI_deregisterGlobalEventListenerAll (specific_listener);
275   AccessibleEventListener_unref (specific_listener);
276 }