[atk: 1/2] Add accessible_id property



commit 5fa247364e1e8c09cbf686cb063d2e6107d5e196
Author: Samuel Thibault <samuel thibault ens-lyon org>
Date:   Wed Apr 3 15:59:35 2019 +0200

    Add accessible_id property
    
    - Add AtkObjectPrivate structure containing accessible_id field.
    - Register AtkObjectPrivate structure to AtkObject class.
    - g_type_class_adjust_private_offset appeared with glib 2.38.
    - Add atk_object_[gs]et_accessible_id to manipulate it.
    - Add PROP_ACCESSIBLE_ID
    
    Fixes #9

 atk/atkobject.c       | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++
 atk/atkobject.h       |  7 +++++
 docs/atk-sections.txt |  2 ++
 meson.build           |  2 +-
 4 files changed, 81 insertions(+), 1 deletion(-)
---
diff --git a/atk/atkobject.c b/atk/atkobject.c
index d50be54..110bf2e 100644
--- a/atk/atkobject.c
+++ b/atk/atkobject.c
@@ -78,6 +78,7 @@ enum
   PROP_TABLE_SUMMARY,
   PROP_TABLE_CAPTION_OBJECT,
   PROP_HYPERTEXT_NUM_LINKS,
+  PROP_ACCESSIBLE_ID,
   PROP_LAST         /* gobject convention */
 };
 
@@ -214,6 +215,12 @@ enum {
   N_("description value")
 #endif /* 0 */
 
+typedef struct {
+  gchar *accessible_id;
+} AtkObjectPrivate;
+
+static gint AtkObject_private_offset;
+
 static void            atk_object_class_init        (AtkObjectClass  *klass);
 static void            atk_object_init              (AtkObject       *accessible,
                                                      AtkObjectClass  *klass);
@@ -321,10 +328,19 @@ atk_object_get_type (void)
         (GInstanceInitFunc) atk_object_init,
       } ;
       type = g_type_register_static (G_TYPE_OBJECT, "AtkObject", &typeInfo, 0) ;
+
+      AtkObject_private_offset =
+        g_type_add_instance_private (type, sizeof (AtkObjectPrivate));
     }
   return type;
 }
 
+static inline gpointer
+atk_object_get_instance_private (AtkObject *self)
+{
+  return (G_STRUCT_MEMBER_P (self, AtkObject_private_offset));
+}
+
 static void
 atk_object_class_init (AtkObjectClass *klass)
 {
@@ -332,6 +348,9 @@ atk_object_class_init (AtkObjectClass *klass)
 
   parent_class = g_type_class_peek_parent (klass);
 
+  if (AtkObject_private_offset != 0)
+    g_type_class_adjust_private_offset (klass, &AtkObject_private_offset);
+
   gobject_class->set_property = atk_object_real_set_property;
   gobject_class->get_property = atk_object_real_get_property;
   gobject_class->finalize = atk_object_finalize;
@@ -670,11 +689,14 @@ static void
 atk_object_init  (AtkObject        *accessible,
                   AtkObjectClass   *klass)
 {
+  AtkObjectPrivate *private = atk_object_get_instance_private (accessible);
+
   accessible->name = NULL;
   accessible->description = NULL;
   accessible->accessible_parent = NULL;
   accessible->relation_set = atk_relation_set_new();
   accessible->role = ATK_ROLE_UNKNOWN;
+  private->accessible_id = NULL;
 }
 
 GType
@@ -1326,6 +1348,9 @@ atk_object_real_set_property (GObject      *object,
       if (ATK_IS_TABLE (accessible))
         atk_table_set_caption (ATK_TABLE (accessible), g_value_get_object (value));
       break;
+    case PROP_ACCESSIBLE_ID:
+      atk_object_set_accessible_id (accessible, g_value_get_string (value));
+      break;
     default:
       break;
     }
@@ -1379,6 +1404,9 @@ atk_object_real_get_property (GObject      *object,
       if (ATK_IS_HYPERTEXT (accessible))
         g_value_set_int (value, atk_hypertext_get_n_links (ATK_HYPERTEXT (accessible)));
       break;
+    case PROP_ACCESSIBLE_ID:
+      g_value_set_string (value, atk_object_get_accessible_id (accessible));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -1389,10 +1417,12 @@ static void
 atk_object_finalize (GObject *object)
 {
   AtkObject        *accessible;
+  AtkObjectPrivate *private;
 
   g_return_if_fail (ATK_IS_OBJECT (object));
 
   accessible = ATK_OBJECT (object);
+  private = atk_object_get_instance_private (accessible);
 
   g_free (accessible->name);
   g_free (accessible->description);
@@ -1406,6 +1436,8 @@ atk_object_finalize (GObject *object)
   if (accessible->accessible_parent)
     g_object_unref (accessible->accessible_parent);
 
+  g_free(private->accessible_id);
+
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
@@ -1709,6 +1741,45 @@ atk_object_remove_relationship (AtkObject       *object,
   return ret;
 }
 
+/**
+ * atk_object_get_accessible_id:
+ * @accessible: an #AtkObject
+ *
+ * Gets the accessible id of the accessible.
+ *
+ * Since: 2.34
+ *
+ * Returns: a character string representing the accessible id of the object, or
+ * NULL if no such string was set.
+ **/
+const gchar*
+atk_object_get_accessible_id (AtkObject *accessible)
+{
+  AtkObjectPrivate *private = atk_object_get_instance_private (accessible);
+  return private->accessible_id;
+}
+
+/**
+ * atk_object_set_accessible_id:
+ * @accessible: an #AtkObject
+ * @name: a character string to be set as the accessible id
+ *
+ * Sets the accessible ID of the accessible.  This is not meant to be presented
+ * to the user, but to be an ID which is stable over application development.
+ * Typically, this is the gtkbuilder ID. Such an ID will be available for
+ * instance to identify a given well-known accessible object for tailored screen
+ * reading, or for automatic regression testing.
+ *
+ * Since: 2.34
+ **/
+void
+atk_object_set_accessible_id (AtkObject *accessible, const gchar *id)
+{
+  AtkObjectPrivate *private = atk_object_get_instance_private (accessible);
+  g_free (private->accessible_id);
+  private->accessible_id = g_strdup (id);
+}
+
 static void
 atk_object_real_initialize (AtkObject *accessible,
                             gpointer  data)
diff --git a/atk/atkobject.h b/atk/atkobject.h
index 711dda7..56dfb2f 100644
--- a/atk/atkobject.h
+++ b/atk/atkobject.h
@@ -766,6 +766,13 @@ AtkRole               atk_role_register                        (const gchar *nam
 ATK_AVAILABLE_IN_2_8
 const gchar*          atk_object_get_object_locale             (AtkObject   *accessible);
 
+ATK_AVAILABLE_IN_ALL
+const gchar*          atk_object_get_accessible_id             (AtkObject   *accessible);
+
+ATK_AVAILABLE_IN_ALL
+void                  atk_object_set_accessible_id             (AtkObject   *accessible,
+                                                                const gchar *name);
+
 G_END_DECLS
 
 #endif /* __ATK_OBJECT_H__ */
diff --git a/docs/atk-sections.txt b/docs/atk-sections.txt
index 5200dbe..3639286 100644
--- a/docs/atk-sections.txt
+++ b/docs/atk-sections.txt
@@ -196,6 +196,8 @@ atk_object_add_relationship
 atk_object_remove_relationship
 atk_object_get_attributes
 atk_object_get_object_locale
+atk_object_get_accessible_id
+atk_object_set_accessible_id
 atk_role_get_name
 atk_role_get_localized_name
 atk_role_for_name
diff --git a/meson.build b/meson.build
index 6d1ea59..8867161 100644
--- a/meson.build
+++ b/meson.build
@@ -92,7 +92,7 @@ foreach f: checked_funcs
 endforeach
 
 # Dependencies
-glib_req_version = '>= 2.31.2'
+glib_req_version = '>= 2.38.0'
 
 glib_dep = [dependency('glib-2.0', version: glib_req_version,
                           fallback : ['glib', 'libglib_dep']),


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