#include #include "testlib.h" /* * This module is used to test the accessible implementation for GtkOptionMenu * * When the GtkOption menu in the FileSelectionDialog is tabbed to, the menu * is opened and the second item in the menu is selected which causes the * menu to be closed and the item in the GtkOptionMenu to be updated. */ #define NUM_VALID_ROLES 1 static void _create_event_watcher (void); static void _check_object (AtkObject *obj); static gint _do_menu_item_action (gpointer data); static gboolean doing_action = FALSE; static void _check_object (AtkObject *obj) { AtkRole role; static G_CONST_RETURN char *name = NULL; static gboolean first_time = TRUE; role = atk_object_get_role (obj); if (role == ATK_ROLE_PUSH_BUTTON) /* * Find the specified optionmenu item */ { AtkRole valid_roles[NUM_VALID_ROLES]; AtkObject *atk_option_menu; GtkWidget *widget; if (name == NULL) { name = g_getenv ("TEST_ACCESSIBLE_NAME"); if (name == NULL) name = "foo"; } valid_roles[0] = ATK_ROLE_PUSH_BUTTON; atk_option_menu = find_object_by_accessible_name_and_role (obj, name, valid_roles, NUM_VALID_ROLES); if (atk_option_menu == NULL) { g_print ("Object not found for %s\n", name); return; } else { g_print ("Object found for %s\n", name); } g_assert (GTK_IS_ACCESSIBLE (atk_option_menu)); widget = GTK_ACCESSIBLE (atk_option_menu)->widget; g_assert (GTK_IS_OPTION_MENU (widget)); if (first_time) first_time = FALSE; else return; /* * This action opens the GtkOptionMenu whose name is "foo" or whatever * was specified in the environment variable TEST_ACCESSIBLE_NAME */ atk_action_do_action (ATK_ACTION (atk_option_menu), 0); } else if ((role == ATK_ROLE_MENU_ITEM) || (role == ATK_ROLE_CHECK_MENU_ITEM) || (role == ATK_ROLE_RADIO_MENU_ITEM) || (role == ATK_ROLE_TEAR_OFF_MENU_ITEM)) { AtkObject *parent, *child; AtkRole parent_role; /* * If we receive focus while waiting for the menu to be closed * we return immediately */ if (doing_action) return; parent = atk_object_get_parent (obj); parent_role = atk_object_get_role (parent); g_assert (parent_role == ATK_ROLE_MENU); child = atk_object_ref_accessible_child (parent, 1); doing_action = TRUE; gtk_timeout_add (5000, _do_menu_item_action, child); } else { G_CONST_RETURN char *accessible_name; accessible_name = atk_object_get_name (obj); if (accessible_name) { g_print ("Name: %s\n", accessible_name); } else if (GTK_IS_ACCESSIBLE (obj)) { GtkWidget *widget = GTK_ACCESSIBLE (obj)->widget; g_print ("Type: %s\n", g_type_name (G_OBJECT_TYPE (widget))); } if (role == ATK_ROLE_TABLE) { gint n_cols, i; n_cols = atk_table_get_n_columns (ATK_TABLE (obj)); g_print ("Number of Columns: %d\n", n_cols); for (i = 0; i < n_cols; i++) { AtkObject *header; header = atk_table_get_column_header (ATK_TABLE (obj), i); g_print ("header: %s %s\n", g_type_name (G_OBJECT_TYPE (header)), atk_object_get_name (header)); } } } } static gint _do_menu_item_action (gpointer data) { AtkObject *obj = ATK_OBJECT (data); atk_action_do_action (ATK_ACTION (obj), 0); doing_action = FALSE; g_object_unref (obj); return FALSE; } static void _create_event_watcher (void) { atk_add_focus_tracker (_check_object); } int gtk_module_init(gint argc, char* argv[]) { g_print("testoptionmenu Module loaded\n"); _create_event_watcher(); return 0; }