diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2019-09-10 12:16:15 +0000 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2019-09-10 12:16:15 +0000 |
commit | 2fbd3a6a55c4d108d33ed8e9b00209a0b6f3e99d (patch) | |
tree | c2f64149951820e46a90a792e5aa9065504b76e3 | |
parent | 7a4b744208274195dcb48a27b3464a338d1070cd (diff) | |
parent | 9b1a76fbae3e26f5215ed10df04b87b20dbbfc8b (diff) | |
download | atk-2fbd3a6a55c4d108d33ed8e9b00209a0b6f3e99d.tar.gz |
Merge branch 'plug_child' into 'master'
atkplug: Add atk_plug_new_child
See merge request GNOME/atk!27
-rw-r--r-- | atk/atkplug.c | 91 | ||||
-rw-r--r-- | atk/atkplug.h | 6 | ||||
-rw-r--r-- | atk/atkversion.h.in | 14 |
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 |