a11y: Simplify GtkAccessible implementation for editables
authorLukáš Tyrychtr <lukastyrychtr@gmail.com>
Mon, 16 Jan 2023 10:39:41 +0000 (11:39 +0100)
committerEmmanuele Bassi <ebassi@gnome.org>
Fri, 3 Feb 2023 15:08:06 +0000 (16:08 +0100)
This commit implements the idea brought up in #5032, and provides a
simple function for GtkEditable implementations using a delegate object.
The accessible state is proxied from the outher GtkEditable to the
delegate.

gtk/gtkeditable.c
gtk/gtkeditable.h
gtk/gtkentry.c
gtk/gtkpasswordentry.c
gtk/gtksearchentry.c
gtk/gtkspinbutton.c

index a43e34550a0856d5e38955c183ac8edd61f9d5af..ce2e9a9b5a380dcdbcd40326b64d4f4da60d7a54 100644 (file)
@@ -19,7 +19,7 @@
  * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
  * file for a list of people on the GTK+ Team.  See the ChangeLog
  * files for a list of changes.  These files are distributed with
- * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
  */
 
 /**
@@ -485,7 +485,7 @@ gtk_editable_insert_text (GtkEditable *editable,
 
   if (length < 0)
     length = strlen (text);
-  
+
   GTK_EDITABLE_GET_IFACE (editable)->do_insert_text (editable, text, length, position);
 }
 
@@ -1181,3 +1181,54 @@ gtk_editable_delegate_get_property (GObject    *object,
 
   return TRUE;
 }
+
+/**
+ * gtk_editable_delegate_get_accessible_platform_state:
+ * @editable: a `GtkEditable` implementation
+ * @state: what kind of accessible state to retrieve
+ *
+ * Retrieves the accessible platform state from the editable delegate.
+ *
+ * This is an helper function to retrieve the accessible state for
+ * `GtkEditable` interface implementations using a delegate pattern.
+ *
+ * You should call this function in your editable widget implementation
+ * of the [vfunc@Gtk.Accessible.get_platform_state] virtual function, for
+ * instance:
+ *
+ * ```c
+ * static void
+ * accessible_interface_init (GtkAccessibleInterface *iface)
+ * {
+ *   iface->get_platform_state = your_editable_get_accessible_platform_state;
+ * }
+ *
+ * static gboolean
+ * your_editable_get_accessible_platform_state (GtkAccessible *accessible,
+ *                                              GtkAccessiblePlatformState state)
+ * {
+ *   return gtk_editable_delegate_get_accessible_platform_state (GTK_EDITABLE (accessible), state);
+ * }
+ * ```
+ *
+ * Since: 4.10
+ */
+gboolean
+gtk_editable_delegate_get_accessible_platform_state (GtkEditable                *editable,
+                                                     GtkAccessiblePlatformState  state)
+{
+  GtkWidget *delegate = GTK_WIDGET (gtk_editable_get_delegate (editable));
+
+  switch (state)
+    {
+    case GTK_ACCESSIBLE_PLATFORM_STATE_FOCUSABLE:
+      return gtk_widget_get_focusable (delegate);
+    case GTK_ACCESSIBLE_PLATFORM_STATE_FOCUSED:
+      return gtk_widget_has_focus (delegate);
+    case GTK_ACCESSIBLE_PLATFORM_STATE_ACTIVE:
+      return FALSE;
+    default:
+      g_assert_not_reached ();
+      return FALSE;
+    }
+}
index c7ca5caf04a0c49d4b3d92626857e6e950676042..7ca3da4034f1e24619337814ad76d7f74a17252e 100644 (file)
@@ -30,9 +30,9 @@
 #error "Only <gtk/gtk.h> can be included directly."
 #endif
 
+#include <gtk/gtkaccessible.h>
 #include <gtk/gtkwidget.h>
 
-
 G_BEGIN_DECLS
 
 #define GTK_TYPE_EDITABLE             (gtk_editable_get_type ())
@@ -194,6 +194,9 @@ gboolean     gtk_editable_delegate_get_property (GObject      *object,
                                                  guint         prop_id,
                                                  GValue       *value,
                                                  GParamSpec   *pspec);
+GDK_AVAILABLE_IN_4_10
+gboolean gtk_editable_delegate_get_accessible_platform_state (GtkEditable                *editable,
+                                                              GtkAccessiblePlatformState  state);
 
 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkEditable, g_object_unref)
 
index 6fd837a2769a298f86e0f05735c2f19555be9716..23b6868064d768aa86c4b2f1926bcb1e47aa62e8 100644 (file)
@@ -339,20 +339,7 @@ static gboolean
 gtk_entry_accessible_get_platform_state (GtkAccessible              *self,
                                          GtkAccessiblePlatformState  state)
 {
-  GtkEntry *entry = GTK_ENTRY (self);
-  GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry);
-
-  switch (state)
-    {
-    case GTK_ACCESSIBLE_PLATFORM_STATE_FOCUSABLE:
-      return gtk_widget_get_focusable (GTK_WIDGET (priv->text));
-    case GTK_ACCESSIBLE_PLATFORM_STATE_FOCUSED:
-      return gtk_widget_has_focus (GTK_WIDGET (priv->text));
-    case GTK_ACCESSIBLE_PLATFORM_STATE_ACTIVE:
-      return FALSE;
-    default:
-      g_assert_not_reached ();
-    }
+  return gtk_editable_delegate_get_accessible_platform_state (GTK_EDITABLE (self), state);
 }
 
 static void
index b540a27fca6d0e121331cf06a2d83738f8c3544d..72c3fd518947ff6042ab02f2cfebc847e56c24b6 100644 (file)
@@ -550,19 +550,7 @@ static gboolean
 gtk_password_entry_accessible_get_platform_state (GtkAccessible              *self,
                                                   GtkAccessiblePlatformState  state)
 {
-  GtkPasswordEntry *entry = GTK_PASSWORD_ENTRY (self);
-
-  switch (state)
-    {
-    case GTK_ACCESSIBLE_PLATFORM_STATE_FOCUSABLE:
-      return gtk_widget_get_focusable (GTK_WIDGET (entry->entry));
-    case GTK_ACCESSIBLE_PLATFORM_STATE_FOCUSED:
-      return gtk_widget_has_focus (GTK_WIDGET (entry->entry));
-    case GTK_ACCESSIBLE_PLATFORM_STATE_ACTIVE:
-      return FALSE;
-    default:
-      g_assert_not_reached ();
-    }
+  return gtk_editable_delegate_get_accessible_platform_state (GTK_EDITABLE (self), state);
 }
 
 static void
index 5b5b3b4d2568bb8129513be6a781c63c0e4ebfa0..d11c65943199ce691aab7b22d284cafd22a4db9a 100644 (file)
@@ -484,19 +484,7 @@ static gboolean
 gtk_search_entry_accessible_get_platform_state (GtkAccessible              *self,
                                                 GtkAccessiblePlatformState  state)
 {
-  GtkSearchEntry *entry = GTK_SEARCH_ENTRY (self);
-
-  switch (state)
-    {
-    case GTK_ACCESSIBLE_PLATFORM_STATE_FOCUSABLE:
-      return gtk_widget_get_focusable (GTK_WIDGET (entry->entry));
-    case GTK_ACCESSIBLE_PLATFORM_STATE_FOCUSED:
-      return gtk_widget_has_focus (GTK_WIDGET (entry->entry));
-    case GTK_ACCESSIBLE_PLATFORM_STATE_ACTIVE:
-      return FALSE;
-    default:
-      g_assert_not_reached ();
-    }
+  return gtk_editable_delegate_get_accessible_platform_state (GTK_EDITABLE (self), state);
 }
 
 static void
index 27efc3c837ed71e5338253edb7e0296db2c73a9c..75d60b0000aa5cececd770ca8885f88ec7f5a6c3 100644 (file)
@@ -614,25 +614,14 @@ static gboolean
 gtk_spin_button_accessible_get_platform_state (GtkAccessible              *self,
                                                GtkAccessiblePlatformState  state)
 {
-  GtkSpinButton *spin_button = GTK_SPIN_BUTTON (self);
-
-  switch (state)
-    {
-    case GTK_ACCESSIBLE_PLATFORM_STATE_FOCUSABLE:
-      return gtk_widget_get_focusable (spin_button->entry);
-    case GTK_ACCESSIBLE_PLATFORM_STATE_FOCUSED:
-      return gtk_widget_has_focus (spin_button->entry);
-    case GTK_ACCESSIBLE_PLATFORM_STATE_ACTIVE:
-      return FALSE;
-    default:
-      g_assert_not_reached ();
-    }
+  return gtk_editable_delegate_get_accessible_platform_state (GTK_EDITABLE (self), state);
 }
 
 static void
 gtk_spin_button_accessible_init (GtkAccessibleInterface *iface)
 {
   GtkAccessibleInterface *parent_iface = g_type_interface_peek_parent (iface);
+
   iface->get_at_context = parent_iface->get_at_context;
   iface->get_platform_state = gtk_spin_button_accessible_get_platform_state;
 }