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>
26 /* New GObject properties registered by AtkObject */
29 PROP_0, /* gobject convention */
33 PROP_PARENT, /* ancestry has changed */
34 PROP_STATE, /* AtkStateSet for the object has changed */
38 PROP_TABLE_COLUMN_DESCRIPTION,
39 PROP_TABLE_COLUMN_HEADER,
40 PROP_TABLE_ROW_DESCRIPTION,
41 PROP_TABLE_ROW_HEADER,
43 PROP_LAST /* gobject convention */
56 static void atk_object_class_init (AtkObjectClass *klass);
57 static void atk_object_init (AtkObject *accessible,
58 AtkObjectClass *klass);
59 static AtkRelationSet* atk_object_real_ref_relation_set
60 (AtkObject *accessible);
62 static void atk_object_real_set_property (GObject *object,
66 static void atk_object_real_get_property (GObject *object,
70 static void atk_object_finalize (GObject *object);
71 static G_CONST_RETURN gchar*
72 atk_object_real_get_name (AtkObject *object);
73 static G_CONST_RETURN gchar*
74 atk_object_real_get_description
76 static AtkObject* atk_object_real_get_parent (AtkObject *object);
77 static AtkRole atk_object_real_get_role (AtkObject *object);
78 static AtkStateSet* atk_object_real_ref_state_set
80 static void atk_object_real_set_name (AtkObject *object,
82 static void atk_object_real_set_description
84 const gchar *description);
85 static void atk_object_real_set_parent (AtkObject *object,
87 static void atk_object_real_set_role (AtkObject *object,
89 static guint atk_object_real_connect_property_change_handler
91 AtkPropertyChangeHandler
93 static void atk_object_real_remove_property_change_handler
96 static void atk_object_notify (GObject *obj,
100 static guint atk_object_signals[LAST_SIGNAL] = { 0, };
102 static gpointer parent_class = NULL;
104 static const gchar* atk_object_name_property_name = "accessible-name";
105 static const gchar* atk_object_name_property_state = "accessible-state";
106 static const gchar* atk_object_name_property_description = "accessible-description";
107 static const gchar* atk_object_name_property_parent = "accessible-parent";
108 static const gchar* atk_object_name_property_value = "accessible-value";
109 static const gchar* atk_object_name_property_role = "accessible-role";
110 static const gchar* atk_object_name_property_table_caption = "accessible-table-caption";
111 static const gchar* atk_object_name_property_table_column_description = "accessible-table-column-description";
112 static const gchar* atk_object_name_property_table_column_header = "accessible-table-column-header";
113 static const gchar* atk_object_name_property_table_row_description = "accessible-table-row-description";
114 static const gchar* atk_object_name_property_table_row_header = "accessible-table-row-header";
115 static const gchar* atk_object_name_property_table_summary = "accessible-table-summary";
118 atk_object_get_type (void)
120 static GType type = 0;
124 static const GTypeInfo typeInfo =
126 sizeof (AtkObjectClass),
127 (GBaseInitFunc) NULL,
128 (GBaseFinalizeFunc) NULL,
129 (GClassInitFunc) atk_object_class_init,
130 (GClassFinalizeFunc) NULL,
134 (GInstanceInitFunc) atk_object_init,
136 type = g_type_register_static (G_TYPE_OBJECT, "AtkObject", &typeInfo, 0) ;
142 atk_object_class_init (AtkObjectClass *klass)
144 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
146 parent_class = g_type_class_ref (G_TYPE_OBJECT);
148 gobject_class->set_property = atk_object_real_set_property;
149 gobject_class->get_property = atk_object_real_get_property;
150 gobject_class->finalize = atk_object_finalize;
151 gobject_class->notify = atk_object_notify;
153 klass->get_name = atk_object_real_get_name;
154 klass->get_description = atk_object_real_get_description;
155 klass->get_parent = atk_object_real_get_parent;
156 klass->get_n_children = NULL;
157 klass->ref_child = NULL;
158 klass->get_index_in_parent = NULL;
159 klass->ref_relation_set = atk_object_real_ref_relation_set;
160 klass->get_role = atk_object_real_get_role;
161 klass->ref_state_set = atk_object_real_ref_state_set;
162 klass->set_name = atk_object_real_set_name;
163 klass->set_description = atk_object_real_set_description;
164 klass->set_parent = atk_object_real_set_parent;
165 klass->set_role = atk_object_real_set_role;
166 klass->connect_property_change_handler =
167 atk_object_real_connect_property_change_handler;
168 klass->remove_property_change_handler =
169 atk_object_real_remove_property_change_handler;
172 * We do not define default signal handlers here
174 klass->children_changed = NULL;
175 klass->focus_event = NULL;
176 klass->property_change = NULL;
177 klass->visible_data_changed = NULL;
179 g_object_class_install_property (gobject_class,
181 g_param_spec_string (atk_object_name_property_name,
183 "Object instance\'s name formatted for "
184 "assistive technology access",
187 g_object_class_install_property (gobject_class,
189 g_param_spec_string (atk_object_name_property_description,
190 "Accessible Description",
191 "Description of an object, formatted for "
192 "assistive technology access",
195 g_object_class_install_property (gobject_class,
197 g_param_spec_int (atk_object_name_property_state,
198 "Accessible State Set",
199 "The accessible state set of this object "
200 "or its UI component",
205 g_object_class_install_property (gobject_class,
207 g_param_spec_object (atk_object_name_property_parent,
209 "Is used to notify that the parent has changed ",
212 g_object_class_install_property (gobject_class,
214 g_param_spec_double (atk_object_name_property_value,
216 "Is used to notify that the value has changed ",
221 g_object_class_install_property (gobject_class,
223 g_param_spec_int (atk_object_name_property_role,
225 "The accessible role this object ",
230 g_object_class_install_property (gobject_class,
232 g_param_spec_string (atk_object_name_property_table_caption,
233 "Accessible Table Caption",
234 "Is used to notify that the table caption has changed ",
237 g_object_class_install_property (gobject_class,
238 PROP_TABLE_COLUMN_HEADER,
239 g_param_spec_object (atk_object_name_property_table_column_header,
240 "Accessible Table Column Header",
241 "Is used to notify that the table column header has changed ",
244 g_object_class_install_property (gobject_class,
245 PROP_TABLE_COLUMN_DESCRIPTION,
246 g_param_spec_string (atk_object_name_property_table_column_description,
247 "Accessible Table Column Description",
248 "Is used to notify that the table columnscription has changed ",
251 g_object_class_install_property (gobject_class,
252 PROP_TABLE_ROW_HEADER,
253 g_param_spec_object (atk_object_name_property_table_row_header,
254 "Accessible Table Row Header",
255 "Is used to notify that the table row header has changed ",
258 g_object_class_install_property (gobject_class,
259 PROP_TABLE_ROW_DESCRIPTION,
260 g_param_spec_string (atk_object_name_property_table_row_description,
261 "Accessible Table Row Description",
262 "Is used to notify that the table row description has changed ",
265 g_object_class_install_property (gobject_class,
267 g_param_spec_object (atk_object_name_property_table_summary,
268 "Accessible Table Summary",
269 "Is used to notify that the table summary has changed ",
273 * The signal "children_changed" supports two details:
276 atk_object_signals[CHILDREN_CHANGED] =
277 g_signal_new ("children_changed",
278 G_TYPE_FROM_CLASS (klass),
279 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
280 G_STRUCT_OFFSET (AtkObjectClass, children_changed),
282 g_cclosure_marshal_VOID__UINT_POINTER,
284 2, G_TYPE_UINT, G_TYPE_POINTER);
285 atk_object_signals[FOCUS_EVENT] =
286 g_signal_new ("focus_event",
287 G_TYPE_FROM_CLASS (klass),
289 G_STRUCT_OFFSET (AtkObjectClass, focus_event),
291 g_cclosure_marshal_VOID__BOOLEAN,
294 atk_object_signals[PROPERTY_CHANGE] =
295 g_signal_new ("property_change",
296 G_TYPE_FROM_CLASS (klass),
297 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
298 G_STRUCT_OFFSET (AtkObjectClass, property_change),
299 (GSignalAccumulator) NULL, NULL,
300 g_cclosure_marshal_VOID__POINTER,
304 * The "state_change" signal supports details, one for each accessible state type
307 g_signal_new ("state_change",
308 G_TYPE_FROM_CLASS (klass),
309 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
310 G_STRUCT_OFFSET (AtkObjectClass, state_change),
311 (GSignalAccumulator) NULL, NULL,
312 g_cclosure_marshal_VOID__POINTER,
315 atk_object_signals[VISIBLE_DATA_CHANGED] =
316 g_signal_new ("visible_data_changed",
317 G_TYPE_FROM_CLASS (klass),
319 G_STRUCT_OFFSET (AtkObjectClass, visible_data_changed),
320 (GSignalAccumulator) NULL, NULL,
321 g_cclosure_marshal_VOID__VOID,
326 atk_object_init (AtkObject *accessible,
327 AtkObjectClass *klass)
329 accessible->name = NULL;
330 accessible->description = NULL;
331 accessible->accessible_parent = NULL;
332 accessible->relation_set = atk_relation_set_new();
333 accessible->role = ATK_ROLE_UNKNOWN;
337 atk_implementor_get_type (void)
339 static GType type = 0;
343 static const GTypeInfo typeInfo =
345 sizeof (AtkImplementorIface),
346 (GBaseInitFunc) NULL,
347 (GBaseFinalizeFunc) NULL,
350 type = g_type_register_static (G_TYPE_INTERFACE, "AtkImplementorIface", &typeInfo, 0) ;
357 * atk_object_get_name:
358 * @accessible: an #AtkObject
360 * Gets the accessible name of the accessible.
362 * Returns: a character string representing the accessible name of the object.
364 G_CONST_RETURN gchar*
365 atk_object_get_name (AtkObject *accessible)
367 AtkObjectClass *klass;
369 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
371 klass = ATK_OBJECT_GET_CLASS (accessible);
373 return (klass->get_name) (accessible);
379 * atk_object_get_description:
380 * @accessible: an #AtkObject
382 * Gets the accessible description of the accessible.
384 * Returns: a character string representing the accessible description
388 G_CONST_RETURN gchar*
389 atk_object_get_description (AtkObject *accessible)
391 AtkObjectClass *klass;
393 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
395 klass = ATK_OBJECT_GET_CLASS (accessible);
396 if (klass->get_description)
397 return (klass->get_description) (accessible);
403 * atk_object_get_parent:
404 * @accessible: an #AtkObject
406 * Gets the accessible parent of the accessible.
408 * Returns: a #AtkObject representing the accessible parent of the accessible
411 atk_object_get_parent (AtkObject *accessible)
413 AtkObjectClass *klass;
415 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
417 klass = ATK_OBJECT_GET_CLASS (accessible);
418 if (klass->get_parent)
419 return (klass->get_parent) (accessible);
425 * atk_object_get_n_accessible_children:
426 * @accessible: an #AtkObject
428 * Gets the number of accessible children of the accessible.
430 * Returns: an integer representing the number of accessible children
434 atk_object_get_n_accessible_children (AtkObject *accessible)
436 AtkObjectClass *klass;
438 g_return_val_if_fail (ATK_IS_OBJECT (accessible), 0);
440 klass = ATK_OBJECT_GET_CLASS (accessible);
441 if (klass->get_n_children)
442 return (klass->get_n_children) (accessible);
448 * atk_object_ref_accessible_child:
449 * @accessible: an #AtkObject
450 * @i: a gint representing the position of the child, starting from 0
452 * Gets a reference to the specified accessible child of the object.
453 * The accessible children are 0-based so the first accessible child is
454 * at index 0, the second at index 1 and so on.
456 * Returns: an #AtkObject representing the specified accessible child
460 atk_object_ref_accessible_child (AtkObject *accessible,
463 AtkObjectClass *klass;
465 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
467 klass = ATK_OBJECT_GET_CLASS (accessible);
468 if (klass->ref_child)
469 return (klass->ref_child) (accessible, i);
475 * atk_object_ref_relation_set:
476 * @accessible: an #AtkObject
478 * Gets the #AtkRelationSet associated with the object.
480 * Returns: an #AtkRelationSet representing the relation set of the object.
483 atk_object_ref_relation_set (AtkObject *accessible)
485 AtkObjectClass *klass;
487 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
489 klass = ATK_OBJECT_GET_CLASS (accessible);
490 if (klass->ref_relation_set)
491 return (klass->ref_relation_set) (accessible);
498 * @name: a character string describing the new role.
500 * Registers the role specified by @name.
502 * Returns: an #AtkRole for the new role.
505 atk_role_register (const gchar *name)
507 /* TODO: associate name with new type */
508 static guint type = ATK_ROLE_LAST_DEFINED;
513 * atk_object_get_role:
514 * @accessible: an #AtkObject
516 * Gets the role of the accessible.
518 * Returns: an #AtkRole which is the role of the accessible
521 atk_object_get_role (AtkObject *accessible)
523 AtkObjectClass *klass;
525 g_return_val_if_fail (ATK_IS_OBJECT (accessible), ATK_ROLE_UNKNOWN);
527 klass = ATK_OBJECT_GET_CLASS (accessible);
529 return (klass->get_role) (accessible);
531 return ATK_ROLE_UNKNOWN;
535 * atk_object_ref_state_set:
536 * @accessible: an #AtkObject
538 * Gets a reference to the state set of the accessible; the caller must
539 * unreference it when it is no longer needed.
541 * Returns: a reference to an #AtkStateSet which is the state
542 * set of the accessible
545 atk_object_ref_state_set (AtkObject *accessible)
547 AtkObjectClass *klass;
549 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
551 klass = ATK_OBJECT_GET_CLASS (accessible);
552 if (klass->ref_state_set)
553 return (klass->ref_state_set) (accessible);
559 * atk_object_get_index_in_parent:
560 * @accessible: an #AtkObject
562 * Gets the 0-based index of this accessible in its parent; returns -1 if the
563 * accessible does not have an accessible parent.
565 * Returns: an integer which is the index of the accessible in its parent
568 atk_object_get_index_in_parent (AtkObject *accessible)
570 AtkObjectClass *klass;
572 g_return_val_if_fail (ATK_OBJECT (accessible), -1);
574 klass = ATK_OBJECT_GET_CLASS (accessible);
575 if (klass->get_index_in_parent)
576 return (klass->get_index_in_parent) (accessible);
582 * atk_object_set_name:
583 * @accessible: an #AtkObject
584 * @name: a character string to be set as the accessible name
586 * Sets the accessible name of the accessible.
589 atk_object_set_name (AtkObject *accessible,
592 AtkObjectClass *klass;
594 g_return_if_fail (ATK_IS_OBJECT (accessible));
595 g_return_if_fail (name != NULL);
597 klass = ATK_OBJECT_GET_CLASS (accessible);
600 (klass->set_name) (accessible, name);
601 g_object_notify (G_OBJECT (accessible), atk_object_name_property_name);
606 * atk_object_set_description:
607 * @accessible: an #AtkObject
608 * @description : a character string to be set as the accessible description
610 * Sets the accessible description of the accessible.
613 atk_object_set_description (AtkObject *accessible,
614 const gchar *description)
616 AtkObjectClass *klass;
618 g_return_if_fail (ATK_IS_OBJECT (accessible));
619 g_return_if_fail (description != NULL);
621 klass = ATK_OBJECT_GET_CLASS (accessible);
622 if (klass->set_description)
624 (klass->set_description) (accessible, description);
625 g_object_notify (G_OBJECT (accessible), atk_object_name_property_description);
630 * atk_object_set_parent:
631 * @accessible: an #AtkObject
632 * @parent : an #AtkObject to be set as the accessible parent
634 * Sets the accessible parent of the accessible.
637 atk_object_set_parent (AtkObject *accessible,
640 AtkObjectClass *klass;
642 g_return_if_fail (ATK_IS_OBJECT (accessible));
644 klass = ATK_OBJECT_GET_CLASS (accessible);
645 if (klass->set_parent)
647 (klass->set_parent) (accessible, parent);
648 g_object_notify (G_OBJECT (accessible), atk_object_name_property_parent);
653 * atk_object_set_role:
654 * @accessible: an #AtkObject
655 * @role : an #AtkRole to be set as the role
657 * Sets the role of the accessible.
660 atk_object_set_role (AtkObject *accessible,
663 AtkObjectClass *klass;
665 g_return_if_fail (ATK_IS_OBJECT (accessible));
667 klass = ATK_OBJECT_GET_CLASS (accessible);
670 (klass->set_role) (accessible, role);
671 g_object_notify (G_OBJECT (accessible), atk_object_name_property_role);
676 * atk_object_connect_property_change_handler:
677 * @accessible: an #AtkObject
678 * @handler : a function to be called when a property changes its value
680 * Specifies a function to be called when a property changes value.
682 * Returns: a #guint which is the handler id used in
683 * atk_object_remove_property_change_handler()
686 atk_object_connect_property_change_handler (AtkObject *accessible,
687 AtkPropertyChangeHandler *handler)
689 AtkObjectClass *klass;
691 g_return_val_if_fail (ATK_IS_OBJECT (accessible), 0);
692 g_return_val_if_fail ((handler != NULL), 0);
694 klass = ATK_OBJECT_GET_CLASS (accessible);
695 if (klass->connect_property_change_handler)
696 return (klass->connect_property_change_handler) (accessible, handler);
702 * atk_object_remove_property_change_handler:
703 * @accessible: an #AtkObject
704 * @handler_id : a guint which identifies the handler to be removed.
706 * Removes a property change handler.
709 atk_object_remove_property_change_handler (AtkObject *accessible,
712 AtkObjectClass *klass;
714 g_return_if_fail (ATK_IS_OBJECT (accessible));
716 klass = ATK_OBJECT_GET_CLASS (accessible);
717 if (klass->remove_property_change_handler)
718 (klass->remove_property_change_handler) (accessible, handler_id);
722 * atk_object_notify_state_change:
723 * @accessible: an #AtkObject
724 * @state: an #AtkState whose state is changed
725 * @value : a gboolean which indicates whether the state is being set on or off
727 * Emits a property_change signal for the specified state.
728 * This signal is caught by an #AtkPropertyChangeHandler
731 atk_object_notify_state_change (AtkObject *accessible,
735 #define N_TOGGLE_STATES 2
736 AtkPropertyValues values = { 0, };
737 AtkState toggle_states[N_TOGGLE_STATES] = { ATK_STATE_EXPANDED,
738 ATK_STATE_COLLAPSED };
739 AtkState toggled_states[N_TOGGLE_STATES] = { ATK_STATE_COLLAPSED,
740 ATK_STATE_EXPANDED };
742 values.property_name = atk_object_name_property_state;
747 g_value_init (&values.new_value, G_TYPE_INT);
748 g_value_set_int (&values.new_value, state);
750 for (i = 0; i < N_TOGGLE_STATES; i++)
752 if (toggle_states[i] == state)
754 g_value_init (&values.old_value, G_TYPE_INT);
755 g_value_set_int (&values.old_value, toggled_states[i]);
762 g_value_init (&values.old_value, G_TYPE_INT);
763 g_value_set_int (&values.old_value, state);
765 g_signal_emit (accessible, atk_object_signals[PROPERTY_CHANGE],
766 g_quark_from_string (atk_object_name_property_state),
771 * atk_implementor_ref_accessible:
772 * @implementor: The #GObject instance which should implement #AtkImplementorIface
773 * if a non-null return value is required.
775 * Gets a reference to an object's #AtkObject implementation, if
776 * the object implements #AtkObjectIface
778 * Returns: a reference to an object's #AtkObject implementation
781 atk_implementor_ref_accessible (AtkImplementor *object)
783 AtkImplementorIface *iface;
784 AtkObject *accessible = NULL;
786 g_return_val_if_fail (ATK_IS_IMPLEMENTOR (object), NULL);
788 iface = ATK_IMPLEMENTOR_GET_IFACE (object);
791 accessible = iface->ref_accessible (object);
793 g_return_val_if_fail ((accessible != NULL), NULL);
798 static AtkRelationSet*
799 atk_object_real_ref_relation_set (AtkObject *accessible)
801 g_return_val_if_fail (accessible->relation_set, NULL);
802 g_object_ref (accessible->relation_set);
804 return accessible->relation_set;
808 atk_object_real_set_property (GObject *object,
813 AtkObject *accessible;
815 accessible = ATK_OBJECT (object);
820 atk_object_set_name (accessible, g_value_get_string (value));
822 case PROP_DESCRIPTION:
823 atk_object_set_description (accessible, g_value_get_string (value));
826 atk_object_set_role (accessible, g_value_get_int (value));
829 atk_object_set_parent (accessible, g_value_get_object (value));
832 if (ATK_IS_VALUE (accessible))
833 atk_value_set_current_value (ATK_VALUE (accessible), value);
841 atk_object_real_get_property (GObject *object,
846 AtkObject *accessible;
848 accessible = ATK_OBJECT (object);
853 g_value_set_string (value, atk_object_get_name (accessible));
855 case PROP_DESCRIPTION:
856 g_value_set_string (value, atk_object_get_description (accessible));
858 g_value_set_int (value, atk_object_get_role (accessible));
861 g_value_set_object (value, atk_object_get_parent (accessible));
864 if (ATK_IS_VALUE (accessible))
865 atk_value_get_current_value (ATK_VALUE (accessible), value);
868 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
874 atk_object_finalize (GObject *object)
876 AtkObject *accessible;
878 g_return_if_fail (ATK_IS_OBJECT (object));
880 accessible = ATK_OBJECT (object);
882 g_free (accessible->name);
883 g_free (accessible->description);
886 * Free memory allocated for relation set if it have been allocated.
888 if (accessible->relation_set)
889 g_object_unref (accessible->relation_set);
891 if (accessible->accessible_parent)
892 g_object_unref (accessible->accessible_parent);
894 G_OBJECT_CLASS (parent_class)->finalize (object);
897 static G_CONST_RETURN gchar*
898 atk_object_real_get_name (AtkObject *object)
903 static G_CONST_RETURN gchar*
904 atk_object_real_get_description (AtkObject *object)
906 return object->description;
910 atk_object_real_get_parent (AtkObject *object)
912 return object->accessible_parent;
916 atk_object_real_get_role (AtkObject *object)
922 atk_object_real_ref_state_set (AtkObject *accessible)
924 AtkStateSet *state_set;
927 state_set = atk_state_set_new ();
929 ap = atk_object_get_parent (accessible);
931 if (ATK_IS_SELECTION (ap))
935 atk_state_set_add_state (state_set, ATK_STATE_SELECTABLE);
937 i = atk_object_get_index_in_parent (accessible);
939 if (atk_selection_is_child_selected(ATK_SELECTION (ap), i))
940 atk_state_set_add_state (state_set, ATK_STATE_SELECTED);
947 atk_object_real_set_name (AtkObject *object,
950 g_free (object->name);
951 object->name = g_strdup (name);
955 atk_object_real_set_description (AtkObject *object,
956 const gchar *description)
958 g_free (object->description);
959 object->description = g_strdup (description);
963 atk_object_real_set_parent (AtkObject *object,
966 if (object->accessible_parent)
967 g_object_unref (object->accessible_parent);
969 object->accessible_parent = parent;
970 if (object->accessible_parent)
971 g_object_ref (object->accessible_parent);
975 atk_object_real_set_role (AtkObject *object,
982 atk_object_real_connect_property_change_handler (AtkObject *obj,
983 AtkPropertyChangeHandler *handler)
985 return g_signal_connect_closure_by_id (obj,
986 atk_object_signals[PROPERTY_CHANGE],
989 G_CALLBACK (handler), NULL,
990 (GClosureNotify) NULL),
995 atk_object_real_remove_property_change_handler (AtkObject *obj,
998 g_signal_handler_disconnect (obj, handler_id);
1002 * This function is a signal handler for notify signal which gets emitted
1003 * when a property changes value.
1005 * It constructs an AtkPropertyValues structure and emits a "property_changed"
1006 * signal which causes the user specified AtkPropertyChangeHandler
1010 atk_object_notify (GObject *obj,
1013 AtkPropertyValues values = { 0, };
1015 g_value_init (&values.new_value, pspec->value_type);
1016 g_object_get_property (obj, pspec->name, &values.new_value);
1017 values.property_name = pspec->name;
1018 g_signal_emit (obj, atk_object_signals[PROPERTY_CHANGE],
1019 g_quark_from_string (pspec->name),