[atk/plug_child] atkplug: Add atk_plug_new_child
- From: Samuel Thibault <sthibaul src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [atk/plug_child] atkplug: Add atk_plug_new_child
- Date: Fri, 23 Aug 2019 16:37:19 +0000 (UTC)
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]