]> Pileus Git - ~andy/gtk/blob - modules/other/gail/tests/testprops.c
8db555e177fe7ac3753166d60d3290559fb34015
[~andy/gtk] / modules / other / gail / tests / testprops.c
1 #include <string.h>
2 #include <stdlib.h>
3 #include <atk/atk.h>
4 #include <gtk/gtk.h>
5 #include <testlib.h>
6
7 static void _traverse_children (AtkObject *obj);
8 static void _add_handler (AtkObject *obj);
9 static void _check_properties (AtkObject *obj);
10 static void _property_change_handler (AtkObject   *obj,
11                                       AtkPropertyValues *values);
12 static void _state_changed (AtkObject   *obj,
13                             const gchar *name,
14                             gboolean    set);
15 static void _selection_changed (AtkObject   *obj);
16 static void _visible_data_changed (AtkObject   *obj);
17 static void _model_changed (AtkObject   *obj);
18 static void _create_event_watcher (void);
19
20 static guint id;
21
22 static void 
23 _state_changed (AtkObject   *obj,
24                 const gchar *name,
25                 gboolean    set)
26 {
27   g_print ("_state_changed: %s: state %s %s\n", 
28            g_type_name (G_OBJECT_TYPE (obj)),
29            set ? "is" : "was", name);
30 }
31
32 static void 
33 _selection_changed (AtkObject   *obj)
34 {
35   gchar *type;
36
37   if (ATK_IS_TEXT (obj))
38     type = "text";
39   else if (ATK_IS_SELECTION (obj))
40     type = "child selection";
41   else
42     {
43       g_assert_not_reached();
44       return;
45     }
46
47   g_print ("In selection_changed signal handler for %s, object type: %s\n",
48            type, g_type_name (G_OBJECT_TYPE (obj)));
49 }
50
51 static void 
52 _visible_data_changed (AtkObject   *obj)
53 {
54   g_print ("In visible_data_changed signal handler, object type: %s\n",
55            g_type_name (G_OBJECT_TYPE (obj)));
56 }
57
58 static void 
59 _model_changed (AtkObject   *obj)
60 {
61   g_print ("In model_changed signal handler, object type: %s\n",
62            g_type_name (G_OBJECT_TYPE (obj)));
63 }
64
65 static void 
66 _property_change_handler (AtkObject   *obj,
67                           AtkPropertyValues   *values)
68 {
69   G_CONST_RETURN gchar *type_name = g_type_name (G_TYPE_FROM_INSTANCE (obj));
70   G_CONST_RETURN gchar *name = atk_object_get_name (obj);
71
72   g_print ("_property_change_handler: Accessible Type: %s\n",
73            type_name ? type_name : "NULL");
74   g_print ("_property_change_handler: Accessible name: %s\n",
75            name ? name : "NULL");
76   g_print ("_property_change_handler: PropertyName: %s\n",
77            values->property_name ? values->property_name: "NULL");
78   if (G_VALUE_HOLDS_STRING (&values->new_value))
79     g_print ("_property_change_handler: PropertyValue: %s\n",
80              g_value_get_string (&values->new_value));
81   else if (strcmp (values->property_name, "accessible-child") == 0)
82     {
83       if (G_IS_VALUE (&values->old_value))
84         {
85           g_print ("Child is removed: %s\n", 
86                g_type_name (G_TYPE_FROM_INSTANCE (g_value_get_pointer (&values->old_value))));
87         }
88       if (G_IS_VALUE (&values->new_value))
89         {
90           g_print ("Child is added: %s\n", 
91                g_type_name (G_TYPE_FROM_INSTANCE (g_value_get_pointer (&values->new_value))));
92         }
93     }
94   else if (strcmp (values->property_name, "accessible-parent") == 0)
95     {
96       if (G_IS_VALUE (&values->old_value))
97         {
98           g_print ("Parent is removed: %s\n", 
99                g_type_name (G_TYPE_FROM_INSTANCE (g_value_get_pointer (&values->old_value))));
100         }
101       if (G_IS_VALUE (&values->new_value))
102         {
103           g_print ("Parent is added: %s\n", 
104                g_type_name (G_TYPE_FROM_INSTANCE (g_value_get_pointer (&values->new_value))));
105         }
106     }
107   else if (strcmp (values->property_name, "accessible-value") == 0)
108     {
109       if (G_VALUE_HOLDS_DOUBLE (&values->new_value))
110         {
111           g_print ("Value now is (double) %f\n", 
112                    g_value_get_double (&values->new_value));
113         }
114     }
115 }
116
117 static void 
118 _traverse_children (AtkObject *obj)
119 {
120   gint n_children, i;
121   AtkRole role;
122  
123   role = atk_object_get_role (obj);
124
125   if ((role == ATK_ROLE_TABLE) ||
126       (role == ATK_ROLE_TREE_TABLE))
127     return;
128
129   n_children = atk_object_get_n_accessible_children (obj);
130   for (i = 0; i < n_children; i++)
131     {
132       AtkObject *child;
133
134       child = atk_object_ref_accessible_child (obj, i);
135       _add_handler (child);
136       _traverse_children (child);
137       g_object_unref (G_OBJECT (child));
138     }
139 }
140
141 static void 
142 _add_handler (AtkObject *obj)
143 {
144   static GPtrArray *obj_array = NULL;
145   gboolean found = FALSE;
146   gint i;
147
148   /*
149    * We create a property handler for each object if one was not associated 
150    * with it already.
151    *
152    * We add it to our array of objects which have property handlers; if an
153    * object is destroyed it remains in the array.
154    */
155   if (obj_array == NULL)
156     obj_array = g_ptr_array_new ();
157  
158   for (i = 0; i < obj_array->len; i++)
159     {
160       if (obj == g_ptr_array_index (obj_array, i))
161         {
162           found = TRUE;
163           break;
164         }
165     }
166   if (!found)
167     {
168       atk_object_connect_property_change_handler (obj,
169                    (AtkPropertyChangeHandler*) _property_change_handler);
170       g_signal_connect (obj, "state-change", 
171                         (GCallback) _state_changed, NULL);
172       if (ATK_IS_SELECTION (obj))
173         g_signal_connect (obj, "selection_changed", 
174                           (GCallback) _selection_changed, NULL);
175       g_signal_connect (obj, "visible_data_changed", 
176                         (GCallback) _visible_data_changed, NULL);
177       if (ATK_IS_TABLE (obj))
178         g_signal_connect (obj, "model_changed", 
179                         (GCallback) _model_changed, NULL);
180       g_ptr_array_add (obj_array, obj);
181     }
182 }
183  
184 static void 
185 _check_properties (AtkObject *obj)
186 {
187   AtkRole role;
188
189   g_print ("Start of _check_properties: %s\n", 
190            g_type_name (G_OBJECT_TYPE (obj)));
191
192   _add_handler (obj);
193
194   role = atk_object_get_role (obj);
195   if (role == ATK_ROLE_FRAME ||
196       role == ATK_ROLE_DIALOG)
197     {
198       /*
199        * Add handlers to all children.
200        */
201       _traverse_children (obj);
202     }
203   g_print ("End of _check_properties\n");
204 }
205
206 static void
207 _create_event_watcher (void)
208 {
209   id = atk_add_focus_tracker (_check_properties);
210 }
211
212 int
213 gtk_module_init(gint argc, char* argv[])
214 {
215   g_print("testprops Module loaded\n");
216
217   _create_event_watcher();
218
219   return 0;
220 }