[gtk/wip/ebassi/a11y-drop-atk: 21/24] Plug GtkATContext into GtkAccessible



commit 7b48744a5bded9353108df0e2fcb86f9ef33ff68
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Wed Jul 8 16:56:31 2020 +0100

    Plug GtkATContext into GtkAccessible
    
    An Accessible implementation must create an ATContext object. UI
    elements are supposed to interact with the GtkAccessible API, but we
    expose GtkATContext to allow patterns like delegation.

 gtk/gtkaccessible.c        | 75 +++++++++++++++++++++++++++++++++++++++++++++-
 gtk/gtkaccessible.h        |  8 ++---
 gtk/gtkaccessibleprivate.h | 37 +++++++++++++++++++++++
 3 files changed, 115 insertions(+), 5 deletions(-)
---
diff --git a/gtk/gtkaccessible.c b/gtk/gtkaccessible.c
index d8187b60c0..3c0a9ffbdb 100644
--- a/gtk/gtkaccessible.c
+++ b/gtk/gtkaccessible.c
@@ -18,9 +18,36 @@
  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  */
 
+/**
+ * SECTION:gtkaccessible
+ * @Title: GtkAccessible
+ * @Short_description: Accessible interface
+ *
+ * GtkAccessible provides an interface for describing a UI element, like a
+ * #GtkWidget, in a way that can be consumed by Assistive Technologies, or
+ * “AT”. Every accessible implementation has:
+ *
+ *  - a “role”, represented by a value of the #GtkAccessibleRole enumeration
+ *  - a “state”, represented by a set of #GtkAccessibleState and
+ *    #GtkAccessibleProperty values
+ *
+ * The role cannot be changed after instantiating a #GtkAccessible
+ * implementation.
+ *
+ * The state is updated every time a UI element's state changes in a way that
+ * should be reflected by assistive technologies. For instance, if a #GtkWidget
+ * visibility changes, the %GTK_ACCESSIBLE_STATE_HIDDEN state will also change
+ * to reflect the #GtkWidget:visible property.
+ */
+
 #include "config.h"
 
-#include "gtkaccessible.h"
+#include "gtkaccessibleprivate.h"
+
+#include "gtkatcontextprivate.h"
+#include "gtkenums.h"
+
+#include <stdarg.h>
 
 G_DEFINE_INTERFACE (GtkAccessible, gtk_accessible, G_TYPE_OBJECT)
 
@@ -28,3 +55,49 @@ static void
 gtk_accessible_default_init (GtkAccessibleInterface *iface)
 {
 }
+
+GtkATContext *
+gtk_accessible_get_at_context (GtkAccessible *self)
+{
+  g_return_val_if_fail (GTK_IS_ACCESSIBLE (self), NULL);
+
+  return GTK_ACCESSIBLE_GET_IFACE (self)->get_at_context (self);
+}
+
+void
+gtk_accessible_update_state (GtkAccessible *self,
+                             GtkAccessibleState  first_state,
+                             ...)
+{
+  GtkAccessibleState state;
+  GtkATContext *context;
+  va_list args;
+
+  g_return_if_fail (GTK_IS_ACCESSIBLE (self));
+
+  context = gtk_accessible_get_at_context (self);
+  if (context == NULL)
+    return;
+
+  va_start (args, first_state);
+
+  state = first_state;
+
+  while (state != GTK_ACCESSIBLE_STATE_NONE)
+    {
+      GtkAccessibleValue *value = gtk_accessible_value_collect_for_state (state, &args);
+
+      if (value == NULL)
+        goto out;
+
+      gtk_at_context_set_state (context, state, value);
+      gtk_accessible_value_unref (value);
+
+      state = va_arg (args, int);
+    }
+
+  gtk_at_context_update_state (context);
+
+out:
+  va_end (args);
+}
diff --git a/gtk/gtkaccessible.h b/gtk/gtkaccessible.h
index d54d21a2d0..6946916980 100644
--- a/gtk/gtkaccessible.h
+++ b/gtk/gtkaccessible.h
@@ -31,9 +31,9 @@ G_BEGIN_DECLS
 GDK_AVAILABLE_IN_ALL
 G_DECLARE_INTERFACE (GtkAccessible, gtk_accessible, GTK, ACCESSIBLE, GObject)
 
-struct _GtkAccessibleInterface
-{
-  GTypeInterface g_iface;
-};
+GDK_AVAILABLE_IN_ALL
+void    gtk_accessible_update_state     (GtkAccessible      *self,
+                                         GtkAccessibleState  first_state,
+                                         ...);
 
 G_END_DECLS
diff --git a/gtk/gtkaccessibleprivate.h b/gtk/gtkaccessibleprivate.h
new file mode 100644
index 0000000000..aa5701cf50
--- /dev/null
+++ b/gtk/gtkaccessibleprivate.h
@@ -0,0 +1,37 @@
+/* gtkaccessibleprivate.h: Accessible interface
+ *
+ * Copyright 2020  GNOME Foundation
+ *
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "gtkaccessible.h"
+#include "gtkatcontext.h"
+
+G_BEGIN_DECLS
+
+struct _GtkAccessibleInterface
+{
+  GTypeInterface g_iface;
+
+  GtkATContext *        (* get_at_context)      (GtkAccessible *self);
+};
+
+GtkATContext *  gtk_accessible_get_at_context   (GtkAccessible *self);
+
+G_END_DECLS


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]