[atk/plug_child] atkplug: Add atk_plug_new_child



commit 68aa8334eef35a33f71bcc8240c3e9e533933d50
Author: Samuel Thibault <samuel thibault ens-lyon org>
Date:   Fri Aug 23 18:30:42 2019 +0200

    atkplug: Add atk_plug_new_child
    
    As discussed on
    
    https://mail.gnome.org/archives/gnome-accessibility-devel/2019-August/msg00001.html
    
    in some cases such as gtk, one can't use the AtkPlug type directly as
    accessible object for the toplevel widget of the application, and one
    has to make AtkPlug a parent of the standard accessible object for that
    toplevel widget.
    
    atk_plug_new_child() allows to achieve this easily by making the new
    AtkPlug a parent of the child passed as parameter.

 atk/atkplug.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 84 insertions(+), 1 deletion(-)
---
diff --git a/atk/atkplug.c b/atk/atkplug.c
index ceb3e5d..eaa1dd8 100644
--- a/atk/atkplug.c
+++ b/atk/atkplug.c
@@ -34,8 +34,57 @@
 
 static void atk_component_interface_init (AtkComponentIface *iface);
 
+typedef struct {
+  AtkObject *child;
+} AtkPlugPrivate;
+
+static gint AtkPlug_private_offset;
+
 G_DEFINE_TYPE_WITH_CODE (AtkPlug, atk_plug, ATK_TYPE_OBJECT,
-                         G_IMPLEMENT_INTERFACE (ATK_TYPE_COMPONENT, atk_component_interface_init))
+                         G_IMPLEMENT_INTERFACE (ATK_TYPE_COMPONENT, atk_component_interface_init)
+                         G_ADD_PRIVATE(AtkPlug))
+
+static AtkObject*
+atk_plug_ref_child (AtkObject *obj, int i)
+{
+  AtkPlugPrivate *private = atk_plug_get_instance_private (ATK_PLUG (obj));
+  AtkObject *child;
+
+  if (i != 0)
+    return NULL;
+
+  child = private->child;
+
+  if (child == NULL)
+    return NULL;
+
+  return g_object_ref (child);
+}
+
+static int
+atk_plug_get_n_children (AtkObject *obj)
+{
+  AtkPlugPrivate *private = atk_plug_get_instance_private (ATK_PLUG (obj));
+
+  if (private->child == NULL)
+    return 0;
+
+  return 1;
+}
+
+static AtkStateSet*
+atk_plug_ref_state_set (AtkObject *obj)
+{
+  AtkPlugPrivate *private = atk_plug_get_instance_private (ATK_PLUG (obj));
+  AtkObject *child;
+
+  child = private->child;
+
+  if (child == NULL)
+    return NULL;
+
+  return atk_object_ref_state_set (child);
+}
 
 static void
 atk_plug_init (AtkPlug* obj)
@@ -49,7 +98,16 @@ atk_plug_init (AtkPlug* obj)
 static void
 atk_plug_class_init (AtkPlugClass* klass)
 {
+  AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
+
+  if (AtkPlug_private_offset != 0)
+    g_type_class_adjust_private_offset (klass, &AtkPlug_private_offset);
+
   klass->get_object_id = NULL;
+
+  class->get_n_children = atk_plug_get_n_children;
+  class->ref_child      = atk_plug_ref_child;
+  class->ref_state_set  = atk_plug_ref_state_set;
 }
 
 static void
@@ -72,6 +130,31 @@ atk_plug_new (void)
   return g_object_new (ATK_TYPE_PLUG, NULL);
 }
 
+/**
+ * atk_plug_new_child:
+ * @child: an #AtkObject to be set as child of the new #AtkPlug
+ *
+ * Creates a new #AtkPlug instance, and make it a parent of the child parameter.
+ *
+ * Returns: (transfer full): the newly created #AtkPlug
+ *
+ * Since: 2.35.0
+ */
+AtkObject *
+atk_plug_new_child (AtkObject *child)
+{
+  AtkObject *accessible;
+  AtkPlugPrivate *private;
+
+  accessible = atk_plug_new ();
+  private = atk_plug_get_instance_private (ATK_PLUG (accessible));
+
+  private->child = child;
+  atk_object_set_parent (child, accessible);
+
+  return accessible;
+}
+
 /**
  * atk_plug_get_id:
  * @plug: an #AtkPlug


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