Set correct accessible relations for GtkMenuButton
authorLukáš Tyrychtr <lukastyrychtr@gmail.com>
Tue, 14 Sep 2021 12:26:18 +0000 (14:26 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Sun, 31 Oct 2021 21:52:04 +0000 (17:52 -0400)
Up until now, as the focus was moved to the inner button, it was not possible for
assistive technologies to determine the correct labels and descriptions
because developers could set them only for the parent widget.
Now, the proper relations are added so the labels should be picked up properly.

Fixes #4254

gtk/gtkmenubutton.c

index e1d8209ddc5a4b9ee95f013240e77aa23a8828d4..3858dcf01f6f80e2dca63a9892ddc1a9a82eacbc 100644 (file)
@@ -633,6 +633,10 @@ gtk_menu_button_init (GtkMenuButton *self)
   gtk_widget_set_sensitive (self->button, FALSE);
 
   gtk_widget_add_css_class (GTK_WIDGET (self), "popup");
+
+  gtk_accessible_update_relation (GTK_ACCESSIBLE (self->button), GTK_ACCESSIBLE_RELATION_LABELLED_BY, self, NULL,
+  GTK_ACCESSIBLE_RELATION_DESCRIBED_BY, self, NULL,
+                                  -1);
 }
 
 /**
@@ -949,6 +953,9 @@ gtk_menu_button_set_icon_name (GtkMenuButton *menu_button,
   box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
   gtk_widget_set_halign (box, GTK_ALIGN_CENTER);
 
+  // Because we are setting only an icon, let the inner button be labeled by us, so the accessible label can be overridden
+  gtk_accessible_update_relation (GTK_ACCESSIBLE (menu_button->button), GTK_ACCESSIBLE_RELATION_LABELLED_BY, menu_button, NULL, -1);
+
   image_widget = g_object_new (GTK_TYPE_IMAGE,
                                "accessible-role", GTK_ACCESSIBLE_ROLE_PRESENTATION,
                                "icon-name", icon_name,
@@ -1071,6 +1078,9 @@ gtk_menu_button_set_label (GtkMenuButton *menu_button,
   gtk_button_set_child (GTK_BUTTON (menu_button->button), box);
   menu_button->label_widget = label_widget;
 
+  // When the user explicitly set a label assume that it should be announced by assistive technologies as well
+  gtk_accessible_update_relation (GTK_ACCESSIBLE (menu_button->button), GTK_ACCESSIBLE_RELATION_LABELLED_BY, menu_button->label_widget, NULL, -1);
+
   menu_button->image_widget = NULL;
 
   update_arrow (menu_button);