Use generic as default accessible role
authorMatthias Clasen <mclasen@redhat.com>
Fri, 16 Jun 2023 19:26:03 +0000 (15:26 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 19 Jun 2023 22:38:58 +0000 (18:38 -0400)
The ARIA specs want widget to be abstract role.
We should respect that and use 'generic' instead.

gtk/a11y/gtkatspiutils.c
gtk/gtkgizmo.c
gtk/gtkshortcutsshortcut.c
gtk/gtkwidget.c

index 8b95bf179bc410ac9d0c19db1ff3d0f87556fefe..5fe56060208bedef01136473d7b18967f2b8a0d6 100644 (file)
@@ -85,7 +85,7 @@ gtk_accessible_role_to_atspi_role (GtkAccessibleRole role)
       return ATSPI_ROLE_FORM;
 
     case GTK_ACCESSIBLE_ROLE_GENERIC:
-      break;
+      return ATSPI_ROLE_FILLER;
 
     case GTK_ACCESSIBLE_ROLE_GRID:
       return ATSPI_ROLE_TABLE;
@@ -275,6 +275,7 @@ gtk_accessible_role_to_atspi_role (GtkAccessibleRole role)
 
     case GTK_ACCESSIBLE_ROLE_TOGGLE_BUTTON:
       return ATSPI_ROLE_TOGGLE_BUTTON;
+
     default:
       break;
     }
index 00162645b32e2150b1a03d530d372eb6f47c9e4a..5396d9b452a75dfe864b668dcdf20a32f12a8265 100644 (file)
@@ -132,7 +132,7 @@ gtk_gizmo_new (const char            *css_name,
                GtkGizmoGrabFocusFunc  grab_focus_func)
 {
   return gtk_gizmo_new_with_role (css_name,
-                                  GTK_ACCESSIBLE_ROLE_WIDGET,
+                                  GTK_ACCESSIBLE_ROLE_GENERIC,
                                   measure_func,
                                   allocate_func,
                                   snapshot_func,
index 287bc7af12f3182a5acd00166500f7b5e9fe5921..b9b8eead40e491445fd7c20668e80dee1166b508 100644 (file)
@@ -709,7 +709,7 @@ gtk_shortcuts_shortcut_class_init (GtkShortcutsShortcutClass *klass)
   /* It is semantically a label, but the label role has such specific meaning in Orca
    * as to be unusable in this context.
    */
-  gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_WIDGET);
+  gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_GENERIC);
 }
 
 static void
index 0246068460591428112f1919376644cf7c1e91bb..4f0b1f0be9a2191ce485c77d053b0db21cae6844 100644 (file)
@@ -904,27 +904,24 @@ gtk_widget_get_accessible_role (GtkWidget *self)
 {
   GtkWidgetPrivate *priv = gtk_widget_get_instance_private (self);
   GtkATContext *context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (self));
-  GtkWidgetClassPrivate *class_priv;
 
   if (context != NULL)
     {
-      GtkAccessibleRole role = GTK_ACCESSIBLE_ROLE_NONE;
+      GtkAccessibleRole role = GTK_ACCESSIBLE_ROLE_WIDGET;
 
       if (gtk_at_context_is_realized (context))
         role = gtk_at_context_get_accessible_role (context);
 
       g_object_unref (context);
 
-      if (role != GTK_ACCESSIBLE_ROLE_NONE)
+      if (role != GTK_ACCESSIBLE_ROLE_WIDGET)
         return role;
     }
 
   if (priv->accessible_role != GTK_ACCESSIBLE_ROLE_WIDGET)
     return priv->accessible_role;
 
-  class_priv = GTK_WIDGET_GET_CLASS (self)->priv;
-
-  return class_priv->accessible_role;
+  return GTK_WIDGET_GET_CLASS (self)->priv->accessible_role;
 }
 
 static void
@@ -2348,6 +2345,10 @@ gtk_widget_init (GTypeInstance *instance, gpointer g_class)
   priv->halign = GTK_ALIGN_FILL;
   priv->valign = GTK_ALIGN_FILL;
 
+  /* Note that we intentionally set this to an abstract role here.
+   * See gtk_widget_get_accessible_role() for where it gets overridden
+   * with GTK_ACCESSIBLE_ROLE_GENERIC.
+   */
   priv->accessible_role = GTK_ACCESSIBLE_ROLE_WIDGET;
 
   priv->width_request = -1;
@@ -2392,11 +2393,7 @@ gtk_widget_root_at_context (GtkWidget *self)
 
   /* Reset the accessible role to its current value */
   if (role == GTK_ACCESSIBLE_ROLE_WIDGET)
-    {
-      GtkWidgetClassPrivate *class_priv = GTK_WIDGET_GET_CLASS (self)->priv;
-
-      role = class_priv->accessible_role;
-    }
+    role = GTK_WIDGET_GET_CLASS (self)->priv->accessible_role;
 
   gtk_at_context_set_accessible_role (priv->at_context, role);
   if (priv->root)
@@ -8488,8 +8485,7 @@ static GtkATContext *
 create_at_context (GtkWidget *self)
 {
   GtkWidgetPrivate *priv = gtk_widget_get_instance_private (self);
-  GtkWidgetClass *widget_class = GTK_WIDGET_GET_CLASS (self);
-  GtkWidgetClassPrivate *class_priv = widget_class->priv;
+  GtkWidgetClassPrivate *class_priv = GTK_WIDGET_GET_CLASS (self)->priv;
   GtkAccessibleRole role;
 
   if (priv->in_destruction)
@@ -8503,17 +8499,19 @@ create_at_context (GtkWidget *self)
   /* Widgets have two options to set the accessible role: either they
    * define it in their class_init() function, and the role applies to
    * all instances; or an instance is created with the :accessible-role
-   * property (from GtkAccessible) set to anything other than the default
+   * property (from GtkAccessible) set to anything other than the initial
    * GTK_ACCESSIBLE_ROLE_WIDGET value.
    *
    * In either case, the accessible role cannot be set post-construction.
    */
+
   if (priv->accessible_role != GTK_ACCESSIBLE_ROLE_WIDGET)
     role = priv->accessible_role;
   else
     role = class_priv->accessible_role;
 
   priv->accessible_role = role;
+
   return gtk_at_context_create (role, GTK_ACCESSIBLE (self), gdk_display_get_default ());
 }
 
@@ -13189,12 +13187,9 @@ gtk_widget_class_set_accessible_role (GtkWidgetClass    *widget_class,
 GtkAccessibleRole
 gtk_widget_class_get_accessible_role (GtkWidgetClass *widget_class)
 {
-  GtkWidgetClassPrivate *priv;
+  g_return_val_if_fail (GTK_IS_WIDGET_CLASS (widget_class), GTK_ACCESSIBLE_ROLE_GENERIC);
 
-  g_return_val_if_fail (GTK_IS_WIDGET_CLASS (widget_class), GTK_ACCESSIBLE_ROLE_WIDGET);
-
-  priv = widget_class->priv;
-  return priv->accessible_role;
+  return widget_class->priv->accessible_role;
 }
 
 void