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.
22 #include <glib-object.h>
25 #include "atkmarshal.h"
26 #include "atk-enum-types.h"
29 GPtrArray
*extra_roles
= NULL
;
33 PROP_0
, /* gobject convention */
37 PROP_PARENT
, /* ancestry has changed */
43 PROP_TABLE_COLUMN_DESCRIPTION
,
44 PROP_TABLE_COLUMN_HEADER
,
45 PROP_TABLE_ROW_DESCRIPTION
,
46 PROP_TABLE_ROW_HEADER
,
48 PROP_LAST
/* gobject convention */
61 static void atk_object_class_init (AtkObjectClass
*klass
);
62 static void atk_object_init (AtkObject
*accessible
,
63 AtkObjectClass
*klass
);
64 static AtkRelationSet
* atk_object_real_ref_relation_set
65 (AtkObject
*accessible
);
67 static void atk_object_real_set_property (GObject
*object
,
71 static void atk_object_real_get_property (GObject
*object
,
75 static void atk_object_finalize (GObject
*object
);
76 static G_CONST_RETURN gchar
*
77 atk_object_real_get_name (AtkObject
*object
);
78 static G_CONST_RETURN gchar
*
79 atk_object_real_get_description
81 static AtkObject
* atk_object_real_get_parent (AtkObject
*object
);
82 static AtkRole
atk_object_real_get_role (AtkObject
*object
);
83 static AtkLayer
atk_object_real_get_layer (AtkObject
*object
);
84 static AtkStateSet
* atk_object_real_ref_state_set
86 static void atk_object_real_set_name (AtkObject
*object
,
88 static void atk_object_real_set_description
90 const gchar
*description
);
91 static void atk_object_real_set_parent (AtkObject
*object
,
93 static void atk_object_real_set_role (AtkObject
*object
,
95 static guint atk_object_real_connect_property_change_handler
97 AtkPropertyChangeHandler
99 static void atk_object_real_remove_property_change_handler
102 static void atk_object_notify (GObject
*obj
,
106 static guint atk_object_signals
[LAST_SIGNAL
] = { 0, };
108 static gpointer parent_class
= NULL
;
110 static const gchar
* atk_object_name_property_name
= "accessible-name";
111 static const gchar
* atk_object_name_property_description
= "accessible-description";
112 static const gchar
* atk_object_name_property_parent
= "accessible-parent";
113 static const gchar
* atk_object_name_property_value
= "accessible-value";
114 static const gchar
* atk_object_name_property_role
= "accessible-role";
115 static const gchar
* atk_object_name_property_component_layer
= "accessible-component-layer";
116 static const gchar
* atk_object_name_property_component_mdi_zorder
= "accessible-component-mdi-zorder";
117 static const gchar
* atk_object_name_property_table_caption
= "accessible-table-caption";
118 static const gchar
* atk_object_name_property_table_column_description
= "accessible-table-column-description";
119 static const gchar
* atk_object_name_property_table_column_header
= "accessible-table-column-header";
120 static const gchar
* atk_object_name_property_table_row_description
= "accessible-table-row-description";
121 static const gchar
* atk_object_name_property_table_row_header
= "accessible-table-row-header";
122 static const gchar
* atk_object_name_property_table_summary
= "accessible-table-summary";
125 atk_object_get_type (void)
127 static GType type
= 0;
131 static const GTypeInfo typeInfo
=
133 sizeof (AtkObjectClass
),
134 (GBaseInitFunc
) NULL
,
135 (GBaseFinalizeFunc
) NULL
,
136 (GClassInitFunc
) atk_object_class_init
,
137 (GClassFinalizeFunc
) NULL
,
141 (GInstanceInitFunc
) atk_object_init
,
143 type
= g_type_register_static (G_TYPE_OBJECT
, "AtkObject", &typeInfo
, 0) ;
149 atk_object_class_init (AtkObjectClass
*klass
)
151 GObjectClass
*gobject_class
= G_OBJECT_CLASS (klass
);
153 parent_class
= g_type_class_peek_parent (klass
);
155 gobject_class
->set_property
= atk_object_real_set_property
;
156 gobject_class
->get_property
= atk_object_real_get_property
;
157 gobject_class
->finalize
= atk_object_finalize
;
158 gobject_class
->notify
= atk_object_notify
;
160 klass
->get_name
= atk_object_real_get_name
;
161 klass
->get_description
= atk_object_real_get_description
;
162 klass
->get_parent
= atk_object_real_get_parent
;
163 klass
->get_n_children
= NULL
;
164 klass
->ref_child
= NULL
;
165 klass
->get_index_in_parent
= NULL
;
166 klass
->ref_relation_set
= atk_object_real_ref_relation_set
;
167 klass
->get_role
= atk_object_real_get_role
;
168 klass
->get_layer
= atk_object_real_get_layer
;
169 klass
->get_mdi_zorder
= NULL
;
170 klass
->ref_state_set
= atk_object_real_ref_state_set
;
171 klass
->set_name
= atk_object_real_set_name
;
172 klass
->set_description
= atk_object_real_set_description
;
173 klass
->set_parent
= atk_object_real_set_parent
;
174 klass
->set_role
= atk_object_real_set_role
;
175 klass
->connect_property_change_handler
=
176 atk_object_real_connect_property_change_handler
;
177 klass
->remove_property_change_handler
=
178 atk_object_real_remove_property_change_handler
;
181 * We do not define default signal handlers here
183 klass
->children_changed
= NULL
;
184 klass
->focus_event
= NULL
;
185 klass
->property_change
= NULL
;
186 klass
->visible_data_changed
= NULL
;
188 g_object_class_install_property (gobject_class
,
190 g_param_spec_string (atk_object_name_property_name
,
192 "Object instance\'s name formatted for "
193 "assistive technology access",
196 g_object_class_install_property (gobject_class
,
198 g_param_spec_string (atk_object_name_property_description
,
199 "Accessible Description",
200 "Description of an object, formatted for "
201 "assistive technology access",
204 g_object_class_install_property (gobject_class
,
206 g_param_spec_object (atk_object_name_property_parent
,
208 "Is used to notify that the parent has changed ",
211 g_object_class_install_property (gobject_class
,
213 g_param_spec_double (atk_object_name_property_value
,
215 "Is used to notify that the value has changed ",
220 g_object_class_install_property (gobject_class
,
222 g_param_spec_int (atk_object_name_property_role
,
224 "The accessible role of this object ",
229 g_object_class_install_property (gobject_class
,
231 g_param_spec_int (atk_object_name_property_component_layer
,
233 "The accessible layer of this object ",
238 g_object_class_install_property (gobject_class
,
240 g_param_spec_int (atk_object_name_property_component_mdi_zorder
,
241 "Accessible MDI Value",
242 "The accessible MDI value of this object ",
247 g_object_class_install_property (gobject_class
,
249 g_param_spec_string (atk_object_name_property_table_caption
,
250 "Accessible Table Caption",
251 "Is used to notify that the table caption has changed ",
254 g_object_class_install_property (gobject_class
,
255 PROP_TABLE_COLUMN_HEADER
,
256 g_param_spec_object (atk_object_name_property_table_column_header
,
257 "Accessible Table Column Header",
258 "Is used to notify that the table column header has changed ",
261 g_object_class_install_property (gobject_class
,
262 PROP_TABLE_COLUMN_DESCRIPTION
,
263 g_param_spec_string (atk_object_name_property_table_column_description
,
264 "Accessible Table Column Description",
265 "Is used to notify that the table columnscription has changed ",
268 g_object_class_install_property (gobject_class
,
269 PROP_TABLE_ROW_HEADER
,
270 g_param_spec_object (atk_object_name_property_table_row_header
,
271 "Accessible Table Row Header",
272 "Is used to notify that the table row header has changed ",
275 g_object_class_install_property (gobject_class
,
276 PROP_TABLE_ROW_DESCRIPTION
,
277 g_param_spec_string (atk_object_name_property_table_row_description
,
278 "Accessible Table Row Description",
279 "Is used to notify that the table row description has changed ",
282 g_object_class_install_property (gobject_class
,
284 g_param_spec_object (atk_object_name_property_table_summary
,
285 "Accessible Table Summary",
286 "Is used to notify that the table summary has changed ",
290 * The signal "children_changed" supports two details:
293 atk_object_signals
[CHILDREN_CHANGED
] =
294 g_signal_new ("children_changed",
295 G_TYPE_FROM_CLASS (klass
),
296 G_SIGNAL_RUN_LAST
| G_SIGNAL_DETAILED
,
297 G_STRUCT_OFFSET (AtkObjectClass
, children_changed
),
299 g_cclosure_marshal_VOID__UINT_POINTER
,
301 2, G_TYPE_UINT
, G_TYPE_POINTER
);
302 atk_object_signals
[FOCUS_EVENT
] =
303 g_signal_new ("focus_event",
304 G_TYPE_FROM_CLASS (klass
),
306 G_STRUCT_OFFSET (AtkObjectClass
, focus_event
),
308 g_cclosure_marshal_VOID__BOOLEAN
,
311 atk_object_signals
[PROPERTY_CHANGE
] =
312 g_signal_new ("property_change",
313 G_TYPE_FROM_CLASS (klass
),
314 G_SIGNAL_RUN_LAST
| G_SIGNAL_DETAILED
,
315 G_STRUCT_OFFSET (AtkObjectClass
, property_change
),
316 (GSignalAccumulator
) NULL
, NULL
,
317 g_cclosure_marshal_VOID__POINTER
,
321 * The "state_change" signal supports details, one for each accessible
325 atk_object_signals
[STATE_CHANGE
] =
326 g_signal_new ("state_change",
327 G_TYPE_FROM_CLASS (klass
),
328 G_SIGNAL_RUN_LAST
| G_SIGNAL_DETAILED
,
329 G_STRUCT_OFFSET (AtkObjectClass
, state_change
),
330 (GSignalAccumulator
) NULL
, NULL
,
331 atk_marshal_VOID__STRING_BOOLEAN
,
335 atk_object_signals
[VISIBLE_DATA_CHANGED
] =
336 g_signal_new ("visible_data_changed",
337 G_TYPE_FROM_CLASS (klass
),
339 G_STRUCT_OFFSET (AtkObjectClass
, visible_data_changed
),
340 (GSignalAccumulator
) NULL
, NULL
,
341 g_cclosure_marshal_VOID__VOID
,
346 atk_object_init (AtkObject
*accessible
,
347 AtkObjectClass
*klass
)
349 accessible
->name
= NULL
;
350 accessible
->description
= NULL
;
351 accessible
->accessible_parent
= NULL
;
352 accessible
->relation_set
= atk_relation_set_new();
353 accessible
->role
= ATK_ROLE_UNKNOWN
;
357 atk_implementor_get_type (void)
359 static GType type
= 0;
363 static const GTypeInfo typeInfo
=
365 sizeof (AtkImplementorIface
),
366 (GBaseInitFunc
) NULL
,
367 (GBaseFinalizeFunc
) NULL
,
370 type
= g_type_register_static (G_TYPE_INTERFACE
, "AtkImplementorIface", &typeInfo
, 0) ;
377 * atk_object_get_name:
378 * @accessible: an #AtkObject
380 * Gets the accessible name of the accessible.
382 * Returns: a character string representing the accessible name of the object.
384 G_CONST_RETURN gchar
*
385 atk_object_get_name (AtkObject
*accessible
)
387 AtkObjectClass
*klass
;
389 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), NULL
);
391 klass
= ATK_OBJECT_GET_CLASS (accessible
);
393 return (klass
->get_name
) (accessible
);
399 * atk_object_get_description:
400 * @accessible: an #AtkObject
402 * Gets the accessible description of the accessible.
404 * Returns: a character string representing the accessible description
408 G_CONST_RETURN gchar
*
409 atk_object_get_description (AtkObject
*accessible
)
411 AtkObjectClass
*klass
;
413 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), NULL
);
415 klass
= ATK_OBJECT_GET_CLASS (accessible
);
416 if (klass
->get_description
)
417 return (klass
->get_description
) (accessible
);
423 * atk_object_get_parent:
424 * @accessible: an #AtkObject
426 * Gets the accessible parent of the accessible.
428 * Returns: a #AtkObject representing the accessible parent of the accessible
431 atk_object_get_parent (AtkObject
*accessible
)
433 AtkObjectClass
*klass
;
435 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), NULL
);
437 klass
= ATK_OBJECT_GET_CLASS (accessible
);
438 if (klass
->get_parent
)
439 return (klass
->get_parent
) (accessible
);
445 * atk_object_get_n_accessible_children:
446 * @accessible: an #AtkObject
448 * Gets the number of accessible children of the accessible.
450 * Returns: an integer representing the number of accessible children
454 atk_object_get_n_accessible_children (AtkObject
*accessible
)
456 AtkObjectClass
*klass
;
458 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), 0);
460 klass
= ATK_OBJECT_GET_CLASS (accessible
);
461 if (klass
->get_n_children
)
462 return (klass
->get_n_children
) (accessible
);
468 * atk_object_ref_accessible_child:
469 * @accessible: an #AtkObject
470 * @i: a gint representing the position of the child, starting from 0
472 * Gets a reference to the specified accessible child of the object.
473 * The accessible children are 0-based so the first accessible child is
474 * at index 0, the second at index 1 and so on.
476 * Returns: an #AtkObject representing the specified accessible child
480 atk_object_ref_accessible_child (AtkObject
*accessible
,
483 AtkObjectClass
*klass
;
485 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), NULL
);
487 klass
= ATK_OBJECT_GET_CLASS (accessible
);
488 if (klass
->ref_child
)
489 return (klass
->ref_child
) (accessible
, i
);
495 * atk_object_ref_relation_set:
496 * @accessible: an #AtkObject
498 * Gets the #AtkRelationSet associated with the object.
500 * Returns: an #AtkRelationSet representing the relation set of the object.
503 atk_object_ref_relation_set (AtkObject
*accessible
)
505 AtkObjectClass
*klass
;
507 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), NULL
);
509 klass
= ATK_OBJECT_GET_CLASS (accessible
);
510 if (klass
->ref_relation_set
)
511 return (klass
->ref_relation_set
) (accessible
);
518 * @name: a character string describing the new role.
520 * Registers the role specified by @name.
522 * Returns: an #AtkRole for the new role.
525 atk_role_register (const gchar
*name
)
528 extra_roles
= g_ptr_array_new ();
530 g_ptr_array_add (extra_roles
, g_strdup (name
));
531 return extra_roles
->len
+ ATK_ROLE_LAST_DEFINED
;
535 * atk_object_get_role:
536 * @accessible: an #AtkObject
538 * Gets the role of the accessible.
540 * Returns: an #AtkRole which is the role of the accessible
543 atk_object_get_role (AtkObject
*accessible
)
545 AtkObjectClass
*klass
;
547 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), ATK_ROLE_UNKNOWN
);
549 klass
= ATK_OBJECT_GET_CLASS (accessible
);
551 return (klass
->get_role
) (accessible
);
553 return ATK_ROLE_UNKNOWN
;
557 * atk_object_get_layer:
558 * @accessible: an #AtkObject
560 * Gets the layer of the accessible.
561 * DEPRECATED: use atk_component_get_layer instead!
563 * Returns: an #AtkLayer which is the layer of the accessible
566 atk_object_get_layer (AtkObject
*accessible
)
568 AtkObjectClass
*klass
;
570 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), ATK_LAYER_INVALID
);
572 klass
= ATK_OBJECT_GET_CLASS (accessible
);
573 if (klass
->get_layer
)
574 return (klass
->get_layer
) (accessible
);
576 return ATK_LAYER_INVALID
;
580 * atk_object_get_mdi_zorder:
581 * @accessible: an #AtkObject
583 * Gets the zorder of the accessible. The value G_MININT will be returned
584 * if the layer of the accessible is not ATK_LAYER_MDI.
585 * DEPRECATED: use atk_component_get_mdi_zorder instead!
587 * Returns: a gint which is the zorder of the accessible, i.e. the depth at
588 * which the component is shown in relation to other components in the same
592 atk_object_get_mdi_zorder (AtkObject
*accessible
)
594 AtkObjectClass
*klass
;
596 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), G_MININT
);
598 klass
= ATK_OBJECT_GET_CLASS (accessible
);
599 if (klass
->get_mdi_zorder
)
600 return (klass
->get_mdi_zorder
) (accessible
);
606 * atk_object_ref_state_set:
607 * @accessible: an #AtkObject
609 * Gets a reference to the state set of the accessible; the caller must
610 * unreference it when it is no longer needed.
612 * Returns: a reference to an #AtkStateSet which is the state
613 * set of the accessible
616 atk_object_ref_state_set (AtkObject
*accessible
)
618 AtkObjectClass
*klass
;
620 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), NULL
);
622 klass
= ATK_OBJECT_GET_CLASS (accessible
);
623 if (klass
->ref_state_set
)
624 return (klass
->ref_state_set
) (accessible
);
630 * atk_object_get_index_in_parent:
631 * @accessible: an #AtkObject
633 * Gets the 0-based index of this accessible in its parent; returns -1 if the
634 * accessible does not have an accessible parent.
636 * Returns: an integer which is the index of the accessible in its parent
639 atk_object_get_index_in_parent (AtkObject
*accessible
)
641 AtkObjectClass
*klass
;
643 g_return_val_if_fail (ATK_OBJECT (accessible
), -1);
645 klass
= ATK_OBJECT_GET_CLASS (accessible
);
646 if (klass
->get_index_in_parent
)
647 return (klass
->get_index_in_parent
) (accessible
);
653 * atk_object_set_name:
654 * @accessible: an #AtkObject
655 * @name: a character string to be set as the accessible name
657 * Sets the accessible name of the accessible.
660 atk_object_set_name (AtkObject
*accessible
,
663 AtkObjectClass
*klass
;
665 g_return_if_fail (ATK_IS_OBJECT (accessible
));
666 g_return_if_fail (name
!= NULL
);
668 klass
= ATK_OBJECT_GET_CLASS (accessible
);
671 (klass
->set_name
) (accessible
, name
);
672 g_object_notify (G_OBJECT (accessible
), atk_object_name_property_name
);
677 * atk_object_set_description:
678 * @accessible: an #AtkObject
679 * @description : a character string to be set as the accessible description
681 * Sets the accessible description of the accessible.
684 atk_object_set_description (AtkObject
*accessible
,
685 const gchar
*description
)
687 AtkObjectClass
*klass
;
689 g_return_if_fail (ATK_IS_OBJECT (accessible
));
690 g_return_if_fail (description
!= NULL
);
692 klass
= ATK_OBJECT_GET_CLASS (accessible
);
693 if (klass
->set_description
)
695 (klass
->set_description
) (accessible
, description
);
696 g_object_notify (G_OBJECT (accessible
), atk_object_name_property_description
);
701 * atk_object_set_parent:
702 * @accessible: an #AtkObject
703 * @parent : an #AtkObject to be set as the accessible parent
705 * Sets the accessible parent of the accessible.
708 atk_object_set_parent (AtkObject
*accessible
,
711 AtkObjectClass
*klass
;
713 g_return_if_fail (ATK_IS_OBJECT (accessible
));
715 klass
= ATK_OBJECT_GET_CLASS (accessible
);
716 if (klass
->set_parent
)
718 (klass
->set_parent
) (accessible
, parent
);
719 g_object_notify (G_OBJECT (accessible
), atk_object_name_property_parent
);
724 * atk_object_set_role:
725 * @accessible: an #AtkObject
726 * @role : an #AtkRole to be set as the role
728 * Sets the role of the accessible.
731 atk_object_set_role (AtkObject
*accessible
,
734 AtkObjectClass
*klass
;
736 g_return_if_fail (ATK_IS_OBJECT (accessible
));
738 klass
= ATK_OBJECT_GET_CLASS (accessible
);
741 (klass
->set_role
) (accessible
, role
);
742 g_object_notify (G_OBJECT (accessible
), atk_object_name_property_role
);
747 * atk_object_connect_property_change_handler:
748 * @accessible: an #AtkObject
749 * @handler : a function to be called when a property changes its value
751 * Specifies a function to be called when a property changes value.
753 * Returns: a #guint which is the handler id used in
754 * atk_object_remove_property_change_handler()
757 atk_object_connect_property_change_handler (AtkObject
*accessible
,
758 AtkPropertyChangeHandler
*handler
)
760 AtkObjectClass
*klass
;
762 g_return_val_if_fail (ATK_IS_OBJECT (accessible
), 0);
763 g_return_val_if_fail ((handler
!= NULL
), 0);
765 klass
= ATK_OBJECT_GET_CLASS (accessible
);
766 if (klass
->connect_property_change_handler
)
767 return (klass
->connect_property_change_handler
) (accessible
, handler
);
773 * atk_object_remove_property_change_handler:
774 * @accessible: an #AtkObject
775 * @handler_id : a guint which identifies the handler to be removed.
777 * Removes a property change handler.
780 atk_object_remove_property_change_handler (AtkObject
*accessible
,
783 AtkObjectClass
*klass
;
785 g_return_if_fail (ATK_IS_OBJECT (accessible
));
787 klass
= ATK_OBJECT_GET_CLASS (accessible
);
788 if (klass
->remove_property_change_handler
)
789 (klass
->remove_property_change_handler
) (accessible
, handler_id
);
793 * atk_object_notify_state_change:
794 * @accessible: an #AtkObject
795 * @state: an #AtkState whose state is changed
796 * @value : a gboolean which indicates whether the state is being set on or off
798 * Emits a state-change signal for the specified state.
801 atk_object_notify_state_change (AtkObject
*accessible
,
805 G_CONST_RETURN gchar
* name
;
807 name
= atk_state_type_get_name (state
);
808 g_signal_emit (accessible
, atk_object_signals
[STATE_CHANGE
],
809 g_quark_from_string (name
),
814 * atk_implementor_ref_accessible:
815 * @implementor: The #GObject instance which should implement #AtkImplementorIface
816 * if a non-null return value is required.
818 * Gets a reference to an object's #AtkObject implementation, if
819 * the object implements #AtkObjectIface
821 * Returns: a reference to an object's #AtkObject implementation
824 atk_implementor_ref_accessible (AtkImplementor
*object
)
826 AtkImplementorIface
*iface
;
827 AtkObject
*accessible
= NULL
;
829 g_return_val_if_fail (ATK_IS_IMPLEMENTOR (object
), NULL
);
831 iface
= ATK_IMPLEMENTOR_GET_IFACE (object
);
834 accessible
= iface
->ref_accessible (object
);
836 g_return_val_if_fail ((accessible
!= NULL
), NULL
);
841 static AtkRelationSet
*
842 atk_object_real_ref_relation_set (AtkObject
*accessible
)
844 g_return_val_if_fail (accessible
->relation_set
, NULL
);
845 g_object_ref (accessible
->relation_set
);
847 return accessible
->relation_set
;
851 atk_object_real_set_property (GObject
*object
,
856 AtkObject
*accessible
;
858 accessible
= ATK_OBJECT (object
);
863 atk_object_set_name (accessible
, g_value_get_string (value
));
865 case PROP_DESCRIPTION
:
866 atk_object_set_description (accessible
, g_value_get_string (value
));
869 atk_object_set_role (accessible
, g_value_get_int (value
));
872 atk_object_set_parent (accessible
, g_value_get_object (value
));
875 if (ATK_IS_VALUE (accessible
))
876 atk_value_set_current_value (ATK_VALUE (accessible
), value
);
884 atk_object_real_get_property (GObject
*object
,
889 AtkObject
*accessible
;
891 accessible
= ATK_OBJECT (object
);
896 g_value_set_string (value
, atk_object_get_name (accessible
));
898 case PROP_DESCRIPTION
:
899 g_value_set_string (value
, atk_object_get_description (accessible
));
902 g_value_set_int (value
, atk_object_get_role (accessible
));
905 if (ATK_IS_COMPONENT (accessible
))
906 g_value_set_int (value
, atk_component_get_layer (ATK_COMPONENT (accessible
)));
908 case PROP_MDI_ZORDER
:
909 if (ATK_IS_COMPONENT (accessible
))
910 g_value_set_int (value
, atk_component_get_mdi_zorder (ATK_COMPONENT (accessible
)));
913 g_value_set_object (value
, atk_object_get_parent (accessible
));
916 if (ATK_IS_VALUE (accessible
))
917 atk_value_get_current_value (ATK_VALUE (accessible
), value
);
920 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, prop_id
, pspec
);
926 atk_object_finalize (GObject
*object
)
928 AtkObject
*accessible
;
930 g_return_if_fail (ATK_IS_OBJECT (object
));
932 accessible
= ATK_OBJECT (object
);
934 g_free (accessible
->name
);
935 g_free (accessible
->description
);
938 * Free memory allocated for relation set if it have been allocated.
940 if (accessible
->relation_set
)
941 g_object_unref (accessible
->relation_set
);
943 if (accessible
->accessible_parent
)
944 g_object_unref (accessible
->accessible_parent
);
946 G_OBJECT_CLASS (parent_class
)->finalize (object
);
949 static G_CONST_RETURN gchar
*
950 atk_object_real_get_name (AtkObject
*object
)
955 static G_CONST_RETURN gchar
*
956 atk_object_real_get_description (AtkObject
*object
)
958 return object
->description
;
962 atk_object_real_get_parent (AtkObject
*object
)
964 return object
->accessible_parent
;
968 atk_object_real_get_role (AtkObject
*object
)
974 atk_object_real_get_layer (AtkObject
*object
)
976 return object
->layer
;
980 atk_object_real_ref_state_set (AtkObject
*accessible
)
982 AtkStateSet
*state_set
;
985 state_set
= atk_state_set_new ();
987 ap
= atk_object_get_parent (accessible
);
989 if (ATK_IS_SELECTION (ap
))
993 atk_state_set_add_state (state_set
, ATK_STATE_SELECTABLE
);
995 i
= atk_object_get_index_in_parent (accessible
);
997 if (atk_selection_is_child_selected(ATK_SELECTION (ap
), i
))
998 atk_state_set_add_state (state_set
, ATK_STATE_SELECTED
);
1005 atk_object_real_set_name (AtkObject
*object
,
1008 g_free (object
->name
);
1009 object
->name
= g_strdup (name
);
1013 atk_object_real_set_description (AtkObject
*object
,
1014 const gchar
*description
)
1016 g_free (object
->description
);
1017 object
->description
= g_strdup (description
);
1021 atk_object_real_set_parent (AtkObject
*object
,
1024 if (object
->accessible_parent
)
1025 g_object_unref (object
->accessible_parent
);
1027 object
->accessible_parent
= parent
;
1028 if (object
->accessible_parent
)
1029 g_object_ref (object
->accessible_parent
);
1033 atk_object_real_set_role (AtkObject
*object
,
1036 object
->role
= role
;
1040 atk_object_real_connect_property_change_handler (AtkObject
*obj
,
1041 AtkPropertyChangeHandler
*handler
)
1043 return g_signal_connect_closure_by_id (obj
,
1044 atk_object_signals
[PROPERTY_CHANGE
],
1047 G_CALLBACK (handler
), NULL
,
1048 (GClosureNotify
) NULL
),
1053 atk_object_real_remove_property_change_handler (AtkObject
*obj
,
1056 g_signal_handler_disconnect (obj
, handler_id
);
1060 * atk_object_initialize:
1061 * @accessible: a #AtkObject
1062 * @data: a #gpointer which identifies the object for which the AtkObject was created.
1064 * This function is called when implementing subclasses of #AtkObject.
1065 * It does initialization required for the new object. It is intended
1066 * that this function should called only in the ..._new() functions used
1067 * to create an instance of a subclass of #AtkObject
1070 atk_object_initialize (AtkObject
*accessible
,
1073 AtkObjectClass
*klass
;
1075 g_return_if_fail (ATK_IS_OBJECT (accessible
));
1077 klass
= ATK_OBJECT_GET_CLASS (accessible
);
1078 if (klass
->initialize
)
1079 klass
->initialize (accessible
, data
);
1083 * This function is a signal handler for notify signal which gets emitted
1084 * when a property changes value.
1086 * It constructs an AtkPropertyValues structure and emits a "property_changed"
1087 * signal which causes the user specified AtkPropertyChangeHandler
1091 atk_object_notify (GObject
*obj
,
1094 AtkPropertyValues values
= { 0, };
1096 g_value_init (&values
.new_value
, pspec
->value_type
);
1097 g_object_get_property (obj
, pspec
->name
, &values
.new_value
);
1098 values
.property_name
= pspec
->name
;
1099 g_signal_emit (obj
, atk_object_signals
[PROPERTY_CHANGE
],
1100 g_quark_from_string (pspec
->name
),
1102 g_value_unset (&values
.new_value
);
1106 * atk_role_get_name:
1107 * @role: The #AtkRole whose name is required
1109 * Gets the description string describing the #AtkRole @role.
1111 * Returns: the string describing the AtkRole
1113 G_CONST_RETURN gchar
*
1114 atk_role_get_name (AtkRole role
)
1116 GTypeClass
*type_class
;
1120 type_class
= g_type_class_ref (ATK_TYPE_ROLE
);
1121 g_return_val_if_fail (G_IS_ENUM_CLASS (type_class
), NULL
);
1123 value
= g_enum_get_value (G_ENUM_CLASS (type_class
), role
);
1127 name
= value
->value_nick
;
1135 n
-= ATK_ROLE_LAST_DEFINED
+ 1;
1137 if (n
< extra_roles
->len
)
1138 name
= g_ptr_array_index (extra_roles
, n
);
1141 g_type_class_unref (type_class
);
1146 * atk_role_get_localized_name:
1147 * @role: The #AtkRole whose localized name is required
1149 * Gets the localized description string describing the #AtkRole @role.
1151 * Returns: the localized string describing the AtkRole
1153 G_CONST_RETURN gchar
*
1154 atk_role_get_localized_name (AtkRole role
)
1156 G_CONST_RETURN gchar
*name
;
1160 case ATK_ROLE_INVALID
:
1161 name
= _("invalid");
1163 case ATK_ROLE_ACCEL_LABEL
:
1164 name
= _("accel-label");
1166 case ATK_ROLE_ALERT
:
1169 case ATK_ROLE_ANIMATION
:
1170 name
= _("animation");
1172 case ATK_ROLE_ARROW
:
1175 case ATK_ROLE_CALENDAR
:
1176 name
= _("calendar");
1178 case ATK_ROLE_CANVAS
:
1181 case ATK_ROLE_CHECK_BOX
:
1182 name
= _("check-box");
1184 case ATK_ROLE_CHECK_MENU_ITEM
:
1185 name
= _("check-menu-item");
1187 case ATK_ROLE_COLOR_CHOOSER
:
1188 name
= _("color-chooser");
1190 case ATK_ROLE_COLUMN_HEADER
:
1191 name
= _("column-header");
1193 case ATK_ROLE_COMBO_BOX
:
1194 name
= _("combo-box");
1196 case ATK_ROLE_DATE_EDITOR
:
1197 name
= _("date-editor");
1199 case ATK_ROLE_DESKTOP_ICON
:
1200 name
= _("desktop-icon");
1202 case ATK_ROLE_DESKTOP_FRAME
:
1203 name
= _("desktop-frame");
1208 case ATK_ROLE_DIALOG
:
1211 case ATK_ROLE_DIRECTORY_PANE
:
1212 name
= _("directory-pane");
1214 case ATK_ROLE_DRAWING_AREA
:
1215 name
= _("drawing-area");
1217 case ATK_ROLE_FILE_CHOOSER
:
1218 name
= _("file-chooser");
1220 case ATK_ROLE_FILLER
:
1223 case ATK_ROLE_FONT_CHOOSER
:
1224 name
= _("font-chooser");
1226 case ATK_ROLE_FRAME
:
1229 case ATK_ROLE_GLASS_PANE
:
1230 name
= _("glass-pane");
1232 case ATK_ROLE_HTML_CONTAINER
:
1233 name
= _("html-container");
1238 case ATK_ROLE_IMAGE
:
1241 case ATK_ROLE_INTERNAL_FRAME
:
1242 name
= _("internal-frame");
1244 case ATK_ROLE_LABEL
:
1247 case ATK_ROLE_LAYERED_PANE
:
1248 name
= _("layered-pane");
1253 case ATK_ROLE_LIST_ITEM
:
1254 name
= _("list-item");
1259 case ATK_ROLE_MENU_BAR
:
1260 name
= _("menu-bar");
1262 case ATK_ROLE_MENU_ITEM
:
1263 name
= _("menu-item");
1265 case ATK_ROLE_OPTION_PANE
:
1266 name
= _("option-pane");
1268 case ATK_ROLE_PAGE_TAB
:
1269 name
= _("page-tab");
1271 case ATK_ROLE_PAGE_TAB_LIST
:
1272 name
= _("page-tab-list");
1274 case ATK_ROLE_PANEL
:
1277 case ATK_ROLE_PASSWORD_TEXT
:
1278 name
= _("password-text");
1280 case ATK_ROLE_POPUP_MENU
:
1281 name
= _("popup-menu");
1283 case ATK_ROLE_PROGRESS_BAR
:
1284 name
= _("progress-bar");
1286 case ATK_ROLE_PUSH_BUTTON
:
1287 name
= _("push-button");
1289 case ATK_ROLE_RADIO_BUTTON
:
1290 name
= _("radio-button");
1292 case ATK_ROLE_RADIO_MENU_ITEM
:
1293 name
= _("radio-menu-item");
1295 case ATK_ROLE_ROOT_PANE
:
1296 name
= _("root-pane");
1298 case ATK_ROLE_ROW_HEADER
:
1299 name
= _("row-header");
1301 case ATK_ROLE_SCROLL_BAR
:
1302 name
= _("scroll-bar");
1304 case ATK_ROLE_SCROLL_PANE
:
1305 name
= _("scroll-pane");
1307 case ATK_ROLE_SEPARATOR
:
1308 name
= _("separator");
1310 case ATK_ROLE_SLIDER
:
1313 case ATK_ROLE_SPLIT_PANE
:
1314 name
= _("split-pane");
1316 case ATK_ROLE_SPIN_BUTTON
:
1317 name
= _("spin-button");
1319 case ATK_ROLE_STATUSBAR
:
1320 name
= _("statusbar");
1322 case ATK_ROLE_TABLE
:
1325 case ATK_ROLE_TABLE_CELL
:
1326 name
= _("table-cell");
1328 case ATK_ROLE_TABLE_COLUMN_HEADER
:
1329 name
= _("table-column-header");
1331 case ATK_ROLE_TABLE_ROW_HEADER
:
1332 name
= _("table-row-header");
1334 case ATK_ROLE_TEAR_OFF_MENU_ITEM
:
1335 name
= _("tear-off-menu-item");
1337 case ATK_ROLE_TERMINAL
:
1338 name
= _("terminal");
1343 case ATK_ROLE_TOGGLE_BUTTON
:
1344 name
= _("toggle-button");
1346 case ATK_ROLE_TOOL_BAR
:
1347 name
= _("tool-bar");
1349 case ATK_ROLE_TOOL_TIP
:
1350 name
= _("tool-tip");
1355 case ATK_ROLE_TREE_TABLE
:
1356 name
= _("tree-table");
1358 case ATK_ROLE_UNKNOWN
:
1359 name
= _("unknown");
1361 case ATK_ROLE_VIEWPORT
:
1362 name
= _("viewport");
1364 case ATK_ROLE_WINDOW
:
1367 case ATK_ROLE_HEADER
:
1370 case ATK_ROLE_FOOTER
:
1373 case ATK_ROLE_PARAGRAPH
:
1374 name
= _("paragraph");
1376 case ATK_ROLE_RULER
:
1380 name
= atk_role_get_name (role
);
1387 * atk_role_for_name:
1388 * @name: a string which is the (non-localized) name of an ATK role.
1390 * Get the #AtkRole type corresponding to a rolew name.
1392 * Returns: the #AtkRole enumerated type corresponding to the specified
1394 * or #ATK_ROLE_INVALID if no matching role is found.
1397 atk_role_for_name (const gchar
*name
)
1399 GTypeClass
*type_class
;
1401 AtkRole role
= ATK_ROLE_INVALID
;
1403 g_return_val_if_fail (name
, ATK_ROLE_INVALID
);
1405 type_class
= g_type_class_ref (ATK_TYPE_ROLE
);
1406 g_return_val_if_fail (G_IS_ENUM_CLASS (type_class
), ATK_ROLE_INVALID
);
1408 value
= g_enum_get_value_by_nick (G_ENUM_CLASS (type_class
), name
);
1412 role
= value
->value
;
1420 for (i
= 0; i
< extra_roles
->len
; i
++)
1422 gchar
*extra_role
= (gchar
*)g_ptr_array_index (extra_roles
, i
);
1424 g_return_val_if_fail (extra_role
, ATK_ROLE_INVALID
);
1426 if (strcmp (name
, extra_role
) == 0)
1428 role
= i
+ 1 + ATK_ROLE_LAST_DEFINED
;
1434 g_type_class_unref (type_class
);
1440 * atk_object_add_relationship:
1441 * @object: The #AtkObject to which an AtkRelation is to be added.
1442 * @relationship: The #AtkRelationType of the relation
1443 * @target: The #AtkObject which is to be the target of the relation.
1445 * Adds a relationship of the specified type with the specified target.
1447 * Returns TRUE if the relationship is added.
1450 atk_object_add_relationship (AtkObject
*object
,
1451 AtkRelationType relationship
,
1454 AtkObject
*array
[1];
1455 AtkRelation
*relation
;
1457 g_return_val_if_fail (ATK_IS_OBJECT (object
), FALSE
);
1458 g_return_val_if_fail (ATK_IS_OBJECT (target
), FALSE
);
1461 relation
= atk_relation_new (array
, 1, relationship
);
1462 atk_relation_set_add (object
->relation_set
, relation
);
1463 g_object_unref (relation
);
1469 * atk_object_remove_relationship:
1470 * @object: The #AtkObject from which an AtkRelation is to be removed.
1471 * @relationship: The #AtkRelationType of the relation
1472 * @target: The #AtkObject which is the target of the relation to be removed.
1474 * Removes a relationship of the specified type with the specified target.
1476 * Returns TRUE if the relationship is removed.
1479 atk_object_remove_relationship (AtkObject
*object
,
1480 AtkRelationType relationship
,
1483 gint n_relations
, i
;
1484 gboolean ret
= FALSE
;
1485 AtkRelation
*relation
;
1487 g_return_val_if_fail (ATK_IS_OBJECT (object
), FALSE
);
1488 g_return_val_if_fail (ATK_IS_OBJECT (target
), FALSE
);
1490 n_relations
= atk_relation_set_get_n_relations (object
->relation_set
);
1491 for (i
= 0; i
< n_relations
; i
++)
1493 relation
= atk_relation_set_get_relation (object
->relation_set
, i
);
1494 if (atk_relation_get_relation_type (relation
) == relationship
)
1499 array
= atk_relation_get_target (relation
);
1501 if (g_ptr_array_index (array
, 0) == target
)
1503 atk_relation_set_remove (object
->relation_set
, relation
);