Add gtk_accessible_role_is_abstract
authorMatthias Clasen <mclasen@redhat.com>
Fri, 16 Jun 2023 18:55:06 +0000 (14:55 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 19 Jun 2023 22:30:41 +0000 (18:30 -0400)
Move this code from the a11y overlay in the inspector.
It will be used more widely, going forward.

gtk/gtkaccessible.c
gtk/gtkaccessibleprivate.h
gtk/inspector/a11yoverlay.c

index 4cba3b637f68dcc869889fc1c4225b015b9e50ff..2294239d4c1f6b2ba8d6eebbc2e4a2b1d375acf6 100644 (file)
@@ -881,6 +881,42 @@ gtk_accessible_role_is_range_subclass (GtkAccessibleRole role)
   return FALSE;
 }
 
+/* < private >
+ * gtk_accessible_role_is_abstract:
+ * @role: a `GtkAccessibleRole`
+ *
+ * Checks if @role is considered abstract and should not be used
+ * for concrete widgets.
+ *
+ * Returns: whether the role is abstract
+ */
+gboolean
+gtk_accessible_role_is_abstract (GtkAccessibleRole role)
+{
+  switch ((int) role)
+    {
+    case GTK_ACCESSIBLE_ROLE_COMMAND:
+    case GTK_ACCESSIBLE_ROLE_COMPOSITE:
+    case GTK_ACCESSIBLE_ROLE_INPUT:
+    case GTK_ACCESSIBLE_ROLE_LANDMARK:
+    case GTK_ACCESSIBLE_ROLE_RANGE:
+    case GTK_ACCESSIBLE_ROLE_SECTION:
+    case GTK_ACCESSIBLE_ROLE_SECTION_HEAD:
+    case GTK_ACCESSIBLE_ROLE_SELECT:
+    case GTK_ACCESSIBLE_ROLE_STRUCTURE:
+#if 0
+    /* FIXME: ARIA considers these abstract.
+     * But we are using them for widgets
+     */
+    case GTK_ACCESSIBLE_ROLE_WIDGET:
+    case GTK_ACCESSIBLE_ROLE_WINDOW:
+#endif
+      return TRUE;
+    default:
+      return FALSE;
+    }
+}
+
 /*< private >
  * gtk_accessible_platform_changed:
  * @self: a `GtkAccessible`
index 326506e626a55d2f9a10063caa9936e147f7b922..8be47d7bcb6239ae2ba1fd81c49bec2e25dfd020 100644 (file)
@@ -55,7 +55,9 @@ typedef enum {
 const char *    gtk_accessible_role_to_name     (GtkAccessibleRole  role,
                                                  const char        *domain);
 
-gboolean gtk_accessible_role_is_range_subclass (GtkAccessibleRole role);
+gboolean        gtk_accessible_role_is_range_subclass (GtkAccessibleRole role);
+
+gboolean        gtk_accessible_role_is_abstract       (GtkAccessibleRole role);
 
 /* < private >
  * GtkAccessibleNaming:
index 481e780cc29efaf92ac5e17b7c33842d92a558a1..25566539eb70b0dde0c600863ceae0dca796aadc 100644 (file)
@@ -46,25 +46,6 @@ struct _GtkA11yOverlayClass
 
 G_DEFINE_TYPE (GtkA11yOverlay, gtk_a11y_overlay, GTK_TYPE_INSPECTOR_OVERLAY)
 
-static GtkAccessibleRole abstract_roles[] = {
-  GTK_ACCESSIBLE_ROLE_COMMAND,
-  GTK_ACCESSIBLE_ROLE_COMPOSITE,
-  GTK_ACCESSIBLE_ROLE_INPUT,
-  GTK_ACCESSIBLE_ROLE_LANDMARK,
-  GTK_ACCESSIBLE_ROLE_RANGE,
-  GTK_ACCESSIBLE_ROLE_SECTION,
-  GTK_ACCESSIBLE_ROLE_SECTION_HEAD,
-  GTK_ACCESSIBLE_ROLE_SELECT,
-  GTK_ACCESSIBLE_ROLE_STRUCTURE,
-#if 0
-  /* FIXME: ARIA considers these abstract.
-   * But we are using them for widgets
-   */
-  GTK_ACCESSIBLE_ROLE_WIDGET,
-  GTK_ACCESSIBLE_ROLE_WINDOW
-#endif
-};
-
 typedef enum
 {
   SEVERITY_GOOD,
@@ -152,14 +133,10 @@ check_accessibility_errors (GtkWidget  *widget,
     gtk_at_context_realize (context);
 
   /* Check for abstract roles */
-  for (unsigned int i = 0; i < G_N_ELEMENTS (abstract_roles); i++)
+  if (gtk_accessible_role_is_abstract (role))
     {
-      if (role == abstract_roles[i])
-        {
-          *hint = g_strdup_printf ("%s is an abstract role", role_name);
-
-          return SEVERITY_ERROR;
-        }
+      *hint = g_strdup_printf ("%s is an abstract role", role_name);
+      return SEVERITY_ERROR;
     }
 
   /* Check for name and description */