4 static void _print_accessible (AtkObject *obj);
5 static void _print_type (AtkObject *obj);
6 static void _print_states (AtkObject *obj);
7 static void _check_children (AtkObject *obj);
8 static void _check_relation (AtkObject *obj);
9 static void _create_event_watcher (void);
10 static void _focus_handler (AtkObject *obj, gboolean focus_in);
11 static gboolean _children_changed (GSignalInvocationHint *ihint,
13 const GValue *param_values,
18 static void _print_states (AtkObject *obj)
20 AtkStateSet *state_set;
23 state_set = atk_object_ref_state_set (obj);
25 g_print ("*** Start states ***\n");
26 for (i = 0; i < 64; i++)
28 AtkStateType one_state;
31 if (atk_state_set_contains_state (state_set, i))
35 name = atk_state_type_get_name (one_state);
38 g_print("%s\n", name);
41 g_object_unref (state_set);
42 g_print ("*** End states ***\n");
45 static void _print_type (AtkObject *obj)
47 const gchar * typename = NULL;
48 const gchar * name = NULL;
50 static gboolean in_print_type = FALSE;
52 if (GTK_IS_ACCESSIBLE (obj))
54 GtkWidget* widget = NULL;
56 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
57 typename = g_type_name (G_OBJECT_TYPE (widget));
58 g_print ("Widget type name: %s\n", typename ? typename : "NULL");
60 typename = g_type_name (G_OBJECT_TYPE (obj));
61 g_print ("Accessible type name: %s\n", typename ? typename : "NULL");
62 name = atk_object_get_name (obj);
63 g_print("Accessible Name: %s\n", (name) ? name : "NULL");
64 role = atk_object_get_role (obj);
65 g_print ("Accessible Role: %s\n", atk_role_get_name (role));
67 if (ATK_IS_COMPONENT (obj))
69 gint x, y, width, height;
73 states = atk_object_ref_state_set (obj);
74 if (atk_state_set_contains_state (states, ATK_STATE_VISIBLE))
78 atk_component_get_extents (ATK_COMPONENT (obj),
79 &x, &y, &width, &height,
81 g_print ("ATK_XY_SCREEN: x: %d y: %d width: %d height: %d\n",
84 atk_component_get_extents (ATK_COMPONENT (obj),
85 &x, &y, &width, &height,
87 g_print ("ATK_XY_WINDOW: x: %d y: %d width: %d height: %d\n",
89 if (atk_state_set_contains_state (states, ATK_STATE_SHOWING) &&
94 atk_text_get_character_extents (ATK_TEXT (obj), 1,
95 &x, &y, &width, &height,
97 g_print ("Character extents : %d %d %d %d\n",
99 if (width != 0 && height != 0)
101 offset = atk_text_get_offset_at_point (ATK_TEXT (obj),
106 g_print ("Wrong offset returned (%d) %d\n", 1, offset);
113 parent = atk_object_get_parent (obj);
114 if (!ATK_IS_COMPONENT (parent))
116 /* Assume toplevel */
117 g_object_unref (G_OBJECT (states));
121 obj1 = atk_component_ref_accessible_at_point (ATK_COMPONENT (parent),
122 x, y, ATK_XY_WINDOW);
125 g_print ("Inconsistency between object and ref_accessible_at_point\n");
126 in_print_type = TRUE;
128 in_print_type = FALSE;
132 g_object_unref (G_OBJECT (states));
136 static void _print_accessible (AtkObject *obj)
138 GtkWidget* widget = NULL;
139 AtkObject* parent_atk;
142 static gboolean first_time = TRUE;
147 atk_add_global_event_listener (_children_changed,
148 "Atk:AtkObject:children_changed");
152 * Check that the object returned by the atk_implementor_ref_accessible()
153 * for a widget is the same as the accessible object
155 if (GTK_IS_ACCESSIBLE (obj))
157 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
158 ref_obj = atk_implementor_ref_accessible (ATK_IMPLEMENTOR (widget));
159 g_assert (ref_obj == obj);
160 g_object_unref (G_OBJECT (ref_obj));
163 * Add a focus handler so we see focus out events as well
165 if (ATK_IS_COMPONENT (obj))
166 atk_component_add_focus_handler (ATK_COMPONENT (obj), _focus_handler);
167 g_print ("Object:\n");
172 * Get the parent object
174 parent_atk = atk_object_get_parent (obj);
177 g_print ("Parent Object:\n");
178 _print_type (parent_atk);
179 parent_atk = atk_object_get_parent (parent_atk);
182 g_print ("Grandparent Object:\n");
183 _print_type (parent_atk);
188 g_print ("No parent\n");
191 role = atk_object_get_role (obj);
193 if ((role == ATK_ROLE_FRAME) || (role == ATK_ROLE_DIALOG))
195 _check_children (obj);
199 static void _check_relation (AtkObject *obj)
201 AtkRelationSet* relation_set = atk_object_ref_relation_set (obj);
204 g_return_if_fail (relation_set);
206 n_relations = atk_relation_set_get_n_relations (relation_set);
207 for (i = 0; i < n_relations; i++)
209 AtkRelation* relation = atk_relation_set_get_relation (relation_set, i);
211 g_print ("Index: %d Relation type: %d Number: %d\n", i,
212 atk_relation_get_relation_type (relation),
213 atk_relation_get_target (relation)->len);
215 g_object_unref (relation_set);
218 static void _check_children (AtkObject *obj)
224 g_print ("Start Check Children\n");
225 n_children = atk_object_get_n_accessible_children (obj);
226 g_print ("Number of children: %d\n", n_children);
228 role = atk_object_get_role (obj);
230 if (ATK_IS_COMPONENT (obj))
232 atk_component_add_focus_handler (ATK_COMPONENT (obj), _focus_handler);
233 layer = atk_component_get_layer (ATK_COMPONENT (obj));
234 if (role == ATK_ROLE_MENU)
235 g_assert (layer == ATK_LAYER_POPUP);
237 g_print ("Layer: %d\n", layer);
240 for (i = 0; i < n_children; i++)
246 child = atk_object_ref_accessible_child (obj, i);
247 parent = atk_object_get_parent (child);
248 j = atk_object_get_index_in_parent (child);
250 _check_relation (child);
251 _check_children (child);
254 g_print ("*** Inconsistency between atk_object_get_parent() and "
255 "atk_object_ref_accessible_child() ***\n");
259 _print_type (parent);
261 g_object_unref (G_OBJECT (child));
264 g_print ("*** Inconsistency between parent and children %d %d ***\n",
267 g_print ("End Check Children\n");
271 _children_changed (GSignalInvocationHint *ihint,
272 guint n_param_values,
273 const GValue *param_values,
279 const gchar *target_name = "NotAtkObject";
281 object = g_value_get_object (param_values + 0);
282 index = g_value_get_uint (param_values + 1);
283 target = g_value_get_pointer (param_values + 2);
284 if (G_IS_OBJECT (target))
286 if (ATK_IS_OBJECT (target))
288 target_name = atk_object_get_name (target);
291 target_name = g_type_name (G_OBJECT_TYPE (G_OBJECT (target)));
299 child = atk_object_ref_accessible_child (ATK_OBJECT (object), index);
302 target_name = g_type_name (G_OBJECT_TYPE (G_OBJECT (child)));
303 g_object_unref (child);
307 g_print ("_children_watched: %s %s %s index: %d\n",
308 g_type_name (G_OBJECT_TYPE (object)),
309 g_quark_to_string (ihint->detail),
315 _create_event_watcher (void)
318 * _print_accessible() will be called for an accessible object when its
319 * widget receives focus.
321 id = atk_add_focus_tracker (_print_accessible);
325 _focus_handler (AtkObject *obj, gboolean focus_in)
327 g_print ("In _focus_handler focus_in: %s\n", focus_in ? "true" : "false");
332 gtk_module_init(gint argc, char* argv[])
334 g_print("testobject Module loaded\n");
336 _create_event_watcher();