1 /* ATK - Accessibility Toolkit
2 * Copyright 2001 Sun Microsystems Inc.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
25 #include <glib-object.h>
26 #include <glib/gi18n-lib.h>
32 #undef FOCUS_EVENT /* <windows.h> pollutes the namespace
33 * like a six hundred pound gorilla */
37 #include "atkmarshal.h"
41 * @Short_description: The base object class for the Accessibility Toolkit API.
44 * This class is the primary class for accessibility support via the
45 * Accessibility ToolKit (ATK). Objects which are instances of
46 * #AtkObject (or instances of AtkObject-derived types) are queried
47 * for properties which relate basic (and generic) properties of a UI
48 * component such as name and description. Instances of #AtkObject
49 * may also be queried as to whether they implement other ATK
50 * interfaces (e.g. #AtkAction, #AtkComponent, etc.), as appropriate
51 * to the role which a given UI component plays in a user interface.
53 * All UI components in an application which provide useful
54 * information or services to the user must provide corresponding
55 * #AtkObject instances on request (in GTK+, for instance, usually on
56 * a call to #gtk_widget_get_accessible ()), either via ATK support
57 * built into the toolkit for the widget class or ancestor class, or
58 * in the case of custom widgets, if the inherited #AtkObject
59 * implementation is insufficient, via instances of a new #AtkObject
62 * See also: #AtkObjectFactory, #AtkRegistry. (GTK+ users see also
67 static GPtrArray
*role_names
= NULL
;
71 PROP_0
, /* gobject convention */
75 PROP_PARENT
, /* ancestry has changed */
81 PROP_TABLE_COLUMN_DESCRIPTION
,
82 PROP_TABLE_COLUMN_HEADER
,
83 PROP_TABLE_ROW_DESCRIPTION
,
84 PROP_TABLE_ROW_HEADER
,
86 PROP_TABLE_CAPTION_OBJECT
,
87 PROP_HYPERTEXT_NUM_LINKS
,
88 PROP_LAST
/* gobject convention */
97 ACTIVE_DESCENDANT_CHANGED
,
102 /* These are listed here for extraction by intltool */
105 N_("accelerator label")
112 N_("check menu item")
125 /* I know it looks wrong but that is what Java returns */
149 N_("radio menu item")
161 N_("table column header")
162 N_("table row header")
163 N_("tear off menu item")
181 N_("embedded component")
189 N_("redundant object")
192 N_("input method window")
195 N_("document spreadsheet")
196 N_("document presentation")
219 N_("description list")
220 N_("description term")
221 N_("description value")
224 static void atk_object_class_init (AtkObjectClass
*klass
);
225 static void atk_object_init (AtkObject
*accessible
,
226 AtkObjectClass
*klass
);
227 static AtkRelationSet
* atk_object_real_ref_relation_set
228 (AtkObject
*accessible
);
229 static void atk_object_real_initialize (AtkObject
*accessible
,
231 static void atk_object_real_set_property (GObject
*object
,
235 static void atk_object_real_get_property (GObject
*object
,
239 static void atk_object_finalize (GObject
*object
);
240 static const gchar
* atk_object_real_get_name (AtkObject
*object
);
241 static const gchar
* atk_object_real_get_description
243 static AtkObject
* atk_object_real_get_parent (AtkObject
*object
);
244 static AtkRole
atk_object_real_get_role (AtkObject
*object
);
245 static AtkLayer
atk_object_real_get_layer (AtkObject
*object
);
246 static AtkStateSet
* atk_object_real_ref_state_set
248 static void atk_object_real_set_name (AtkObject
*object
,
250 static void atk_object_real_set_description
252 const gchar
*description
);
253 static void atk_object_real_set_parent (AtkObject
*object
,
255 static void atk_object_real_set_role (AtkObject
*object
,
257 static void atk_object_notify (GObject
*obj
,
259 static const gchar
* atk_object_real_get_object_locale
262 static guint atk_object_signals
[LAST_SIGNAL
] = { 0, };
264 static gpointer parent_class
= NULL
;
266 static const gchar
* const atk_object_name_property_name
= "accessible-name";
267 static const gchar
* const atk_object_name_property_description
= "accessible-description";
268 static const gchar
* const atk_object_name_property_parent
= "accessible-parent";
269 static const gchar
* const atk_object_name_property_value
= "accessible-value";
270 static const gchar
* const atk_object_name_property_role
= "accessible-role";
271 static const gchar
* const atk_object_name_property_component_layer
= "accessible-component-layer";
272 static const gchar
* const atk_object_name_property_component_mdi_zorder
= "accessible-component-mdi-zorder";
273 static const gchar
* const atk_object_name_property_table_caption
= "accessible-table-caption";
274 static const gchar
* const atk_object_name_property_table_column_description
= "accessible-table-column-description";
275 static const gchar
* const atk_object_name_property_table_column_header
= "accessible-table-column-header";
276 static const gchar
* const atk_object_name_property_table_row_description
= "accessible-table-row-description";
277 static const gchar
* const atk_object_name_property_table_row_header
= "accessible-table-row-header";
278 static const gchar
* const atk_object_name_property_table_summary
= "accessible-table-summary";
279 static const gchar
* const atk_object_name_property_table_caption_object
= "accessible-table-caption-object";
280 static const gchar
* const atk_object_name_property_hypertext_num_links
= "accessible-hypertext-nlinks";
284 static HMODULE atk_dll
;
287 DllMain (HINSTANCE hinstDLL
,
293 case DLL_PROCESS_ATTACH
:
294 atk_dll
= (HMODULE
) hinstDLL
;
302 get_atk_locale_dir (void)
304 static gchar
*atk_localedir
= NULL
;
311 /* ATK_LOCALEDIR might end in either /lib/locale or
312 * /share/locale. Scan for that slash.
314 p
= ATK_LOCALEDIR
+ strlen (ATK_LOCALEDIR
);
320 root
= g_win32_get_package_installation_directory_of_module (atk_dll
);
321 temp
= g_build_filename (root
, p
, NULL
);
324 /* atk_localedir is passed to bindtextdomain() which isn't
327 atk_localedir
= g_win32_locale_filename_from_utf8 (temp
);
330 return atk_localedir
;
335 #define ATK_LOCALEDIR get_atk_locale_dir()
340 gettext_initialization (void)
343 static gboolean gettext_initialized
= FALSE
;
345 if (!gettext_initialized
)
347 const char *dir
= g_getenv ("ATK_ALT_LOCALEDIR");
349 gettext_initialized
= TRUE
;
353 bindtextdomain (GETTEXT_PACKAGE
, dir
);
354 #ifdef HAVE_BIND_TEXTDOMAIN_CODESET
355 bind_textdomain_codeset (GETTEXT_PACKAGE
, "UTF-8");
362 compact_role_name (gchar
*role_name
)
364 gchar
*p
= role_name
;
375 initialize_role_names ()
377 GTypeClass
*enum_class
;
378 GEnumValue
*enum_value
;
380 gchar
*role_name
= NULL
;
385 role_names
= g_ptr_array_new ();
386 enum_class
= g_type_class_ref (ATK_TYPE_ROLE
);
387 if (!G_IS_ENUM_CLASS(enum_class
))
390 for (i
= 0; i
< ATK_ROLE_LAST_DEFINED
; i
++)
392 enum_value
= g_enum_get_value (G_ENUM_CLASS (enum_class
), i
);
393 role_name
= g_strdup (enum_value
->value_nick
);
394 // We want the role names to be in the format "check button" and not "check-button"
395 compact_role_name (role_name
);
396 g_ptr_array_add (role_names
, role_name
);
399 g_type_class_unref (enum_class
);
404 atk_object_get_type (void)
406 static GType type
= 0;
410 static const GTypeInfo typeInfo
=
412 sizeof (AtkObjectClass
),
413 (GBaseInitFunc
) NULL
,
414 (GBaseFinalizeFunc
) NULL
,
415 (GClassInitFunc
) atk_object_class_init
,
416 (GClassFinalizeFunc
) NULL
,
420 (GInstanceInitFunc
) atk_object_init
,
422 type
= g_type_register_static (G_TYPE_OBJECT
, "AtkObject", &typeInfo
, 0) ;
428 atk_object_class_init (AtkObjectClass
*klass
)
430 GObjectClass
*gobject_class
= G_OBJECT_CLASS (klass
);
432 parent_class
= g_type_class_peek_parent (klass
);
434 gobject_class
->set_property
= atk_object_real_set_property
;
435 gobject_class
->get_property
= atk_object_real_get_property
;
436 gobject_class
->finalize
= atk_object_finalize
;
437 gobject_class
->notify
= atk_object_notify
;
439 klass
->get_name
= atk_object_real_get_name
;
440 klass
->get_description
= atk_object_real_get_description
;
441 klass
->get_parent
= atk_object_real_get_parent
;
442 klass
->get_n_children
= NULL
;
443 klass
->ref_child
= NULL
;
444 klass
->get_index_in_parent
= NULL
;
445 klass
->ref_relation_set
= atk_object_real_ref_relation_set
;
446 klass
->get_role
= atk_object_real_get_role
;
447 klass
->get_layer
= atk_object_real_get_layer
;
448 klass
->get_mdi_zorder
= NULL
;
449 klass
->initialize
= atk_object_real_initialize
;
450 klass
->ref_state_set
= atk_object_real_ref_state_set
;
451 klass
->set_name
= atk_object_real_set_name
;
452 klass
->set_description
= atk_object_real_set_description
;
453 klass
->set_parent
= atk_object_real_set_parent
;
454 klass
->set_role
= atk_object_real_set_role
;
455 klass
->get_object_locale
= atk_object_real_get_object_locale
;
458 * We do not define default signal handlers here
460 klass
->children_changed
= NULL
;
461 klass
->focus_event
= NULL
;
462 klass
->property_change
= NULL
;
463 klass
->visible_data_changed
= NULL
;
464 klass
->active_descendant_changed
= NULL
;
466 gettext_initialization ();
468 g_object_class_install_property (gobject_class
,
470 g_param_spec_string (atk_object_name_property_name
,
471 _("Accessible Name"),
472 _("Object instance\'s name formatted for assistive technology access"),
475 g_object_class_install_property (gobject_class
,
477 g_param_spec_string (atk_object_name_property_description
,
478 _("Accessible Description"),
479 _("Description of an object, formatted for assistive technology access"),
482 g_object_class_install_property (gobject_class
,
484 g_param_spec_object (atk_object_name_property_parent
,
485 _("Accessible Parent"),
486 _("Parent of the current accessible as returned by atk_object_get_parent()"),
489 g_object_class_install_property (gobject_class
,
491 g_param_spec_double (atk_object_name_property_value
,
492 _("Accessible Value"),
493 _("Is used to notify that the value has changed"),
498 g_object_class_install_property (gobject_class
,
500 g_param_spec_int (atk_object_name_property_role
,
501 _("Accessible Role"),
502 _("The accessible role of this object"),
507 g_object_class_install_property (gobject_class
,
509 g_param_spec_int (atk_object_name_property_component_layer
,
510 _("Accessible Layer"),
511 _("The accessible layer of this object"),
516 g_object_class_install_property (gobject_class
,
518 g_param_spec_int (atk_object_name_property_component_mdi_zorder
,
519 _("Accessible MDI Value"),
520 _("The accessible MDI value of this object"),
527 * AtkObject:accessible-table-caption:
531 * Deprecated: Since 1.3. Use table-caption-object instead.
533 g_object_class_install_property (gobject_class
,
535 g_param_spec_string (atk_object_name_property_table_caption
,
536 _("Accessible Table Caption"),
537 _("Is used to notify that the table caption has changed; this property should not be used. accessible-table-caption-object should be used instead"),
541 * AtkObject:accessible-table-column-header:
543 * Accessible table column header.
545 * Deprecated: Since 2.12. Use atk_table_get_column_header() and
546 * atk_table_set_column_header() instead.
548 g_object_class_install_property (gobject_class
,
549 PROP_TABLE_COLUMN_HEADER
,
550 g_param_spec_object (atk_object_name_property_table_column_header
,
551 _("Accessible Table Column Header"),
552 _("Is used to notify that the table column header has changed"),
557 * AtkObject:accessible-table-column-description:
559 * Accessible table column description.
561 * Deprecated: Since 2.12. Use atk_table_get_column_description()
562 * and atk_table_set_column_description() instead.
564 g_object_class_install_property (gobject_class
,
565 PROP_TABLE_COLUMN_DESCRIPTION
,
566 g_param_spec_string (atk_object_name_property_table_column_description
,
567 _("Accessible Table Column Description"),
568 _("Is used to notify that the table column description has changed"),
573 * AtkObject:accessible-table-row-header:
575 * Accessible table row header.
577 * Deprecated: Since 2.12. Use atk_table_get_row_header() and
578 * atk_table_set_row_header() instead.
580 g_object_class_install_property (gobject_class
,
581 PROP_TABLE_ROW_HEADER
,
582 g_param_spec_object (atk_object_name_property_table_row_header
,
583 _("Accessible Table Row Header"),
584 _("Is used to notify that the table row header has changed"),
588 * AtkObject:accessible-table-row-description:
590 * Accessible table row description.
592 * Deprecated: Since 2.12. Use atk_table_get_row_description() and
593 * atk_table_set_row_description() instead.
595 g_object_class_install_property (gobject_class
,
596 PROP_TABLE_ROW_DESCRIPTION
,
597 g_param_spec_string (atk_object_name_property_table_row_description
,
598 _("Accessible Table Row Description"),
599 _("Is used to notify that the table row description has changed"),
602 g_object_class_install_property (gobject_class
,
604 g_param_spec_object (atk_object_name_property_table_summary
,
605 _("Accessible Table Summary"),
606 _("Is used to notify that the table summary has changed"),
609 g_object_class_install_property (gobject_class
,
610 PROP_TABLE_CAPTION_OBJECT
,
611 g_param_spec_object (atk_object_name_property_table_caption_object
,
612 _("Accessible Table Caption Object"),
613 _("Is used to notify that the table caption has changed"),
616 g_object_class_install_property (gobject_class
,
617 PROP_HYPERTEXT_NUM_LINKS
,
618 g_param_spec_int (atk_object_name_property_hypertext_num_links
,
619 _("Number of Accessible Hypertext Links"),
620 _("The number of links which the current AtkHypertext has"),
627 * AtkObject::children-changed:
628 * @atkobject: the object which received the signal.
629 * @arg1: The index of the added or removed child. The value can be
630 * -1. This is used if the value is not known by the implementor
631 * when the child is added/removed or irrelevant.
632 * @arg2: A gpointer to the child AtkObject which was added or
633 * removed. If the child was removed, it is possible that it is not
634 * available for the implementor. In that case this pointer can be
637 * The signal "children-changed" is emitted when a child is added or
638 * removed form an object. It supports two details: "add" and
641 atk_object_signals
[CHILDREN_CHANGED
] =
642 g_signal_new ("children_changed",
643 G_TYPE_FROM_CLASS (klass
),
644 G_SIGNAL_RUN_LAST
| G_SIGNAL_DETAILED
,
645 G_STRUCT_OFFSET (AtkObjectClass
, children_changed
),
647 g_cclosure_marshal_VOID__UINT_POINTER
,
649 2, G_TYPE_UINT
, G_TYPE_POINTER
);
652 * AtkObject::focus-event:
653 * @atkobject: the object which received the signal
654 * @arg1: a boolean value which indicates whether the object gained
657 * The signal "focus-event" is emitted when an object gained or lost
660 * Deprecated: Since 2.9.4. Use #AtkObject::state-change signal instead.
662 atk_object_signals
[FOCUS_EVENT
] =
663 g_signal_new ("focus_event",
664 G_TYPE_FROM_CLASS (klass
),
666 G_STRUCT_OFFSET (AtkObjectClass
, focus_event
),
668 g_cclosure_marshal_VOID__BOOLEAN
,
672 * AtkObject::property-change:
673 * @atkobject: the object which received the signal.
674 * @arg1: an #AtkPropertyValues containing the new value of the
675 * property which changed.
677 * The signal "property-change" is emitted when an object's property
678 * value changes. @arg1 contains an #AtkPropertyValues with the name
679 * and the new value of the property whose value has changed. Note
680 * that, as with GObject notify, getting this signal does not
681 * guarantee that the value of the property has actually changed; it
682 * may also be emitted when the setter of the property is called to
683 * reinstate the previous value.
685 * Toolkit implementor note: ATK implementors should use
686 * g_object_notify() to emit property-changed
687 * notifications. #AtkObject::property-changed is needed by the
688 * implementation of atk_add_global_event_listener() because GObject
689 * notify doesn't support emission hooks.
691 atk_object_signals
[PROPERTY_CHANGE
] =
692 g_signal_new ("property_change",
693 G_TYPE_FROM_CLASS (klass
),
694 G_SIGNAL_RUN_LAST
| G_SIGNAL_DETAILED
,
695 G_STRUCT_OFFSET (AtkObjectClass
, property_change
),
696 (GSignalAccumulator
) NULL
, NULL
,
697 g_cclosure_marshal_VOID__POINTER
,
702 * AtkObject::state-change:
703 * @atkobject: the object which received the signal.
704 * @arg1: The name of the state which has changed
705 * @arg2: A boolean which indicates whether the state has been set or unset.
707 * The "state-change" signal is emitted when an object's state
708 * changes. The detail value identifies the state type which has
711 atk_object_signals
[STATE_CHANGE
] =
712 g_signal_new ("state_change",
713 G_TYPE_FROM_CLASS (klass
),
714 G_SIGNAL_RUN_LAST
| G_SIGNAL_DETAILED
,
715 G_STRUCT_OFFSET (AtkObjectClass
, state_change
),
716 (GSignalAccumulator
) NULL
, NULL
,
717 atk_marshal_VOID__STRING_BOOLEAN
,
723 * AtkObject::visible-data-changed:
724 * @atkobject: the object which received the signal.
726 * The "visible-data-changed" signal is emitted when the visual
727 * appearance of the object changed.
729 atk_object_signals
[VISIBLE_DATA_CHANGED
] =
730 g_signal_new ("visible_data_changed",
731 G_TYPE_FROM_CLASS (klass
),
733 G_STRUCT_OFFSET (AtkObjectClass
, visible_data_changed
),
734 (GSignalAccumulator
) NULL
, NULL
,
735 g_cclosure_marshal_VOID__VOID
,
739 * AtkObject::active-descendant-changed:
740 * @atkobject: the object which received the signal.
741 * @arg1: the newly focused object.
743 * The "active-descendant-changed" signal is emitted by an object
744 * which has the state ATK_STATE_MANAGES_DESCENDANTS when the focus
745 * object in the object changes. For instance, a table will emit the
746 * signal when the cell in the table which has focus changes.
748 atk_object_signals
[ACTIVE_DESCENDANT_CHANGED
] =
749 g_signal_new ("active_descendant_changed",
750 G_TYPE_FROM_CLASS (klass
),
751 G_SIGNAL_RUN_LAST
| G_SIGNAL_DETAILED
,
752 G_STRUCT_OFFSET (AtkObjectClass
, active_descendant_changed
),
754 g_cclosure_marshal_VOID__POINTER
,
760 atk_object_init (AtkObject
*accessible
,
761 AtkObjectClass
*klass
)
763 accessible
->name
= NULL
;
764 accessible
->description
= NULL
;
765 accessible
->accessible_parent
= NULL
;
766 accessible
->relation_set
= atk_relation_set_new();
767 accessible
->role
= ATK_ROLE_UNKNOWN
;
771 atk_implementor_get_type (void)
773 static GType type
= 0;
777 static const GTypeInfo typeInfo
=
779 sizeof (AtkImplementorIface
),
780 (GBaseInitFunc
) NULL
,
781 (GBaseFinalizeFunc
) NULL
,
784 type
= g_type_register_static (G_TYPE_INTERFACE
, "AtkImplementorIface", &typeInfo
, 0) ;
791 * atk_object_get_name:
792 * @accessible: an #AtkObject
794 * Gets the accessible name of the accessible.
796 * Returns: a character string representing the accessible name of the object.
799 atk_object_get_name (AtkObject
*accessible
)
801 AtkObjectClass
*klass
;
803 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), NULL
);
805 klass
= ATK_OBJECT_GET_CLASS (accessible
);
807 return (klass
->get_name
) (accessible
);
813 * atk_object_get_description:
814 * @accessible: an #AtkObject
816 * Gets the accessible description of the accessible.
818 * Returns: a character string representing the accessible description
823 atk_object_get_description (AtkObject
*accessible
)
825 AtkObjectClass
*klass
;
827 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), NULL
);
829 klass
= ATK_OBJECT_GET_CLASS (accessible
);
830 if (klass
->get_description
)
831 return (klass
->get_description
) (accessible
);
837 * atk_object_get_parent:
838 * @accessible: an #AtkObject
840 * Gets the accessible parent of the accessible. By default this is
841 * the one assigned with atk_object_set_parent(), but it is assumed
842 * that ATK implementors have ways to get the parent of the object
843 * without the need of assigning it manually with
844 * atk_object_set_parent(), and will return it with this method.
846 * If you are only interested on the parent assigned with
847 * atk_object_set_parent(), use atk_object_peek_parent().
849 * Returns: (transfer none): an #AtkObject representing the accessible
850 * parent of the accessible
853 atk_object_get_parent (AtkObject
*accessible
)
855 AtkObjectClass
*klass
;
857 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), NULL
);
859 klass
= ATK_OBJECT_GET_CLASS (accessible
);
860 if (klass
->get_parent
)
861 return (klass
->get_parent
) (accessible
);
867 * atk_object_peek_parent:
868 * @accessible: an #AtkObject
870 * Gets the accessible parent of the accessible, if it has been
871 * manually assigned with atk_object_set_parent. Otherwise, this
872 * function returns %NULL.
874 * This method is intended as an utility for ATK implementors, and not
875 * to be exposed to accessible tools. See atk_object_get_parent() for
878 * Returns: (transfer none): an #AtkObject representing the accessible
879 * parent of the accessible if assigned
882 atk_object_peek_parent (AtkObject
*accessible
)
884 return accessible
->accessible_parent
;
888 * atk_object_get_n_accessible_children:
889 * @accessible: an #AtkObject
891 * Gets the number of accessible children of the accessible.
893 * Returns: an integer representing the number of accessible children
897 atk_object_get_n_accessible_children (AtkObject
*accessible
)
899 AtkObjectClass
*klass
;
901 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), 0);
903 klass
= ATK_OBJECT_GET_CLASS (accessible
);
904 if (klass
->get_n_children
)
905 return (klass
->get_n_children
) (accessible
);
911 * atk_object_ref_accessible_child:
912 * @accessible: an #AtkObject
913 * @i: a gint representing the position of the child, starting from 0
915 * Gets a reference to the specified accessible child of the object.
916 * The accessible children are 0-based so the first accessible child is
917 * at index 0, the second at index 1 and so on.
919 * Returns: (transfer full): an #AtkObject representing the specified
920 * accessible child of the accessible.
923 atk_object_ref_accessible_child (AtkObject
*accessible
,
926 AtkObjectClass
*klass
;
928 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), NULL
);
930 klass
= ATK_OBJECT_GET_CLASS (accessible
);
931 if (klass
->ref_child
)
932 return (klass
->ref_child
) (accessible
, i
);
938 * atk_object_ref_relation_set:
939 * @accessible: an #AtkObject
941 * Gets the #AtkRelationSet associated with the object.
943 * Returns: (transfer full): an #AtkRelationSet representing the relation set
947 atk_object_ref_relation_set (AtkObject
*accessible
)
949 AtkObjectClass
*klass
;
951 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), NULL
);
953 klass
= ATK_OBJECT_GET_CLASS (accessible
);
954 if (klass
->ref_relation_set
)
955 return (klass
->ref_relation_set
) (accessible
);
962 * @name: a character string describing the new role.
964 * Registers the role specified by @name. @name must be a meaningful
965 * name. So it should not be empty, or consisting on whitespaces.
967 * Deprecated: Since 2.12. If your application/toolkit doesn't find a
968 * suitable role for a specific object defined at #AtkRole, please
969 * submit a bug in order to add a new role to the specification.
971 * Returns: an #AtkRole for the new role if added
972 * properly. ATK_ROLE_INVALID in case of error.
975 atk_role_register (const gchar
*name
)
977 gboolean valid
= FALSE
;
979 glong length
= g_utf8_strlen (name
, -1);
981 for (i
=0; i
< length
; i
++) {
989 return ATK_ROLE_INVALID
;
992 initialize_role_names ();
994 g_ptr_array_add (role_names
, g_strdup (name
));
995 return role_names
->len
- 1;
999 * atk_object_get_role:
1000 * @accessible: an #AtkObject
1002 * Gets the role of the accessible.
1004 * Returns: an #AtkRole which is the role of the accessible
1007 atk_object_get_role (AtkObject
*accessible
)
1009 AtkObjectClass
*klass
;
1011 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), ATK_ROLE_UNKNOWN
);
1013 klass
= ATK_OBJECT_GET_CLASS (accessible
);
1014 if (klass
->get_role
)
1015 return (klass
->get_role
) (accessible
);
1017 return ATK_ROLE_UNKNOWN
;
1021 * atk_object_get_layer:
1022 * @accessible: an #AtkObject
1024 * Gets the layer of the accessible.
1026 * Deprecated: Use atk_component_get_layer instead.
1028 * Returns: an #AtkLayer which is the layer of the accessible
1031 atk_object_get_layer (AtkObject
*accessible
)
1033 AtkObjectClass
*klass
;
1035 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), ATK_LAYER_INVALID
);
1037 klass
= ATK_OBJECT_GET_CLASS (accessible
);
1038 if (klass
->get_layer
)
1039 return (klass
->get_layer
) (accessible
);
1041 return ATK_LAYER_INVALID
;
1045 * atk_object_get_mdi_zorder:
1046 * @accessible: an #AtkObject
1048 * Gets the zorder of the accessible. The value G_MININT will be returned
1049 * if the layer of the accessible is not ATK_LAYER_MDI.
1051 * Deprecated: Use atk_component_get_mdi_zorder instead.
1053 * Returns: a gint which is the zorder of the accessible, i.e. the depth at
1054 * which the component is shown in relation to other components in the same
1059 atk_object_get_mdi_zorder (AtkObject
*accessible
)
1061 AtkObjectClass
*klass
;
1063 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), G_MININT
);
1065 klass
= ATK_OBJECT_GET_CLASS (accessible
);
1066 if (klass
->get_mdi_zorder
)
1067 return (klass
->get_mdi_zorder
) (accessible
);
1073 * atk_object_ref_state_set:
1074 * @accessible: an #AtkObject
1076 * Gets a reference to the state set of the accessible; the caller must
1077 * unreference it when it is no longer needed.
1079 * Returns: (transfer full): a reference to an #AtkStateSet which is the state
1080 * set of the accessible
1083 atk_object_ref_state_set (AtkObject
*accessible
)
1085 AtkObjectClass
*klass
;
1087 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), NULL
);
1089 klass
= ATK_OBJECT_GET_CLASS (accessible
);
1090 if (klass
->ref_state_set
)
1091 return (klass
->ref_state_set
) (accessible
);
1097 * atk_object_get_index_in_parent:
1098 * @accessible: an #AtkObject
1100 * Gets the 0-based index of this accessible in its parent; returns -1 if the
1101 * accessible does not have an accessible parent.
1103 * Returns: an integer which is the index of the accessible in its parent
1106 atk_object_get_index_in_parent (AtkObject
*accessible
)
1108 AtkObjectClass
*klass
;
1110 g_return_val_if_fail (ATK_OBJECT (accessible
), -1);
1112 klass
= ATK_OBJECT_GET_CLASS (accessible
);
1113 if (klass
->get_index_in_parent
)
1114 return (klass
->get_index_in_parent
) (accessible
);
1120 * atk_object_set_name:
1121 * @accessible: an #AtkObject
1122 * @name: a character string to be set as the accessible name
1124 * Sets the accessible name of the accessible. You can't set the name
1125 * to NULL. This is reserved for the initial value. In this aspect
1126 * NULL is similar to ATK_ROLE_UNKNOWN. If you want to set the name to
1127 * a empty value you can use "".
1130 atk_object_set_name (AtkObject
*accessible
,
1133 AtkObjectClass
*klass
;
1134 gboolean notify
= FALSE
;
1136 g_return_if_fail (ATK_IS_OBJECT (accessible
));
1137 g_return_if_fail (name
!= NULL
);
1139 klass
= ATK_OBJECT_GET_CLASS (accessible
);
1140 if (klass
->set_name
)
1142 /* Do not notify for initial name setting. See bug 665870 */
1143 notify
= (accessible
->name
!= NULL
);
1145 (klass
->set_name
) (accessible
, name
);
1147 g_object_notify (G_OBJECT (accessible
), atk_object_name_property_name
);
1152 * atk_object_set_description:
1153 * @accessible: an #AtkObject
1154 * @description: a character string to be set as the accessible description
1156 * Sets the accessible description of the accessible. You can't set
1157 * the description to NULL. This is reserved for the initial value. In
1158 * this aspect NULL is similar to ATK_ROLE_UNKNOWN. If you want to set
1159 * the name to a empty value you can use "".
1162 atk_object_set_description (AtkObject
*accessible
,
1163 const gchar
*description
)
1165 AtkObjectClass
*klass
;
1166 gboolean notify
= FALSE
;
1168 g_return_if_fail (ATK_IS_OBJECT (accessible
));
1169 g_return_if_fail (description
!= NULL
);
1171 klass
= ATK_OBJECT_GET_CLASS (accessible
);
1172 if (klass
->set_description
)
1174 /* Do not notify for initial name setting. See bug 665870 */
1175 notify
= (accessible
->description
!= NULL
);
1177 (klass
->set_description
) (accessible
, description
);
1179 g_object_notify (G_OBJECT (accessible
),
1180 atk_object_name_property_description
);
1185 * atk_object_set_parent:
1186 * @accessible: an #AtkObject
1187 * @parent: an #AtkObject to be set as the accessible parent
1189 * Sets the accessible parent of the accessible. @parent can be NULL.
1192 atk_object_set_parent (AtkObject
*accessible
,
1195 AtkObjectClass
*klass
;
1197 g_return_if_fail (ATK_IS_OBJECT (accessible
));
1199 klass
= ATK_OBJECT_GET_CLASS (accessible
);
1200 if (klass
->set_parent
)
1202 (klass
->set_parent
) (accessible
, parent
);
1203 g_object_notify (G_OBJECT (accessible
), atk_object_name_property_parent
);
1208 * atk_object_set_role:
1209 * @accessible: an #AtkObject
1210 * @role: an #AtkRole to be set as the role
1212 * Sets the role of the accessible.
1215 atk_object_set_role (AtkObject
*accessible
,
1218 AtkObjectClass
*klass
;
1221 g_return_if_fail (ATK_IS_OBJECT (accessible
));
1223 klass
= ATK_OBJECT_GET_CLASS (accessible
);
1224 if (klass
->set_role
)
1226 old_role
= atk_object_get_role (accessible
);
1227 if (old_role
!= role
)
1229 (klass
->set_role
) (accessible
, role
);
1230 if (old_role
!= ATK_ROLE_UNKNOWN
)
1231 /* Do not notify for initial role setting */
1232 g_object_notify (G_OBJECT (accessible
), atk_object_name_property_role
);
1238 * atk_object_connect_property_change_handler:
1239 * @accessible: an #AtkObject
1240 * @handler: a function to be called when a property changes its value
1242 * Deprecated: Since 2.12. Connect directly to property-change or
1245 * Returns: a #guint which is the handler id used in
1246 * atk_object_remove_property_change_handler()
1249 atk_object_connect_property_change_handler (AtkObject
*accessible
,
1250 AtkPropertyChangeHandler
*handler
)
1252 AtkObjectClass
*klass
;
1254 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), 0);
1255 g_return_val_if_fail ((handler
!= NULL
), 0);
1257 klass
= ATK_OBJECT_GET_CLASS (accessible
);
1258 if (klass
->connect_property_change_handler
)
1259 return (klass
->connect_property_change_handler
) (accessible
, handler
);
1265 * atk_object_remove_property_change_handler:
1266 * @accessible: an #AtkObject
1267 * @handler_id: a guint which identifies the handler to be removed.
1269 * Deprecated: Since 2.12.
1271 * Removes a property change handler.
1274 atk_object_remove_property_change_handler (AtkObject
*accessible
,
1277 AtkObjectClass
*klass
;
1279 g_return_if_fail (ATK_IS_OBJECT (accessible
));
1281 klass
= ATK_OBJECT_GET_CLASS (accessible
);
1282 if (klass
->remove_property_change_handler
)
1283 (klass
->remove_property_change_handler
) (accessible
, handler_id
);
1287 * atk_object_notify_state_change:
1288 * @accessible: an #AtkObject
1289 * @state: an #AtkState whose state is changed
1290 * @value: a gboolean which indicates whether the state is being set on or off
1292 * Emits a state-change signal for the specified state.
1295 atk_object_notify_state_change (AtkObject
*accessible
,
1301 g_return_if_fail (ATK_IS_OBJECT (accessible
));
1303 name
= atk_state_type_get_name (state
);
1304 g_signal_emit (accessible
, atk_object_signals
[STATE_CHANGE
],
1305 g_quark_from_string (name
),
1310 * atk_implementor_ref_accessible:
1311 * @implementor: The #GObject instance which should implement #AtkImplementorIface
1312 * if a non-null return value is required.
1314 * Gets a reference to an object's #AtkObject implementation, if
1315 * the object implements #AtkObjectIface
1317 * Returns: (transfer full): a reference to an object's #AtkObject
1321 atk_implementor_ref_accessible (AtkImplementor
*implementor
)
1323 AtkImplementorIface
*iface
;
1324 AtkObject
*accessible
= NULL
;
1326 g_return_val_if_fail (ATK_IS_IMPLEMENTOR (implementor
), NULL
);
1328 iface
= ATK_IMPLEMENTOR_GET_IFACE (implementor
);
1331 accessible
= iface
->ref_accessible (implementor
);
1333 g_return_val_if_fail ((accessible
!= NULL
), NULL
);
1340 * atk_object_get_attributes:
1341 * @accessible: An #AtkObject.
1343 * Get a list of properties applied to this object as a whole, as an #AtkAttributeSet consisting of
1344 * name-value pairs. As such these attributes may be considered weakly-typed properties or annotations,
1345 * as distinct from strongly-typed object data available via other get/set methods.
1346 * Not all objects have explicit "name-value pair" #AtkAttributeSet properties.
1350 * Returns: (transfer full): an #AtkAttributeSet consisting of all
1351 * explicit properties/annotations applied to the object, or an empty
1352 * set if the object has no name-value pair attributes assigned to
1353 * it. This #atkattributeset should be freed by a call to
1354 * atk_attribute_set_free().
1357 atk_object_get_attributes (AtkObject
*accessible
)
1359 AtkObjectClass
*klass
;
1361 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), NULL
);
1363 klass
= ATK_OBJECT_GET_CLASS (accessible
);
1364 if (klass
->get_attributes
)
1365 return (klass
->get_attributes
) (accessible
);
1371 static AtkRelationSet
*
1372 atk_object_real_ref_relation_set (AtkObject
*accessible
)
1374 g_return_val_if_fail (accessible
->relation_set
, NULL
);
1375 g_object_ref (accessible
->relation_set
);
1377 return accessible
->relation_set
;
1381 atk_object_real_set_property (GObject
*object
,
1383 const GValue
*value
,
1386 AtkObject
*accessible
;
1388 accessible
= ATK_OBJECT (object
);
1393 atk_object_set_name (accessible
, g_value_get_string (value
));
1395 case PROP_DESCRIPTION
:
1396 atk_object_set_description (accessible
, g_value_get_string (value
));
1399 atk_object_set_role (accessible
, g_value_get_int (value
));
1402 atk_object_set_parent (accessible
, g_value_get_object (value
));
1405 if (ATK_IS_VALUE (accessible
))
1406 atk_value_set_current_value (ATK_VALUE (accessible
), value
);
1408 case PROP_TABLE_SUMMARY
:
1409 if (ATK_IS_TABLE (accessible
))
1410 atk_table_set_summary (ATK_TABLE (accessible
), g_value_get_object (value
));
1412 case PROP_TABLE_CAPTION_OBJECT
:
1413 if (ATK_IS_TABLE (accessible
))
1414 atk_table_set_caption (ATK_TABLE (accessible
), g_value_get_object (value
));
1422 atk_object_real_get_property (GObject
*object
,
1427 AtkObject
*accessible
;
1429 accessible
= ATK_OBJECT (object
);
1434 g_value_set_string (value
, atk_object_get_name (accessible
));
1436 case PROP_DESCRIPTION
:
1437 g_value_set_string (value
, atk_object_get_description (accessible
));
1440 g_value_set_int (value
, atk_object_get_role (accessible
));
1443 if (ATK_IS_COMPONENT (accessible
))
1444 g_value_set_int (value
, atk_component_get_layer (ATK_COMPONENT (accessible
)));
1446 case PROP_MDI_ZORDER
:
1447 if (ATK_IS_COMPONENT (accessible
))
1448 g_value_set_int (value
, atk_component_get_mdi_zorder (ATK_COMPONENT (accessible
)));
1451 g_value_set_object (value
, atk_object_get_parent (accessible
));
1454 if (ATK_IS_VALUE (accessible
))
1455 atk_value_get_current_value (ATK_VALUE (accessible
), value
);
1457 case PROP_TABLE_SUMMARY
:
1458 if (ATK_IS_TABLE (accessible
))
1459 g_value_set_object (value
, atk_table_get_summary (ATK_TABLE (accessible
)));
1461 case PROP_TABLE_CAPTION_OBJECT
:
1462 if (ATK_IS_TABLE (accessible
))
1463 g_value_set_object (value
, atk_table_get_caption (ATK_TABLE (accessible
)));
1465 case PROP_HYPERTEXT_NUM_LINKS
:
1466 if (ATK_IS_HYPERTEXT (accessible
))
1467 g_value_set_int (value
, atk_hypertext_get_n_links (ATK_HYPERTEXT (accessible
)));
1470 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, prop_id
, pspec
);
1476 atk_object_finalize (GObject
*object
)
1478 AtkObject
*accessible
;
1480 g_return_if_fail (ATK_IS_OBJECT (object
));
1482 accessible
= ATK_OBJECT (object
);
1484 g_free (accessible
->name
);
1485 g_free (accessible
->description
);
1488 * Free memory allocated for relation set if it have been allocated.
1490 if (accessible
->relation_set
)
1491 g_object_unref (accessible
->relation_set
);
1493 if (accessible
->accessible_parent
)
1494 g_object_unref (accessible
->accessible_parent
);
1496 G_OBJECT_CLASS (parent_class
)->finalize (object
);
1500 atk_object_real_get_name (AtkObject
*object
)
1502 return object
->name
;
1506 atk_object_real_get_description (AtkObject
*object
)
1508 return object
->description
;
1512 atk_object_real_get_parent (AtkObject
*object
)
1514 return atk_object_peek_parent (object
);
1518 atk_object_real_get_role (AtkObject
*object
)
1520 return object
->role
;
1524 atk_object_real_get_layer (AtkObject
*object
)
1526 return object
->layer
;
1530 atk_object_real_ref_state_set (AtkObject
*accessible
)
1532 AtkStateSet
*state_set
;
1533 AtkObject
*focus_object
;
1535 state_set
= atk_state_set_new ();
1537 focus_object
= atk_get_focus_object ();
1538 if (focus_object
== accessible
)
1539 atk_state_set_add_state (state_set
, ATK_STATE_FOCUSED
);
1545 atk_object_real_set_name (AtkObject
*object
,
1548 g_free (object
->name
);
1549 object
->name
= g_strdup (name
);
1553 atk_object_real_set_description (AtkObject
*object
,
1554 const gchar
*description
)
1556 g_free (object
->description
);
1557 object
->description
= g_strdup (description
);
1561 atk_object_real_set_parent (AtkObject
*object
,
1564 if (object
->accessible_parent
)
1565 g_object_unref (object
->accessible_parent
);
1567 object
->accessible_parent
= parent
;
1568 if (object
->accessible_parent
)
1569 g_object_ref (object
->accessible_parent
);
1573 atk_object_real_set_role (AtkObject
*object
,
1576 object
->role
= role
;
1580 * atk_object_initialize:
1581 * @accessible: a #AtkObject
1582 * @data: a #gpointer which identifies the object for which the AtkObject was created.
1584 * This function is called when implementing subclasses of #AtkObject.
1585 * It does initialization required for the new object. It is intended
1586 * that this function should called only in the ..._new() functions used
1587 * to create an instance of a subclass of #AtkObject
1590 atk_object_initialize (AtkObject
*accessible
,
1593 AtkObjectClass
*klass
;
1595 g_return_if_fail (ATK_IS_OBJECT (accessible
));
1597 klass
= ATK_OBJECT_GET_CLASS (accessible
);
1598 if (klass
->initialize
)
1599 klass
->initialize (accessible
, data
);
1603 * This function is a signal handler for notify signal which gets emitted
1604 * when a property changes value.
1606 * It constructs an AtkPropertyValues structure and emits a "property_changed"
1607 * signal which causes the user specified AtkPropertyChangeHandler
1611 atk_object_notify (GObject
*obj
,
1614 AtkPropertyValues values
= { NULL
, };
1616 g_value_init (&values
.new_value
, pspec
->value_type
);
1617 g_object_get_property (obj
, pspec
->name
, &values
.new_value
);
1618 values
.property_name
= pspec
->name
;
1619 g_signal_emit (obj
, atk_object_signals
[PROPERTY_CHANGE
],
1620 g_quark_from_string (pspec
->name
),
1622 g_value_unset (&values
.new_value
);
1626 * atk_role_get_name:
1627 * @role: The #AtkRole whose name is required
1629 * Gets the description string describing the #AtkRole @role.
1631 * Returns: the string describing the AtkRole
1634 atk_role_get_name (AtkRole role
)
1636 g_return_val_if_fail (role
>= 0, NULL
);
1639 initialize_role_names ();
1641 if (role
< role_names
->len
)
1642 return g_ptr_array_index (role_names
, role
);
1648 * atk_role_get_localized_name:
1649 * @role: The #AtkRole whose localized name is required
1651 * Gets the localized description string describing the #AtkRole @role.
1653 * Returns: the localized string describing the AtkRole
1656 atk_role_get_localized_name (AtkRole role
)
1658 gettext_initialization ();
1660 return dgettext (GETTEXT_PACKAGE
, atk_role_get_name (role
));
1664 atk_object_real_get_object_locale (AtkObject
*object
)
1666 return setlocale (LC_MESSAGES
, NULL
);
1670 * atk_object_get_object_locale:
1671 * @accessible: an #AtkObject
1673 * Gets a UTF-8 string indicating the POSIX-style LC_MESSAGES locale
1678 * Returns: a UTF-8 string indicating the POSIX-style LC_MESSAGES
1679 * locale of @accessible.
1682 atk_object_get_object_locale (AtkObject
*accessible
)
1684 AtkObjectClass
*klass
;
1686 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), NULL
);
1688 klass
= ATK_OBJECT_GET_CLASS (accessible
);
1689 if (klass
->get_object_locale
)
1690 return (klass
->get_object_locale
) (accessible
);
1697 * atk_role_for_name:
1698 * @name: a string which is the (non-localized) name of an ATK role.
1700 * Get the #AtkRole type corresponding to a rolew name.
1702 * Returns: the #AtkRole enumerated type corresponding to the specified name,
1703 * or #ATK_ROLE_INVALID if no matching role is found.
1706 atk_role_for_name (const gchar
*name
)
1708 AtkRole role
= ATK_ROLE_INVALID
;
1711 g_return_val_if_fail (name
, ATK_ROLE_INVALID
);
1714 initialize_role_names ();
1716 for (i
= 0; i
< role_names
->len
; i
++)
1718 gchar
*role_name
= (gchar
*)g_ptr_array_index (role_names
, i
);
1720 g_return_val_if_fail (role_name
, ATK_ROLE_INVALID
);
1722 if (strcmp (name
, role_name
) == 0)
1733 * atk_object_add_relationship:
1734 * @object: The #AtkObject to which an AtkRelation is to be added.
1735 * @relationship: The #AtkRelationType of the relation
1736 * @target: The #AtkObject which is to be the target of the relation.
1738 * Adds a relationship of the specified type with the specified target.
1740 * Returns: TRUE if the relationship is added.
1743 atk_object_add_relationship (AtkObject
*object
,
1744 AtkRelationType relationship
,
1747 AtkObject
*array
[1];
1748 AtkRelation
*relation
;
1750 g_return_val_if_fail (ATK_IS_OBJECT (object
), FALSE
);
1751 g_return_val_if_fail (ATK_IS_OBJECT (target
), FALSE
);
1753 if (atk_relation_set_contains_target (object
->relation_set
,
1754 relationship
, target
))
1758 relation
= atk_relation_new (array
, 1, relationship
);
1759 atk_relation_set_add (object
->relation_set
, relation
);
1760 g_object_unref (relation
);
1766 * atk_object_remove_relationship:
1767 * @object: The #AtkObject from which an AtkRelation is to be removed.
1768 * @relationship: The #AtkRelationType of the relation
1769 * @target: The #AtkObject which is the target of the relation to be removed.
1771 * Removes a relationship of the specified type with the specified target.
1773 * Returns: TRUE if the relationship is removed.
1776 atk_object_remove_relationship (AtkObject
*object
,
1777 AtkRelationType relationship
,
1780 gboolean ret
= FALSE
;
1781 AtkRelation
*relation
;
1784 g_return_val_if_fail (ATK_IS_OBJECT (object
), FALSE
);
1785 g_return_val_if_fail (ATK_IS_OBJECT (target
), FALSE
);
1787 relation
= atk_relation_set_get_relation_by_type (object
->relation_set
, relationship
);
1791 ret
= atk_relation_remove_target (relation
, target
);
1792 array
= atk_relation_get_target (relation
);
1793 if (!array
|| array
->len
== 0)
1794 atk_relation_set_remove (object
->relation_set
, relation
);
1800 atk_object_real_initialize (AtkObject
*accessible
,