static void gtk_widget_accessible_initialize (AtkObject *obj, gpointer data) { GtkWidget *widget; widget = GTK_WIDGET (data); g_signal_connect_after (widget, "focus-in-event", G_CALLBACK (focus_cb), NULL); g_signal_connect_after (widget, "focus-out-event", G_CALLBACK (focus_cb), NULL); g_signal_connect (widget, "notify", G_CALLBACK (notify_cb), NULL); g_signal_connect (widget, "size-allocate", G_CALLBACK (size_allocate_cb), NULL); g_signal_connect (widget, "map", G_CALLBACK (map_cb), NULL); g_signal_connect (widget, "unmap", G_CALLBACK (map_cb), NULL); GTK_WIDGET_ACCESSIBLE (obj)->priv->layer = ATK_LAYER_WIDGET; obj->role = ATK_ROLE_UNKNOWN; gtk_widget_accessible_update_tooltip (GTK_WIDGET_ACCESSIBLE (obj), widget); }
/* Translate GtkWidget property change notification to the notify_gtk vfunc */ static void notify_cb (GObject *obj, GParamSpec *pspec) { GtkWidgetAccessible *widget; GtkWidgetAccessibleClass *klass; widget = GTK_WIDGET_ACCESSIBLE (gtk_widget_get_accessible (GTK_WIDGET (obj))); klass = GTK_WIDGET_ACCESSIBLE_GET_CLASS (widget); if (klass->notify_gtk) klass->notify_gtk (obj, pspec); }
/* This function is the default implementation for the notify_gtk * vfunc which gets called when a property changes value on the * GtkWidget associated with a GtkWidgetAccessible. It constructs * an AtkPropertyValues structure and emits a "property_changed" * signal which causes the user specified AtkPropertyChangeHandler * to be called. */ static void gtk_widget_accessible_notify_gtk (GObject *obj, GParamSpec *pspec) { GtkWidget* widget = GTK_WIDGET (obj); AtkObject* atk_obj = gtk_widget_get_accessible (widget); AtkState state; gboolean value; if (g_strcmp0 (pspec->name, "has-focus") == 0) /* * We use focus-in-event and focus-out-event signals to catch * focus changes so we ignore this. */ return; else if (g_strcmp0 (pspec->name, "tooltip-text") == 0) { gtk_widget_accessible_update_tooltip (GTK_WIDGET_ACCESSIBLE (atk_obj), widget); return; } else if (g_strcmp0 (pspec->name, "visible") == 0) { state = ATK_STATE_VISIBLE; value = gtk_widget_get_visible (widget); } else if (g_strcmp0 (pspec->name, "sensitive") == 0) { state = ATK_STATE_SENSITIVE; value = gtk_widget_get_sensitive (widget); } else if (g_strcmp0 (pspec->name, "orientation") == 0 && GTK_IS_ORIENTABLE (widget)) { GtkOrientable *orientable; orientable = GTK_ORIENTABLE (widget); state = ATK_STATE_HORIZONTAL; value = (gtk_orientable_get_orientation (orientable) == GTK_ORIENTATION_HORIZONTAL); } else return; atk_object_notify_state_change (atk_obj, state, value); if (state == ATK_STATE_SENSITIVE) atk_object_notify_state_change (atk_obj, ATK_STATE_ENABLED, value); if (state == ATK_STATE_HORIZONTAL) atk_object_notify_state_change (atk_obj, ATK_STATE_VERTICAL, !value); }
static void gtk_menu_item_accessible_initialize (AtkObject *obj, gpointer data) { GtkWidget *widget; GtkWidget *parent; GtkWidget *menu; ATK_OBJECT_CLASS (_gtk_menu_item_accessible_parent_class)->initialize (obj, data); g_signal_connect (data, "select", G_CALLBACK (menu_item_select), NULL); g_signal_connect (data, "deselect", G_CALLBACK (menu_item_deselect), NULL); widget = GTK_WIDGET (data); parent = gtk_widget_get_parent (widget); if (GTK_IS_MENU (parent)) { GtkWidget *parent_widget; parent_widget = gtk_menu_get_attach_widget (GTK_MENU (parent)); if (!GTK_IS_MENU_ITEM (parent_widget)) parent_widget = gtk_widget_get_parent (widget); if (parent_widget) atk_object_set_parent (obj, gtk_widget_get_accessible (parent_widget)); } GTK_WIDGET_ACCESSIBLE (obj)->layer = ATK_LAYER_POPUP; obj->role = ATK_ROLE_MENU_ITEM; menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (data)); if (menu) { g_signal_connect (menu, "add", G_CALLBACK (menu_item_add_gtk), NULL); g_signal_connect (menu, "remove", G_CALLBACK (menu_item_remove_gtk), NULL); } }