Partial fix for 84261, we now report mouse motion events to listeners who
[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 Sun Microsystems Inc.
6  *
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.
11  *
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.
16  *
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.
21  */
22
23 #include <stdlib.h>
24 #include "../cspi/spi-private.h" /* A hack for now */
25
26 static void traverse_accessible_tree (Accessible *accessible);
27
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);
31
32 static AccessibleEventListener *generic_listener;
33 static AccessibleEventListener *specific_listener;
34 static AccessibleEventListener *test_listener;
35 static gint n_elements_traversed = 0;
36 static GTimer *timer;
37
38 int
39 main (int argc, char **argv)
40 {
41   int i, j;
42   int n_desktops;
43   int n_apps;
44   char *s;
45   gdouble elapsed_time;
46   Accessible *desktop;
47   Accessible *application;
48   const char *modules;
49
50   SPI_init ();
51
52   generic_listener = SPI_createAccessibleEventListener (
53           report_event, NULL); 
54   specific_listener = SPI_createAccessibleEventListener (
55           report_detail_event, NULL); 
56   test_listener = SPI_createAccessibleEventListener (
57           timing_test_event, NULL);
58
59   SPI_registerGlobalEventListener (generic_listener,
60                                    "focus:");
61   SPI_registerGlobalEventListener (specific_listener,
62                                    "mouse:rel");
63   SPI_registerGlobalEventListener (specific_listener,
64                                    "mouse:abs");
65   SPI_registerGlobalEventListener (generic_listener,
66                                    "object:property-change");
67   SPI_registerGlobalEventListener (specific_listener,
68                                    "object:property-change:accessible-name");
69   SPI_registerGlobalEventListener (generic_listener,
70                                    "object:state-changed"); 
71   SPI_registerGlobalEventListener (specific_listener,
72                                    "object:state-changed:focused"); 
73   SPI_registerGlobalEventListener (generic_listener,
74                                    "object:selection-changed"); 
75   SPI_registerGlobalEventListener (generic_listener,
76                                    "object:children-changed"); 
77   SPI_registerGlobalEventListener (specific_listener,
78                                    "object:children-changed:add"); 
79   SPI_registerGlobalEventListener (generic_listener,
80                                    "object:visible-data-changed"); 
81   SPI_registerGlobalEventListener (generic_listener,
82                                    "object:text-selection-changed"); 
83
84   SPI_registerGlobalEventListener (generic_listener,
85                                    "object:text-caret-moved"); 
86   SPI_registerGlobalEventListener (generic_listener,
87                                    "object:text-changed"); 
88   SPI_registerGlobalEventListener (generic_listener,
89                                    "object:column-inserted"); 
90   SPI_registerGlobalEventListener (generic_listener,
91                                    "object:row-inserted"); 
92   SPI_registerGlobalEventListener (generic_listener,
93                                    "object:column-reordered"); 
94   SPI_registerGlobalEventListener (generic_listener,
95                                    "object:row-reordered"); 
96   SPI_registerGlobalEventListener (generic_listener,
97                                    "object:column-deleted"); 
98   SPI_registerGlobalEventListener (generic_listener,
99                                    "object:row-deleted"); 
100   SPI_registerGlobalEventListener (generic_listener,
101                                    "object:model-changed"); 
102   SPI_registerGlobalEventListener (generic_listener,
103                                    "window:minimize");
104   SPI_registerGlobalEventListener (generic_listener,
105                                    "window:maximize");
106   SPI_registerGlobalEventListener (generic_listener,
107                                    "window:restore");
108   SPI_registerGlobalEventListener (generic_listener,
109                                    "window:activate");
110   SPI_registerGlobalEventListener (generic_listener,
111                                    "window:deactivate");
112   SPI_registerGlobalEventListener (generic_listener,
113                                    "window:close");
114   SPI_registerGlobalEventListener (generic_listener,
115                                    "window:lower");
116   SPI_registerGlobalEventListener (generic_listener,
117                                    "window:raise");
118   SPI_registerGlobalEventListener (generic_listener,
119                                    "window:resize");
120   SPI_registerGlobalEventListener (generic_listener,
121                                    "window:shade");
122   SPI_registerGlobalEventListener (generic_listener,
123                                    "window:unshade");
124   SPI_registerGlobalEventListener (test_listener,
125                                    "object:test");
126 #ifdef NOT_YET_IMPLEMENTED
127   /* event below possibly should just be property change? */
128   SPI_registerGlobalEventListener (generic_listener,
129                                    "window:restyle"); 
130   SPI_registerGlobalEventListener (generic_listener,
131                                    "window:desktop-create");
132   SPI_registerGlobalEventListener (generic_listener,
133                                    "window:desktop-destroy");
134 #endif
135   
136   timer = g_timer_new ();
137   traverse_accessible_tree (SPI_getDesktop (0));
138   g_print ("Time for first traversal of %d elements: %lf\n", 
139            n_elements_traversed,
140            g_timer_elapsed (timer, NULL));
141   g_timer_start (timer);
142   traverse_accessible_tree (SPI_getDesktop (0));
143   g_timer_stop (timer);
144   g_print ("Time for subsequent traversal %f\n", g_timer_elapsed (timer, NULL));
145   g_print ("[%f elements/sec, %f SPI calls/sec]\n", 
146         n_elements_traversed/g_timer_elapsed(timer, NULL),
147         (n_elements_traversed*8+1)/g_timer_elapsed(timer, NULL));
148   g_timer_reset (timer);
149   SPI_event_main ();
150
151   putenv ("AT_BRIDGE_SHUTDOWN=1");
152
153   /*
154    * TODO: Add a key event listener that calls test_exit, to
155    * deregister and cleanup appropriately.
156    */
157
158   return SPI_exit ();
159 }
160
161 static void
162 traverse_accessible_tree (Accessible *accessible)
163 {
164         int n_children;
165         int i;
166         char *name;
167         char *role_name;
168         Accessible *child;
169         
170         n_elements_traversed++;
171         name = Accessible_getName (accessible);
172         role_name = Accessible_getRoleName (accessible);
173 #ifdef VERBOSE
174         fprintf (stdout, "[%s] \"%s\"\n",
175                  role_name, name);
176 #endif
177         SPI_freeString (name);
178         SPI_freeString (role_name);
179         n_children = Accessible_getChildCount (accessible);
180         if (!Accessible_isTable (accessible)) 
181         {
182                 for (i = 0; i < n_children; ++i)
183                 {
184                         child = Accessible_getChildAtIndex (accessible, i);
185                         traverse_accessible_tree (child);
186                         Accessible_unref (child);
187                 }
188         }
189 }
190
191 void
192 report_event (const AccessibleEvent *event, void *user_data)
193 {
194   static long count = 0;
195   char *s = Accessible_getName (event->source);
196   fprintf (stderr, "%s %s\n", event->type, s);
197   if (s) SPI_freeString (s);
198   if (count == 0) {
199           g_timer_reset (timer);
200           g_timer_start (timer);
201   }
202   ++count;
203   if ((count % 100) == 0) {
204           g_print ("%d events received, %f events/sec\n",
205                    count,
206                    count/g_timer_elapsed(timer, NULL));
207   }
208 }
209
210 void
211 report_detail_event (const AccessibleEvent *event, void *user_data)
212 {
213   char *s = Accessible_getName (event->source);
214   fprintf (stderr, "(detail) %s %s %d %d\n", event->type, s,
215            event->detail1, event->detail2);
216   if (s) SPI_freeString (s);
217 }
218
219 void
220 timing_test_event (const AccessibleEvent *event, void *user_data)
221 {
222         static long count = 0;
223         if (count == 0) g_timer_start (timer);
224         ++count;
225         if ((count % 500) == 0) {
226                 g_print ("%d events received, %f events/sec\n",
227                          count,
228                          count/g_timer_elapsed(timer, NULL));
229         }
230 }
231
232 void
233 test_exit ()
234 {
235   SPI_deregisterGlobalEventListenerAll (generic_listener);
236   AccessibleEventListener_unref (generic_listener);
237   SPI_deregisterGlobalEventListenerAll (specific_listener);
238   AccessibleEventListener_unref (specific_listener);
239 }