diff --git a/gtk/a11y/gtkcolorswatchaccessible.c b/gtk/a11y/gtkcolorswatchaccessible.c index afa753a725..5e60d2040e 100644 --- a/gtk/a11y/gtkcolorswatchaccessible.c +++ b/gtk/a11y/gtkcolorswatchaccessible.c @@ -19,6 +19,7 @@ #include #include +#include "gtkcolorswatchprivate.h" #include "gtkcolorswatchaccessibleprivate.h" static void atk_action_interface_init (AtkActionIface *iface); @@ -26,21 +27,85 @@ static void atk_action_interface_init (AtkActionIface *iface); G_DEFINE_TYPE_WITH_CODE (GtkColorSwatchAccessible, _gtk_color_swatch_accessible, GTK_TYPE_WIDGET_ACCESSIBLE, G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init)) +static void +state_changed_cb (GtkWidget *widget, + GtkStateFlags previous_flags) +{ + AtkObject *accessible; + GtkStateFlags flags; + gboolean was_selected; + gboolean selected; + + flags = gtk_widget_get_state_flags (widget); + + was_selected = (previous_flags & GTK_STATE_FLAG_SELECTED) != 0; + selected = (flags & GTK_STATE_FLAG_SELECTED) != 0; + + accessible = gtk_widget_get_accessible (widget); + if (selected && !was_selected) + atk_object_notify_state_change (accessible, ATK_STATE_CHECKED, TRUE); + else if (!selected && was_selected) + atk_object_notify_state_change (accessible, ATK_STATE_CHECKED, FALSE); +} + static void gtk_color_swatch_accessible_initialize (AtkObject *obj, gpointer data) { ATK_OBJECT_CLASS (_gtk_color_swatch_accessible_parent_class)->initialize (obj, data); + g_signal_connect (data, "state-flags-changed", + G_CALLBACK (state_changed_cb), NULL); + atk_object_set_role (obj, ATK_ROLE_RADIO_BUTTON); } +static AtkStateSet * +gtk_color_swatch_accessible_ref_state_set (AtkObject *accessible) +{ + GtkWidget *widget; + AtkStateSet *state_set; + + state_set = ATK_OBJECT_CLASS (_gtk_color_swatch_accessible_parent_class)->ref_state_set (accessible); + + widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); + if (widget != NULL) + { + if ((gtk_widget_get_state_flags (widget) & GTK_STATE_FLAG_SELECTED) != 0) + atk_state_set_add_state (state_set, ATK_STATE_CHECKED); + } + + return state_set; +} + +static void +gtk_color_swatch_accessible_notify_gtk (GObject *obj, + GParamSpec *pspec) +{ + GtkWidget *widget = GTK_WIDGET (obj); + AtkObject *atk_obj = gtk_widget_get_accessible (widget); + + if (strcmp (pspec->name, "selectable") == 0) + { + if (gtk_color_swatch_get_selectable (GTK_COLOR_SWATCH (widget))) + atk_object_set_role (atk_obj, ATK_ROLE_RADIO_BUTTON); + else + atk_object_set_role (atk_obj, ATK_ROLE_PUSH_BUTTON); + } + else + GTK_WIDGET_ACCESSIBLE_CLASS (_gtk_color_swatch_accessible_parent_class)->notify_gtk (obj, pspec); +} + static void _gtk_color_swatch_accessible_class_init (GtkColorSwatchAccessibleClass *klass) { AtkObjectClass *atk_class = ATK_OBJECT_CLASS (klass); + GtkWidgetAccessibleClass *widget_class = (GtkWidgetAccessibleClass *)klass; atk_class->initialize = gtk_color_swatch_accessible_initialize; + atk_class->ref_state_set = gtk_color_swatch_accessible_ref_state_set; + + widget_class->notify_gtk = gtk_color_swatch_accessible_notify_gtk; } static void diff --git a/gtk/gtkcolorchooserwidget.c b/gtk/gtkcolorchooserwidget.c index a24c993e8f..e31c620e5a 100644 --- a/gtk/gtkcolorchooserwidget.c +++ b/gtk/gtkcolorchooserwidget.c @@ -525,11 +525,11 @@ gtk_color_chooser_widget_init (GtkColorChooserWidget *cc) cc->priv->button = button = gtk_color_swatch_new (); gtk_widget_set_name (button, "add-color-button"); atk_obj = gtk_widget_get_accessible (button); - atk_object_set_role (atk_obj, ATK_ROLE_PUSH_BUTTON); atk_object_set_name (atk_obj, _("Custom color")); atk_object_set_description (atk_obj, _("Create a custom color")); connect_button_signals (button, cc); gtk_color_swatch_set_icon (GTK_COLOR_SWATCH (button), "list-add-symbolic"); + gtk_color_swatch_set_selectable (GTK_COLOR_SWATCH (button), FALSE); gtk_container_add (GTK_CONTAINER (box), button); cc->priv->settings = g_settings_new ("org.gtk.Settings.ColorChooser"); @@ -546,7 +546,7 @@ gtk_color_chooser_widget_init (GtkColorChooserWidget *cc) atk_obj = gtk_widget_get_accessible (p); name = accessible_color_name (&color); text = g_strdup_printf (_("Custom color %d: %s"), i, name); - atk_object_set_description (atk_obj, text); + atk_object_set_name (atk_obj, text); g_free (text); g_free (name); connect_custom_signals (p, cc); diff --git a/testsuite/a11y/colorchooser.txt b/testsuite/a11y/colorchooser.txt index 995f494139..cb2a02bf59 100644 --- a/testsuite/a11y/colorchooser.txt +++ b/testsuite/a11y/colorchooser.txt @@ -516,7 +516,7 @@ window1 parent: unnamed-GtkContainerAccessible-29 index: 0 name: White - state: enabled focusable sensitive showing visible + state: checked enabled focusable sensitive showing visible toolkit: gtk layer: widget