Made change to support "string" key name specification in key listener
[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
31 static AccessibleEventListener *generic_listener;
32 static AccessibleEventListener *specific_listener;
33 static gint n_elements_traversed = 0;
34
35 int
36 main (int argc, char **argv)
37 {
38   int i, j;
39   int n_desktops;
40   int n_apps;
41   char *s;
42   GTimer *timer;
43   gdouble elapsed_time;
44   Accessible *desktop;
45   Accessible *application;
46   const char *modules;
47
48   SPI_init ();
49
50   generic_listener = SPI_createAccessibleEventListener (
51           report_event, NULL); 
52   specific_listener = SPI_createAccessibleEventListener (
53           report_detail_event, NULL); 
54
55   SPI_registerGlobalEventListener (generic_listener,
56                                    "focus:");
57   SPI_registerGlobalEventListener (generic_listener,
58                                    "object:property-change");
59   SPI_registerGlobalEventListener (specific_listener,
60                                    "object:property-change:accessible-name");
61   SPI_registerGlobalEventListener (generic_listener,
62                                    "object:state-changed"); 
63   SPI_registerGlobalEventListener (generic_listener,
64                                    "object:selection-changed"); 
65   SPI_registerGlobalEventListener (generic_listener,
66                                    "object:children-changed"); 
67   SPI_registerGlobalEventListener (specific_listener,
68                                    "object:children-changed:add"); 
69   SPI_registerGlobalEventListener (generic_listener,
70                                    "object:visible-data-changed"); 
71   SPI_registerGlobalEventListener (generic_listener,
72                                    "object:text-selection-changed"); 
73   SPI_registerGlobalEventListener (generic_listener,
74                                    "object:text-caret-moved"); 
75   SPI_registerGlobalEventListener (generic_listener,
76                                    "object:text-changed"); 
77   SPI_registerGlobalEventListener (generic_listener,
78                                    "object:column-inserted"); 
79   SPI_registerGlobalEventListener (generic_listener,
80                                    "object:row-inserted"); 
81   SPI_registerGlobalEventListener (generic_listener,
82                                    "object:column-reordered"); 
83   SPI_registerGlobalEventListener (generic_listener,
84                                    "object:row-reordered"); 
85   SPI_registerGlobalEventListener (generic_listener,
86                                    "object:column-deleted"); 
87   SPI_registerGlobalEventListener (generic_listener,
88                                    "object:row-deleted"); 
89   SPI_registerGlobalEventListener (generic_listener,
90                                    "object:model-changed"); 
91   SPI_registerGlobalEventListener (generic_listener,
92                                    "window:minimize");
93   SPI_registerGlobalEventListener (generic_listener,
94                                    "window:maximize");
95   SPI_registerGlobalEventListener (generic_listener,
96                                    "window:restore");
97   SPI_registerGlobalEventListener (generic_listener,
98                                    "window:activate");
99   SPI_registerGlobalEventListener (generic_listener,
100                                    "window:deactivate");
101   SPI_registerGlobalEventListener (generic_listener,
102                                    "window:close");
103 #ifdef NOT_YET_IMPLEMENTED
104   SPI_registerGlobalEventListener (generic_listener,
105                                    "window:lower");
106   SPI_registerGlobalEventListener (generic_listener,
107                                    "window:raise");
108   SPI_registerGlobalEventListener (generic_listener,
109                                    "window:resize");
110   SPI_registerGlobalEventListener (generic_listener,
111                                    "window:shade");
112   SPI_registerGlobalEventListener (generic_listener,
113                                    "window:unshade");
114   /* event below possibly should just be property change? */
115   SPI_registerGlobalEventListener (generic_listener,
116                                    "window:restyle"); 
117   SPI_registerGlobalEventListener (generic_listener,
118                                    "window:desktop-create");
119   SPI_registerGlobalEventListener (generic_listener,
120                                    "window:desktop-destroy");
121 #endif
122   
123   timer = g_timer_new ();
124   traverse_accessible_tree (SPI_getDesktop (0));
125   g_print ("Time for first traversal of %d elements: %lf\n", 
126            n_elements_traversed,
127            g_timer_elapsed (timer, NULL));
128   g_timer_start (timer);
129   traverse_accessible_tree (SPI_getDesktop (0));
130   g_timer_stop (timer);
131   g_print ("Time for subsequent traversal %f\n", g_timer_elapsed (timer, NULL));
132   g_print ("[%f elements/sec, %f SPI calls/sec]\n", 
133         n_elements_traversed/g_timer_elapsed(timer, NULL),
134         (n_elements_traversed*8+1)/g_timer_elapsed(timer, NULL));
135   
136   SPI_event_main ();
137
138   putenv ("AT_BRIDGE_SHUTDOWN=1");
139
140   /*
141    * TODO: Add a key event listener that calls test_exit, to
142    * deregister and cleanup appropriately.
143    */
144
145   return SPI_exit ();
146 }
147
148 static void
149 traverse_accessible_tree (Accessible *accessible)
150 {
151         int n_children;
152         int i;
153         char *name;
154         char *role_name;
155         Accessible *child;
156         
157         n_elements_traversed++;
158         name = Accessible_getName (accessible);
159         role_name = Accessible_getRoleName (accessible);
160 #ifdef VERBOSE
161         fprintf (stdout, "[%s] \"%s\"\n",
162                  role_name, name);
163 #endif
164         SPI_freeString (name);
165         SPI_freeString (role_name);
166         n_children = Accessible_getChildCount (accessible);
167         if (!Accessible_isTable (accessible)) 
168         {
169                 for (i = 0; i < n_children; ++i)
170                 {
171                         child = Accessible_getChildAtIndex (accessible, i);
172                         traverse_accessible_tree (child);
173                         Accessible_unref (child);
174                 }
175         }
176 }
177
178 void
179 report_event (const AccessibleEvent *event, void *user_data)
180 {
181   fprintf (stderr, "%s\n", event->type);
182 }
183
184 void
185 report_detail_event (const AccessibleEvent *event, void *user_data)
186 {
187   fprintf (stderr, "%s\n", event->type);
188 }
189
190 void
191 test_exit ()
192 {
193   SPI_deregisterGlobalEventListenerAll (generic_listener);
194   AccessibleEventListener_unref (generic_listener);
195   SPI_deregisterGlobalEventListenerAll (specific_listener);
196   AccessibleEventListener_unref (specific_listener);
197 }