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 */
55 static void atk_object_class_init (AtkObjectClass *klass);
56 static void atk_object_init (AtkObject *accessible,
57 AtkObjectClass *klass);
58 static AtkRelationSet* atk_object_real_ref_relation_set
59 (AtkObject *accessible);
61 static void atk_object_real_set_property (GObject *object,
65 static void atk_object_real_get_property (GObject *object,
69 static void atk_object_finalize (GObject *object);
70 static G_CONST_RETURN gchar*
71 atk_object_real_get_name (AtkObject *object);
72 static G_CONST_RETURN gchar*
73 atk_object_real_get_description
75 static AtkObject* atk_object_real_get_parent (AtkObject *object);
76 static AtkRole atk_object_real_get_role (AtkObject *object);
77 static AtkStateSet* atk_object_real_ref_state_set
79 static void atk_object_real_set_name (AtkObject *object,
81 static void atk_object_real_set_description
83 const gchar *description);
84 static void atk_object_real_set_parent (AtkObject *object,
86 static void atk_object_real_set_role (AtkObject *object,
88 static guint atk_object_real_connect_property_change_handler
90 AtkPropertyChangeHandler
92 static void atk_object_real_remove_property_change_handler
95 static void atk_object_notify (GObject *obj,
99 static guint atk_object_signals[LAST_SIGNAL] = { 0, };
101 static gpointer parent_class = NULL;
103 static const gchar* atk_object_name_property_name = "accessible-name";
104 static const gchar* atk_object_name_property_state = "accessible-state";
105 static const gchar* atk_object_name_property_description = "accessible-description";
106 static const gchar* atk_object_name_property_parent = "accessible-parent";
107 static const gchar* atk_object_name_property_value = "accessible-value";
108 static const gchar* atk_object_name_property_role = "accessible-role";
109 static const gchar* atk_object_name_property_table_caption = "accessible-table-caption";
110 static const gchar* atk_object_name_property_table_column_description = "accessible-table-column-description";
111 static const gchar* atk_object_name_property_table_column_header = "accessible-table-column-header";
112 static const gchar* atk_object_name_property_table_row_description = "accessible-table-row-description";
113 static const gchar* atk_object_name_property_table_row_header = "accessible-table-row-header";
114 static const gchar* atk_object_name_property_table_summary = "accessible-table-summary";
117 atk_object_get_type (void)
119 static GType type = 0;
123 static const GTypeInfo typeInfo =
125 sizeof (AtkObjectClass),
126 (GBaseInitFunc) NULL,
127 (GBaseFinalizeFunc) NULL,
128 (GClassInitFunc) atk_object_class_init,
129 (GClassFinalizeFunc) NULL,
133 (GInstanceInitFunc) atk_object_init,
135 type = g_type_register_static (G_TYPE_OBJECT, "AtkObject", &typeInfo, 0) ;
141 atk_object_class_init (AtkObjectClass *klass)
143 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
145 parent_class = g_type_class_ref (G_TYPE_OBJECT);
147 gobject_class->set_property = atk_object_real_set_property;
148 gobject_class->get_property = atk_object_real_get_property;
149 gobject_class->finalize = atk_object_finalize;
150 gobject_class->notify = atk_object_notify;
152 klass->get_name = atk_object_real_get_name;
153 klass->get_description = atk_object_real_get_description;
154 klass->get_parent = atk_object_real_get_parent;
155 klass->get_n_children = NULL;
156 klass->ref_child = NULL;
157 klass->get_index_in_parent = NULL;
158 klass->ref_relation_set = atk_object_real_ref_relation_set;
159 klass->get_role = atk_object_real_get_role;
160 klass->ref_state_set = atk_object_real_ref_state_set;
161 klass->set_name = atk_object_real_set_name;
162 klass->set_description = atk_object_real_set_description;
163 klass->set_parent = atk_object_real_set_parent;
164 klass->set_role = atk_object_real_set_role;
165 klass->connect_property_change_handler =
166 atk_object_real_connect_property_change_handler;
167 klass->remove_property_change_handler =
168 atk_object_real_remove_property_change_handler;
171 * We do not define default signal handlers here
173 klass->children_changed = NULL;
174 klass->focus_event = NULL;
175 klass->property_change = NULL;
176 klass->visible_data_changed = NULL;
178 g_object_class_install_property (gobject_class,
180 g_param_spec_string (atk_object_name_property_name,
182 "Object instance\'s name formatted for "
183 "assistive technology access",
186 g_object_class_install_property (gobject_class,
188 g_param_spec_string (atk_object_name_property_description,
189 "Accessible Description",
190 "Description of an object, formatted for "
191 "assistive technology access",
194 g_object_class_install_property (gobject_class,
196 g_param_spec_int (atk_object_name_property_state,
197 "Accessible State Set",
198 "The accessible state set of this object "
199 "or its UI component",
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 this object ",
229 g_object_class_install_property (gobject_class,
231 g_param_spec_string (atk_object_name_property_table_caption,
232 "Accessible Table Caption",
233 "Is used to notify that the table caption has changed ",
236 g_object_class_install_property (gobject_class,
237 PROP_TABLE_COLUMN_HEADER,
238 g_param_spec_object (atk_object_name_property_table_column_header,
239 "Accessible Table Column Header",
240 "Is used to notify that the table column header has changed ",
243 g_object_class_install_property (gobject_class,
244 PROP_TABLE_COLUMN_DESCRIPTION,
245 g_param_spec_string (atk_object_name_property_table_column_description,
246 "Accessible Table Column Description",
247 "Is used to notify that the table columnscription has changed ",
250 g_object_class_install_property (gobject_class,
251 PROP_TABLE_ROW_HEADER,
252 g_param_spec_object (atk_object_name_property_table_row_header,
253 "Accessible Table Row Header",
254 "Is used to notify that the table row header has changed ",
257 g_object_class_install_property (gobject_class,
258 PROP_TABLE_ROW_DESCRIPTION,
259 g_param_spec_string (atk_object_name_property_table_row_description,
260 "Accessible Table Row Description",
261 "Is used to notify that the table row description has changed ",
264 g_object_class_install_property (gobject_class,
266 g_param_spec_object (atk_object_name_property_table_summary,
267 "Accessible Table Summary",
268 "Is used to notify that the table summary has changed ",
272 * The signal "children_changed" supports two details:
275 atk_object_signals[CHILDREN_CHANGED] =
276 g_signal_new ("children_changed",
277 G_TYPE_FROM_CLASS (klass),
278 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
279 G_STRUCT_OFFSET (AtkObjectClass, children_changed),
281 g_cclosure_marshal_VOID__UINT_POINTER,
283 2, G_TYPE_UINT, G_TYPE_POINTER);
284 atk_object_signals[FOCUS_EVENT] =
285 g_signal_new ("focus_event",
286 G_TYPE_FROM_CLASS (klass),
288 G_STRUCT_OFFSET (AtkObjectClass, focus_event),
290 g_cclosure_marshal_VOID__BOOLEAN,
293 atk_object_signals[PROPERTY_CHANGE] =
294 g_signal_new ("property_change",
295 G_TYPE_FROM_CLASS (klass),
296 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
297 G_STRUCT_OFFSET (AtkObjectClass, property_change),
298 (GSignalAccumulator) NULL, NULL,
299 g_cclosure_marshal_VOID__POINTER,
302 atk_object_signals[VISIBLE_DATA_CHANGED] =
303 g_signal_new ("visible_data_changed",
304 G_TYPE_FROM_CLASS (klass),
306 G_STRUCT_OFFSET (AtkObjectClass, visible_data_changed),
307 (GSignalAccumulator) NULL, NULL,
308 g_cclosure_marshal_VOID__VOID,
313 atk_object_init (AtkObject *accessible,
314 AtkObjectClass *klass)
316 accessible->name = NULL;
317 accessible->description = NULL;
318 accessible->accessible_parent = NULL;
319 accessible->relation_set = atk_relation_set_new();
320 accessible->role = ATK_ROLE_UNKNOWN;
324 atk_implementor_get_type (void)
326 static GType type = 0;
330 static const GTypeInfo typeInfo =
332 sizeof (AtkImplementorIface),
333 (GBaseInitFunc) NULL,
334 (GBaseFinalizeFunc) NULL,
337 type = g_type_register_static (G_TYPE_INTERFACE, "AtkImplementorIface", &typeInfo, 0) ;
344 * atk_object_get_name:
345 * @accessible: an #AtkObject
347 * Gets the accessible name of the accessible.
349 * Returns: a character string representing the accessible name of the object.
351 G_CONST_RETURN gchar*
352 atk_object_get_name (AtkObject *accessible)
354 AtkObjectClass *klass;
356 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
358 klass = ATK_OBJECT_GET_CLASS (accessible);
360 return (klass->get_name) (accessible);
366 * atk_object_get_description:
367 * @accessible: an #AtkObject
369 * Gets the accessible description of the accessible.
371 * Returns: a character string representing the accessible description
375 G_CONST_RETURN gchar*
376 atk_object_get_description (AtkObject *accessible)
378 AtkObjectClass *klass;
380 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
382 klass = ATK_OBJECT_GET_CLASS (accessible);
383 if (klass->get_description)
384 return (klass->get_description) (accessible);
390 * atk_object_get_parent:
391 * @accessible: an #AtkObject
393 * Gets the accessible parent of the accessible.
395 * Returns: a #AtkObject representing the accessible parent of the accessible
398 atk_object_get_parent (AtkObject *accessible)
400 AtkObjectClass *klass;
402 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
404 klass = ATK_OBJECT_GET_CLASS (accessible);
405 if (klass->get_parent)
406 return (klass->get_parent) (accessible);
412 * atk_object_get_n_accessible_children:
413 * @accessible: an #AtkObject
415 * Gets the number of accessible children of the accessible.
417 * Returns: an integer representing the number of accessible children
421 atk_object_get_n_accessible_children (AtkObject *accessible)
423 AtkObjectClass *klass;
425 g_return_val_if_fail (ATK_IS_OBJECT (accessible), 0);
427 klass = ATK_OBJECT_GET_CLASS (accessible);
428 if (klass->get_n_children)
429 return (klass->get_n_children) (accessible);
435 * atk_object_ref_accessible_child:
436 * @accessible: an #AtkObject
437 * @i: a gint representing the position of the child, starting from 0
439 * Gets a reference to the specified accessible child of the object.
440 * The accessible children are 0-based so the first accessible child is
441 * at index 0, the second at index 1 and so on.
443 * Returns: an #AtkObject representing the specified accessible child
447 atk_object_ref_accessible_child (AtkObject *accessible,
450 AtkObjectClass *klass;
452 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
454 klass = ATK_OBJECT_GET_CLASS (accessible);
455 if (klass->ref_child)
456 return (klass->ref_child) (accessible, i);
462 * atk_object_ref_relation_set:
463 * @accessible: an #AtkObject
465 * Gets the #AtkRelationSet associated with the object.
467 * Returns: an #AtkRelationSet representing the relation set of the object.
470 atk_object_ref_relation_set (AtkObject *accessible)
472 AtkObjectClass *klass;
474 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
476 klass = ATK_OBJECT_GET_CLASS (accessible);
477 if (klass->ref_relation_set)
478 return (klass->ref_relation_set) (accessible);
485 * @name: a character string describing the new role.
487 * Registers the role specified by @name.
489 * Returns: an #AtkRole for the new role.
492 atk_role_register (const gchar *name)
494 /* TODO: associate name with new type */
495 static guint type = ATK_ROLE_LAST_DEFINED;
500 * atk_object_get_role:
501 * @accessible: an #AtkObject
503 * Gets the role of the accessible.
505 * Returns: an #AtkRole which is the role of the accessible
508 atk_object_get_role (AtkObject *accessible)
510 AtkObjectClass *klass;
512 g_return_val_if_fail (ATK_IS_OBJECT (accessible), ATK_ROLE_UNKNOWN);
514 klass = ATK_OBJECT_GET_CLASS (accessible);
516 return (klass->get_role) (accessible);
518 return ATK_ROLE_UNKNOWN;
522 * atk_object_ref_state_set:
523 * @accessible: an #AtkObject
525 * Gets a reference to the state set of the accessible; the caller must
526 * unreference it when it is no longer needed.
528 * Returns: a reference to an #AtkStateSet which is the state
529 * set of the accessible
532 atk_object_ref_state_set (AtkObject *accessible)
534 AtkObjectClass *klass;
536 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
538 klass = ATK_OBJECT_GET_CLASS (accessible);
539 if (klass->ref_state_set)
540 return (klass->ref_state_set) (accessible);
546 * atk_object_get_index_in_parent:
547 * @accessible: an #AtkObject
549 * Gets the 0-based index of this accessible in its parent; returns -1 if the
550 * accessible does not have an accessible parent.
552 * Returns: an integer which is the index of the accessible in its parent
555 atk_object_get_index_in_parent (AtkObject *accessible)
557 AtkObjectClass *klass;
559 g_return_val_if_fail (ATK_OBJECT (accessible), -1);
561 klass = ATK_OBJECT_GET_CLASS (accessible);
562 if (klass->get_index_in_parent)
563 return (klass->get_index_in_parent) (accessible);
569 * atk_object_set_name:
570 * @accessible: an #AtkObject
571 * @name: a character string to be set as the accessible name
573 * Sets the accessible name of the accessible.
576 atk_object_set_name (AtkObject *accessible,
579 AtkObjectClass *klass;
581 g_return_if_fail (ATK_IS_OBJECT (accessible));
582 g_return_if_fail (name != NULL);
584 klass = ATK_OBJECT_GET_CLASS (accessible);
587 (klass->set_name) (accessible, name);
588 g_object_notify (G_OBJECT (accessible), atk_object_name_property_name);
593 * atk_object_set_description:
594 * @accessible: an #AtkObject
595 * @description : a character string to be set as the accessible description
597 * Sets the accessible description of the accessible.
600 atk_object_set_description (AtkObject *accessible,
601 const gchar *description)
603 AtkObjectClass *klass;
605 g_return_if_fail (ATK_IS_OBJECT (accessible));
606 g_return_if_fail (description != NULL);
608 klass = ATK_OBJECT_GET_CLASS (accessible);
609 if (klass->set_description)
611 (klass->set_description) (accessible, description);
612 g_object_notify (G_OBJECT (accessible), atk_object_name_property_description);
617 * atk_object_set_parent:
618 * @accessible: an #AtkObject
619 * @parent : an #AtkObject to be set as the accessible parent
621 * Sets the accessible parent of the accessible.
624 atk_object_set_parent (AtkObject *accessible,
627 AtkObjectClass *klass;
629 g_return_if_fail (ATK_IS_OBJECT (accessible));
631 klass = ATK_OBJECT_GET_CLASS (accessible);
632 if (klass->set_parent)
634 (klass->set_parent) (accessible, parent);
635 g_object_notify (G_OBJECT (accessible), atk_object_name_property_parent);
640 * atk_object_set_role:
641 * @accessible: an #AtkObject
642 * @role : an #AtkRole to be set as the role
644 * Sets the role of the accessible.
647 atk_object_set_role (AtkObject *accessible,
650 AtkObjectClass *klass;
652 g_return_if_fail (ATK_IS_OBJECT (accessible));
654 klass = ATK_OBJECT_GET_CLASS (accessible);
657 (klass->set_role) (accessible, role);
658 g_object_notify (G_OBJECT (accessible), atk_object_name_property_role);
663 * atk_object_connect_property_change_handler:
664 * @accessible: an #AtkObject
665 * @handler : a function to be called when a property changes its value
667 * Specifies a function to be called when a property changes value.
669 * Returns: a #guint which is the handler id used in
670 * atk_object_remove_property_change_handler()
673 atk_object_connect_property_change_handler (AtkObject *accessible,
674 AtkPropertyChangeHandler *handler)
676 AtkObjectClass *klass;
678 g_return_val_if_fail (ATK_IS_OBJECT (accessible), 0);
679 g_return_val_if_fail ((handler != NULL), 0);
681 klass = ATK_OBJECT_GET_CLASS (accessible);
682 if (klass->connect_property_change_handler)
683 return (klass->connect_property_change_handler) (accessible, handler);
689 * atk_object_remove_property_change_handler:
690 * @accessible: an #AtkObject
691 * @handler_id : a guint which identifies the handler to be removed.
693 * Removes a property change handler.
696 atk_object_remove_property_change_handler (AtkObject *accessible,
699 AtkObjectClass *klass;
701 g_return_if_fail (ATK_IS_OBJECT (accessible));
703 klass = ATK_OBJECT_GET_CLASS (accessible);
704 if (klass->remove_property_change_handler)
705 (klass->remove_property_change_handler) (accessible, handler_id);
709 * atk_object_notify_state_change:
710 * @accessible: an #AtkObject
711 * @state: an #AtkState whose state is changed
712 * @value : a gboolean which indicates whether the state is being set on or off
714 * Emits a property_change signal for the specified state.
715 * This signal is caught by an #AtkPropertyChangeHandler
718 atk_object_notify_state_change (AtkObject *accessible,
722 #define N_TOGGLE_STATES 2
723 AtkPropertyValues values = { 0, };
724 AtkState toggle_states[N_TOGGLE_STATES] = { ATK_STATE_EXPANDED,
725 ATK_STATE_COLLAPSED };
726 AtkState toggled_states[N_TOGGLE_STATES] = { ATK_STATE_COLLAPSED,
727 ATK_STATE_EXPANDED };
729 values.property_name = atk_object_name_property_state;
734 g_value_init (&values.new_value, G_TYPE_INT);
735 g_value_set_int (&values.new_value, state);
737 for (i = 0; i < N_TOGGLE_STATES; i++)
739 if (toggle_states[i] == state)
741 g_value_init (&values.old_value, G_TYPE_INT);
742 g_value_set_int (&values.old_value, toggled_states[i]);
749 g_value_init (&values.old_value, G_TYPE_INT);
750 g_value_set_int (&values.old_value, state);
752 g_signal_emit (accessible, atk_object_signals[PROPERTY_CHANGE],
753 g_quark_from_string (atk_object_name_property_state),
758 * atk_implementor_ref_accessible:
759 * @implementor: The #GObject instance which should implement #AtkImplementorIface
760 * if a non-null return value is required.
762 * Gets a reference to an object's #AtkObject implementation, if
763 * the object implements #AtkObjectIface
765 * Returns: a reference to an object's #AtkObject implementation
768 atk_implementor_ref_accessible (AtkImplementor *object)
770 AtkImplementorIface *iface;
771 AtkObject *accessible = NULL;
773 g_return_val_if_fail (ATK_IS_IMPLEMENTOR (object), NULL);
775 iface = ATK_IMPLEMENTOR_GET_IFACE (object);
778 accessible = iface->ref_accessible (object);
780 g_return_val_if_fail ((accessible != NULL), NULL);
785 static AtkRelationSet*
786 atk_object_real_ref_relation_set (AtkObject *accessible)
788 g_return_val_if_fail (accessible->relation_set, NULL);
789 g_object_ref (accessible->relation_set);
791 return accessible->relation_set;
795 atk_object_real_set_property (GObject *object,
800 AtkObject *accessible;
802 accessible = ATK_OBJECT (object);
807 atk_object_set_name (accessible, g_value_get_string (value));
809 case PROP_DESCRIPTION:
810 atk_object_set_description (accessible, g_value_get_string (value));
813 atk_object_set_role (accessible, g_value_get_int (value));
816 atk_object_set_parent (accessible, g_value_get_object (value));
819 if (ATK_IS_VALUE (accessible))
820 atk_value_set_current_value (ATK_VALUE (accessible), value);
828 atk_object_real_get_property (GObject *object,
833 AtkObject *accessible;
835 accessible = ATK_OBJECT (object);
840 g_value_set_string (value, atk_object_get_name (accessible));
842 case PROP_DESCRIPTION:
843 g_value_set_string (value, atk_object_get_description (accessible));
845 g_value_set_int (value, atk_object_get_role (accessible));
848 g_value_set_object (value, atk_object_get_parent (accessible));
851 if (ATK_IS_VALUE (accessible))
852 atk_value_get_current_value (ATK_VALUE (accessible), value);
855 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
861 atk_object_finalize (GObject *object)
863 AtkObject *accessible;
865 g_return_if_fail (ATK_IS_OBJECT (object));
867 accessible = ATK_OBJECT (object);
869 g_free (accessible->name);
870 g_free (accessible->description);
873 * Free memory allocated for relation set if it have been allocated.
875 if (accessible->relation_set)
876 g_object_unref (accessible->relation_set);
878 if (accessible->accessible_parent)
879 g_object_unref (accessible->accessible_parent);
881 G_OBJECT_CLASS (parent_class)->finalize (object);
884 static G_CONST_RETURN gchar*
885 atk_object_real_get_name (AtkObject *object)
890 static G_CONST_RETURN gchar*
891 atk_object_real_get_description (AtkObject *object)
893 return object->description;
897 atk_object_real_get_parent (AtkObject *object)
899 return object->accessible_parent;
903 atk_object_real_get_role (AtkObject *object)
909 atk_object_real_ref_state_set (AtkObject *accessible)
911 AtkStateSet *state_set;
914 state_set = atk_state_set_new ();
916 ap = atk_object_get_parent (accessible);
918 if (ATK_IS_SELECTION (ap))
922 atk_state_set_add_state (state_set, ATK_STATE_SELECTABLE);
924 i = atk_object_get_index_in_parent (accessible);
926 if (atk_selection_is_child_selected(ATK_SELECTION (ap), i))
927 atk_state_set_add_state (state_set, ATK_STATE_SELECTED);
934 atk_object_real_set_name (AtkObject *object,
937 g_free (object->name);
938 object->name = g_strdup (name);
942 atk_object_real_set_description (AtkObject *object,
943 const gchar *description)
945 g_free (object->description);
946 object->description = g_strdup (description);
950 atk_object_real_set_parent (AtkObject *object,
953 if (object->accessible_parent)
954 g_object_unref (object->accessible_parent);
956 object->accessible_parent = parent;
957 if (object->accessible_parent)
958 g_object_ref (object->accessible_parent);
962 atk_object_real_set_role (AtkObject *object,
969 atk_object_real_connect_property_change_handler (AtkObject *obj,
970 AtkPropertyChangeHandler *handler)
972 return g_signal_connect_closure_by_id (obj,
973 atk_object_signals[PROPERTY_CHANGE],
976 G_CALLBACK (handler), NULL,
977 (GClosureNotify) NULL),
982 atk_object_real_remove_property_change_handler (AtkObject *obj,
985 g_signal_handler_disconnect (obj, handler_id);
989 * This function is a signal handler for notify signal which gets emitted
990 * when a property changes value.
992 * It constructs an AtkPropertyValues structure and emits a "property_changed"
993 * signal which causes the user specified AtkPropertyChangeHandler
997 atk_object_notify (GObject *obj,
1000 AtkPropertyValues values = { 0, };
1002 g_value_init (&values.new_value, pspec->value_type);
1003 g_object_get_property (obj, pspec->name, &values.new_value);
1004 values.property_name = pspec->name;
1005 g_signal_emit (obj, atk_object_signals[PROPERTY_CHANGE],
1006 g_quark_from_string (pspec->name),