summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2019-08-23 18:30:42 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2019-09-10 12:51:47 +0200
commit9b1a76fbae3e26f5215ed10df04b87b20dbbfc8b (patch)
tree59a0e865c542e2713ac44b925b07ad49e71d55b0
parentf525d2a51a232ec23ec9177acb531b200be563d9 (diff)
downloadatk-9b1a76fbae3e26f5215ed10df04b87b20dbbfc8b.tar.gz
atkplug: Add atk_plug_set_child
As discussed on https://mail.gnome.org/archives/gnome-accessibility-devel/2019-August/msg00001.html In some cases, one can not use the AtkPlug type directly as accessible object for the toplevel widget of the application. For instance in the gtk case, GtkPlugAccessible can not inherit both from GtkWindowAccessible and from AtkPlug. In such a case, one can create, in addition to the standard accessible object for the toplevel widget, an AtkPlug object, and make the former the child of the latter by calling atk_plug_set_child().
-rw-r--r--atk/atkplug.c91
-rw-r--r--atk/atkplug.h6
-rw-r--r--atk/atkversion.h.in14
3 files changed, 108 insertions, 3 deletions
diff --git a/atk/atkplug.c b/atk/atkplug.c
index ceb3e5d..ddd86ed 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
@@ -73,6 +131,37 @@ atk_plug_new (void)
}
/**
+ * atk_plug_set_child:
+ * @plug: an #AtkPlug to be set as accessible parent of @child.
+ * @child: an #AtkObject to be set as accessible child of @plug.
+ *
+ * Sets @child as accessible child of @plug and @plug as accessible parent of
+ * @child. @child can be NULL.
+ *
+ * In some cases, one can not use the AtkPlug type directly as accessible
+ * object for the toplevel widget of the application. For instance in the gtk
+ * case, GtkPlugAccessible can not inherit both from GtkWindowAccessible and
+ * from AtkPlug. In such a case, one can create, in addition to the standard
+ * accessible object for the toplevel widget, an AtkPlug object, and make the
+ * former the child of the latter by calling atk_plug_set_child().
+ *
+ * Since: 2.35.0
+ */
+void
+atk_plug_set_child (AtkPlug *plug, AtkObject *child)
+{
+ AtkPlugPrivate *private = atk_plug_get_instance_private (plug);
+
+ if (private->child)
+ atk_object_set_parent (private->child, NULL);
+
+ private->child = child;
+
+ if (child)
+ atk_object_set_parent (child, ATK_OBJECT(plug));
+}
+
+/**
* atk_plug_get_id:
* @plug: an #AtkPlug
*
diff --git a/atk/atkplug.h b/atk/atkplug.h
index b1d83ff..ec5bc59 100644
--- a/atk/atkplug.h
+++ b/atk/atkplug.h
@@ -57,9 +57,11 @@ struct _AtkPlugClass
};
ATK_AVAILABLE_IN_ALL
-AtkObject* atk_plug_new (void);
+AtkObject* atk_plug_new (void);
+ATK_AVAILABLE_IN_2_36
+void atk_plug_set_child (AtkPlug *plug, AtkObject *child);
ATK_AVAILABLE_IN_ALL
-gchar* atk_plug_get_id (AtkPlug* plug);
+gchar* atk_plug_get_id (AtkPlug* plug);
G_END_DECLS
diff --git a/atk/atkversion.h.in b/atk/atkversion.h.in
index 36946db..78dc6e2 100644
--- a/atk/atkversion.h.in
+++ b/atk/atkversion.h.in
@@ -400,6 +400,20 @@
# define ATK_AVAILABLE_IN_2_30 _ATK_EXTERN
#endif
+#if ATK_VERSION_MIN_REQUIRED >= ATK_VERSION_2_36
+# define ATK_DEPRECATED_IN_2_36 ATK_DEPRECATED
+# define ATK_DEPRECATED_IN_2_36_FOR(f) ATK_DEPRECATED_FOR(f)
+#else
+# define ATK_DEPRECATED_IN_2_36 _ATK_EXTERN
+# define ATK_DEPRECATED_IN_2_36_FOR(f) _ATK_EXTERN
+#endif
+
+#if ATK_VERSION_MAX_ALLOWED < ATK_VERSION_2_36
+# define ATK_AVAILABLE_IN_2_36 ATK_UNAVAILABLE(2, 36)
+#else
+# define ATK_AVAILABLE_IN_2_36 _ATK_EXTERN
+#endif
+
ATK_AVAILABLE_IN_2_8
guint atk_get_major_version (void) G_GNUC_CONST;
ATK_AVAILABLE_IN_2_8