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_CHILD, /* a child has been added or removed */
35 PROP_STATE, /* AtkStateSet for the object has changed */
36 PROP_TEXT, /* Used only by AtkText implementors */
37 PROP_CARET, /* Used only by AtkText implementors */
43 PROP_TABLE_COLUMN_DESCRIPTION,
44 PROP_TABLE_COLUMN_HEADER,
45 PROP_TABLE_ROW_DESCRIPTION,
46 PROP_TABLE_ROW_HEADER,
49 PROP_LAST /* gobject convention */
60 static void atk_object_class_init (AtkObjectClass *klass);
61 static void atk_object_init (AtkObject *accessible,
62 AtkObjectClass *klass);
63 static AtkRelationSet* atk_object_real_ref_relation_set
64 (AtkObject *accessible);
66 static void atk_object_real_set_property (GObject *object,
70 static void atk_object_real_get_property (GObject *object,
74 static void atk_object_finalize (GObject *object);
75 static G_CONST_RETURN gchar*
76 atk_object_real_get_name (AtkObject *object);
77 static G_CONST_RETURN gchar*
78 atk_object_real_get_description
80 static AtkObject* atk_object_real_get_parent (AtkObject *object);
81 static AtkRole atk_object_real_get_role (AtkObject *object);
82 static AtkStateSet* atk_object_real_ref_state_set
84 static void atk_object_real_set_name (AtkObject *object,
86 static void atk_object_real_set_description
88 const gchar *description);
89 static void atk_object_real_set_parent (AtkObject *object,
91 static void atk_object_real_set_role (AtkObject *object,
93 static guint atk_object_real_connect_property_change_handler
95 AtkPropertyChangeHandler
97 static void atk_object_real_remove_property_change_handler
100 static void atk_object_notify (GObject *obj,
104 static guint atk_object_signals[LAST_SIGNAL] = { 0, };
106 static gpointer parent_class = NULL;
108 static const gchar* atk_object_name_property_name = "accessible-name";
109 static const gchar* atk_object_name_property_state = "accessible-state";
110 static const gchar* atk_object_name_property_description = "accessible-description";
111 static const gchar* atk_object_name_property_child = "accessible-child";
112 static const gchar* atk_object_name_property_parent = "accessible-parent";
113 static const gchar* atk_object_name_property_text = "accessible-text";
114 static const gchar* atk_object_name_property_caret = "accessible-caret";
115 static const gchar* atk_object_name_property_selection = "accessible-selection";
116 static const gchar* atk_object_name_property_value = "accessible-value";
117 static const gchar* atk_object_name_property_visible = "accessible-visible-data";
118 static const gchar* atk_object_name_property_role = "accessible-role";
119 static const gchar* atk_object_name_property_table_caption = "accessible-table-caption";
120 static const gchar* atk_object_name_property_table_column_description = "accessible-table-column-description";
121 static const gchar* atk_object_name_property_table_column_header = "accessible-table-column-header";
122 static const gchar* atk_object_name_property_table_row_description = "accessible-table-row-description";
123 static const gchar* atk_object_name_property_table_row_header = "accessible-table-row-header";
124 static const gchar* atk_object_name_property_table_summary = "accessible-table-summary";
125 static const gchar* atk_object_name_property_model = "accessible-model";
128 atk_object_get_type (void)
130 static GType type = 0;
134 static const GTypeInfo typeInfo =
136 sizeof (AtkObjectClass),
137 (GBaseInitFunc) NULL,
138 (GBaseFinalizeFunc) NULL,
139 (GClassInitFunc) atk_object_class_init,
140 (GClassFinalizeFunc) NULL,
144 (GInstanceInitFunc) atk_object_init,
146 type = g_type_register_static (G_TYPE_OBJECT, "AtkObject", &typeInfo, 0) ;
152 atk_object_class_init (AtkObjectClass *klass)
154 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
156 parent_class = g_type_class_ref (G_TYPE_OBJECT);
158 gobject_class->set_property = atk_object_real_set_property;
159 gobject_class->get_property = atk_object_real_get_property;
160 gobject_class->finalize = atk_object_finalize;
161 gobject_class->notify = atk_object_notify;
163 klass->get_name = atk_object_real_get_name;
164 klass->get_description = atk_object_real_get_description;
165 klass->get_parent = atk_object_real_get_parent;
166 klass->get_n_children = NULL;
167 klass->ref_child = NULL;
168 klass->get_index_in_parent = NULL;
169 klass->ref_relation_set = atk_object_real_ref_relation_set;
170 klass->get_role = atk_object_real_get_role;
171 klass->ref_state_set = atk_object_real_ref_state_set;
172 klass->set_name = atk_object_real_set_name;
173 klass->set_description = atk_object_real_set_description;
174 klass->set_parent = atk_object_real_set_parent;
175 klass->set_role = atk_object_real_set_role;
176 klass->connect_property_change_handler =
177 atk_object_real_connect_property_change_handler;
178 klass->remove_property_change_handler =
179 atk_object_real_remove_property_change_handler;
182 * We do not define default signal handlers here
184 klass->children_changed = NULL;
185 klass->focus_event = NULL;
186 klass->property_change = 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_int (atk_object_name_property_state,
207 "Accessible State Set",
208 "The accessible state set of this object "
209 "or its UI component",
214 g_object_class_install_property (gobject_class,
216 g_param_spec_object (atk_object_name_property_child,
218 "Is used to notify that a child has been added or removed ",
221 g_object_class_install_property (gobject_class,
223 g_param_spec_object (atk_object_name_property_parent,
225 "Is used to notify that the parent has changed ",
228 g_object_class_install_property (gobject_class,
230 g_param_spec_object (atk_object_name_property_text,
232 "Is used to notify that the text has changed ",
235 g_object_class_install_property (gobject_class,
237 g_param_spec_int (atk_object_name_property_caret,
239 "Is used to notify that the caret position has changed ",
244 g_object_class_install_property (gobject_class,
246 g_param_spec_object (atk_object_name_property_selection,
247 "Accessible Selection",
248 "Is used to notify that the selection has changed ",
251 g_object_class_install_property (gobject_class,
253 g_param_spec_double (atk_object_name_property_value,
255 "Is used to notify that the value has changed ",
260 g_object_class_install_property (gobject_class,
262 g_param_spec_object (atk_object_name_property_visible,
263 "Accessible Visible Data",
264 "Is used to notify that the visual appearance of the object has changed ",
267 g_object_class_install_property (gobject_class,
269 g_param_spec_int (atk_object_name_property_role,
271 "The accessible role this object ",
276 g_object_class_install_property (gobject_class,
278 g_param_spec_string (atk_object_name_property_table_caption,
279 "Accessible Table Caption",
280 "Is used to notify that the table caption has changed ",
283 g_object_class_install_property (gobject_class,
284 PROP_TABLE_COLUMN_HEADER,
285 g_param_spec_object (atk_object_name_property_table_column_header,
286 "Accessible Table Column Header",
287 "Is used to notify that the table column header has changed ",
290 g_object_class_install_property (gobject_class,
291 PROP_TABLE_COLUMN_DESCRIPTION,
292 g_param_spec_string (atk_object_name_property_table_column_description,
293 "Accessible Table Column Description",
294 "Is used to notify that the table columnscription has changed ",
297 g_object_class_install_property (gobject_class,
298 PROP_TABLE_ROW_HEADER,
299 g_param_spec_object (atk_object_name_property_table_row_header,
300 "Accessible Table Row Header",
301 "Is used to notify that the table row header has changed ",
304 g_object_class_install_property (gobject_class,
305 PROP_TABLE_ROW_DESCRIPTION,
306 g_param_spec_string (atk_object_name_property_table_row_description,
307 "Accessible Table Row Description",
308 "Is used to notify that the table row description has changed ",
311 g_object_class_install_property (gobject_class,
313 g_param_spec_object (atk_object_name_property_table_summary,
314 "Accessible Table Summary",
315 "Is used to notify that the table summary has changed ",
318 g_object_class_install_property (gobject_class,
320 g_param_spec_object (atk_object_name_property_model,
322 "Is used to notify that the model for Table or Tree has changed ",
326 * The signal "children_changed" supports two details:
329 atk_object_signals[CHILDREN_CHANGED] =
330 g_signal_new ("children_changed",
331 G_TYPE_FROM_CLASS (klass),
332 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
333 G_STRUCT_OFFSET (AtkObjectClass, children_changed),
335 g_cclosure_marshal_VOID__UINT_POINTER,
337 2, G_TYPE_UINT, G_TYPE_POINTER);
338 atk_object_signals[FOCUS_EVENT] =
339 g_signal_new ("focus_event",
340 G_TYPE_FROM_CLASS (klass),
342 G_STRUCT_OFFSET (AtkObjectClass, focus_event),
344 g_cclosure_marshal_VOID__BOOLEAN,
347 atk_object_signals[PROPERTY_CHANGE] =
348 g_signal_new ("property_change",
349 G_TYPE_FROM_CLASS (klass),
350 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
351 G_STRUCT_OFFSET (AtkObjectClass, property_change),
352 (GSignalAccumulator) NULL, NULL,
353 g_cclosure_marshal_VOID__POINTER,
359 atk_object_init (AtkObject *accessible,
360 AtkObjectClass *klass)
362 accessible->name = NULL;
363 accessible->description = NULL;
364 accessible->accessible_parent = NULL;
365 accessible->relation_set = atk_relation_set_new();
366 accessible->role = ATK_ROLE_UNKNOWN;
370 atk_implementor_get_type (void)
372 static GType type = 0;
376 static const GTypeInfo typeInfo =
378 sizeof (AtkImplementorIface),
379 (GBaseInitFunc) NULL,
380 (GBaseFinalizeFunc) NULL,
383 type = g_type_register_static (G_TYPE_INTERFACE, "AtkImplementorIface", &typeInfo, 0) ;
390 * atk_object_get_name:
391 * @accessible: an #AtkObject
393 * Gets the accessible name of the accessible.
395 * Returns: a character string representing the accessible name of the object.
397 G_CONST_RETURN gchar*
398 atk_object_get_name (AtkObject *accessible)
400 AtkObjectClass *klass;
402 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
404 klass = ATK_OBJECT_GET_CLASS (accessible);
406 return (klass->get_name) (accessible);
412 * atk_object_get_description:
413 * @accessible: an #AtkObject
415 * Gets the accessible description of the accessible.
417 * Returns: a character string representing the accessible description
421 G_CONST_RETURN gchar*
422 atk_object_get_description (AtkObject *accessible)
424 AtkObjectClass *klass;
426 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
428 klass = ATK_OBJECT_GET_CLASS (accessible);
429 if (klass->get_description)
430 return (klass->get_description) (accessible);
436 * atk_object_get_parent:
437 * @accessible: an #AtkObject
439 * Gets the accessible parent of the accessible.
441 * Returns: a #AtkObject representing the accessible parent of the accessible
444 atk_object_get_parent (AtkObject *accessible)
446 AtkObjectClass *klass;
448 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
450 klass = ATK_OBJECT_GET_CLASS (accessible);
451 if (klass->get_parent)
452 return (klass->get_parent) (accessible);
458 * atk_object_get_n_accessible_children:
459 * @accessible: an #AtkObject
461 * Gets the number of accessible children of the accessible.
463 * Returns: an integer representing the number of accessible children
467 atk_object_get_n_accessible_children (AtkObject *accessible)
469 AtkObjectClass *klass;
471 g_return_val_if_fail (ATK_IS_OBJECT (accessible), 0);
473 klass = ATK_OBJECT_GET_CLASS (accessible);
474 if (klass->get_n_children)
475 return (klass->get_n_children) (accessible);
481 * atk_object_ref_accessible_child:
482 * @accessible: an #AtkObject
483 * @i: a gint representing the position of the child, starting from 0
485 * Gets a reference to the specified accessible child of the object.
486 * The accessible children are 0-based so the first accessible child is
487 * at index 0, the second at index 1 and so on.
489 * Returns: an #AtkObject representing the specified accessible child
493 atk_object_ref_accessible_child (AtkObject *accessible,
496 AtkObjectClass *klass;
498 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
500 klass = ATK_OBJECT_GET_CLASS (accessible);
501 if (klass->ref_child)
502 return (klass->ref_child) (accessible, i);
508 * atk_object_ref_relation_set:
509 * @accessible: an #AtkObject
511 * Gets the #AtkRelationSet associated with the object.
513 * Returns: an #AtkRelationSet representing the relation set of the object.
516 atk_object_ref_relation_set (AtkObject *accessible)
518 AtkObjectClass *klass;
520 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
522 klass = ATK_OBJECT_GET_CLASS (accessible);
523 if (klass->ref_relation_set)
524 return (klass->ref_relation_set) (accessible);
531 * @name: a character string describing the new role.
533 * Registers the role specified by @name.
535 * Returns: an #AtkRole for the new role.
538 atk_role_register (const gchar *name)
540 /* TODO: associate name with new type */
541 static guint type = ATK_ROLE_LAST_DEFINED;
546 * atk_object_get_role:
547 * @accessible: an #AtkObject
549 * Gets the role of the accessible.
551 * Returns: an #AtkRole which is the role of the accessible
554 atk_object_get_role (AtkObject *accessible)
556 AtkObjectClass *klass;
558 g_return_val_if_fail (ATK_IS_OBJECT (accessible), ATK_ROLE_UNKNOWN);
560 klass = ATK_OBJECT_GET_CLASS (accessible);
562 return (klass->get_role) (accessible);
564 return ATK_ROLE_UNKNOWN;
568 * atk_object_ref_state_set:
569 * @accessible: an #AtkObject
571 * Gets a reference to the state set of the accessible; the caller must
572 * unreference it when it is no longer needed.
574 * Returns: a reference to an #AtkStateSet which is the state
575 * set of the accessible
578 atk_object_ref_state_set (AtkObject *accessible)
580 AtkObjectClass *klass;
582 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
584 klass = ATK_OBJECT_GET_CLASS (accessible);
585 if (klass->ref_state_set)
586 return (klass->ref_state_set) (accessible);
592 * atk_object_get_index_in_parent:
593 * @accessible: an #AtkObject
595 * Gets the 0-based index of this accessible in its parent; returns -1 if the
596 * accessible does not have an accessible parent.
598 * Returns: an integer which is the index of the accessible in its parent
601 atk_object_get_index_in_parent (AtkObject *accessible)
603 AtkObjectClass *klass;
605 g_return_val_if_fail (ATK_OBJECT (accessible), -1);
607 klass = ATK_OBJECT_GET_CLASS (accessible);
608 if (klass->get_index_in_parent)
609 return (klass->get_index_in_parent) (accessible);
615 * atk_object_set_name:
616 * @accessible: an #AtkObject
617 * @name: a character string to be set as the accessible name
619 * Sets the accessible name of the accessible.
622 atk_object_set_name (AtkObject *accessible,
625 AtkObjectClass *klass;
627 g_return_if_fail (ATK_IS_OBJECT (accessible));
628 g_return_if_fail (name != NULL);
630 klass = ATK_OBJECT_GET_CLASS (accessible);
633 (klass->set_name) (accessible, name);
634 g_object_notify (G_OBJECT (accessible), atk_object_name_property_name);
639 * atk_object_set_description:
640 * @accessible: an #AtkObject
641 * @description : a character string to be set as the accessible description
643 * Sets the accessible description of the accessible.
646 atk_object_set_description (AtkObject *accessible,
647 const gchar *description)
649 AtkObjectClass *klass;
651 g_return_if_fail (ATK_IS_OBJECT (accessible));
652 g_return_if_fail (description != NULL);
654 klass = ATK_OBJECT_GET_CLASS (accessible);
655 if (klass->set_description)
657 (klass->set_description) (accessible, description);
658 g_object_notify (G_OBJECT (accessible), atk_object_name_property_description);
663 * atk_object_set_parent:
664 * @accessible: an #AtkObject
665 * @parent : an #AtkObject to be set as the accessible parent
667 * Sets the accessible parent of the accessible.
670 atk_object_set_parent (AtkObject *accessible,
673 AtkObjectClass *klass;
675 g_return_if_fail (ATK_IS_OBJECT (accessible));
677 klass = ATK_OBJECT_GET_CLASS (accessible);
678 if (klass->set_parent)
679 (klass->set_parent) (accessible, parent);
683 * atk_object_set_role:
684 * @accessible: an #AtkObject
685 * @role : an #AtkRole to be set as the role
687 * Sets the role of the accessible.
690 atk_object_set_role (AtkObject *accessible,
693 AtkObjectClass *klass;
695 g_return_if_fail (ATK_IS_OBJECT (accessible));
697 klass = ATK_OBJECT_GET_CLASS (accessible);
699 (klass->set_role) (accessible, role);
703 * atk_object_connect_property_change_handler:
704 * @accessible: an #AtkObject
705 * @handler : a function to be called when a property changes its value
707 * Specifies a function to be called when a property changes value.
709 * Returns: a #guint which is the handler id used in
710 * atk_object_remove_property_change_handler()
713 atk_object_connect_property_change_handler (AtkObject *accessible,
714 AtkPropertyChangeHandler *handler)
716 AtkObjectClass *klass;
718 g_return_val_if_fail (ATK_IS_OBJECT (accessible), 0);
719 g_return_val_if_fail ((handler != NULL), 0);
721 klass = ATK_OBJECT_GET_CLASS (accessible);
722 if (klass->connect_property_change_handler)
723 return (klass->connect_property_change_handler) (accessible, handler);
729 * atk_object_remove_property_change_handler:
730 * @accessible: an #AtkObject
731 * @handler_id : a guint which identifies the handler to be removed.
733 * Removes a property change handler.
736 atk_object_remove_property_change_handler (AtkObject *accessible,
739 AtkObjectClass *klass;
741 g_return_if_fail (ATK_IS_OBJECT (accessible));
743 klass = ATK_OBJECT_GET_CLASS (accessible);
744 if (klass->remove_property_change_handler)
745 (klass->remove_property_change_handler) (accessible, handler_id);
749 * atk_implementor_ref_accessible:
750 * @implementor: The #GObject instance which should implement #AtkImplementorIface
751 * if a non-null return value is required.
753 * Gets a reference to an object's #AtkObject implementation, if
754 * the object implements #AtkObjectIface
756 * Returns: a reference to an object's #AtkObject implementation
759 atk_implementor_ref_accessible (AtkImplementor *object)
761 AtkImplementorIface *iface;
762 AtkObject *accessible = NULL;
764 g_return_val_if_fail (ATK_IS_IMPLEMENTOR (object), NULL);
766 iface = ATK_IMPLEMENTOR_GET_IFACE (object);
769 accessible = iface->ref_accessible (object);
771 g_return_val_if_fail ((accessible != NULL), NULL);
776 static AtkRelationSet*
777 atk_object_real_ref_relation_set (AtkObject *accessible)
779 g_return_val_if_fail (accessible->relation_set, NULL);
780 g_object_ref (accessible->relation_set);
782 return accessible->relation_set;
786 atk_object_real_set_property (GObject *object,
791 AtkObject *accessible;
793 accessible = ATK_OBJECT (object);
798 atk_object_set_name (accessible, g_value_get_string (value));
800 case PROP_DESCRIPTION:
801 atk_object_set_description (accessible, g_value_get_string (value));
804 g_print ("This interface does not support setting the state set of an accessible object\n");
807 if (ATK_IS_VALUE (accessible))
808 atk_value_set_current_value (ATK_VALUE (accessible), value);
816 atk_object_real_get_property (GObject *object,
821 AtkObject *accessible;
823 accessible = ATK_OBJECT (object);
828 g_value_set_string (value, atk_object_get_name (accessible));
830 case PROP_DESCRIPTION:
831 g_value_set_string (value, atk_object_get_description (accessible));
834 if (ATK_IS_VALUE (accessible))
835 atk_value_get_current_value (ATK_VALUE (accessible), value);
843 atk_object_finalize (GObject *object)
845 AtkObject *accessible;
847 g_return_if_fail (ATK_IS_OBJECT (object));
849 accessible = ATK_OBJECT (object);
851 g_free (accessible->name);
852 g_free (accessible->description);
855 * Free memory allocated for relation set if it have been allocated.
857 if (accessible->relation_set)
858 g_object_unref (accessible->relation_set);
860 if (accessible->accessible_parent)
861 g_object_unref (accessible->accessible_parent);
863 G_OBJECT_CLASS (parent_class)->finalize (object);
866 static G_CONST_RETURN gchar*
867 atk_object_real_get_name (AtkObject *object)
872 static G_CONST_RETURN gchar*
873 atk_object_real_get_description (AtkObject *object)
875 return object->description;
879 atk_object_real_get_parent (AtkObject *object)
881 return object->accessible_parent;
885 atk_object_real_get_role (AtkObject *object)
891 atk_object_real_ref_state_set (AtkObject *accessible)
893 AtkStateSet *state_set;
896 state_set = atk_state_set_new ();
898 ap = atk_object_get_parent (accessible);
901 if (ATK_IS_SELECTION (ap))
905 atk_state_set_add_state (state_set, ATK_STATE_SELECTABLE);
907 i = atk_object_get_index_in_parent (accessible);
910 if (atk_selection_is_child_selected(ATK_SELECTION (ap), i))
912 atk_state_set_add_state (state_set, ATK_STATE_SELECTED);
921 atk_object_real_set_name (AtkObject *object,
924 g_free (object->name);
925 object->name = g_strdup (name);
929 atk_object_real_set_description (AtkObject *object,
930 const gchar *description)
932 g_free (object->description);
933 object->description = g_strdup (description);
937 atk_object_real_set_parent (AtkObject *object,
940 if (object->accessible_parent)
941 g_object_unref (object->accessible_parent);
943 object->accessible_parent = parent;
944 if (object->accessible_parent)
945 g_object_ref (object->accessible_parent);
949 atk_object_real_set_role (AtkObject *object,
956 atk_object_real_connect_property_change_handler (AtkObject *obj,
957 AtkPropertyChangeHandler *handler)
959 return g_signal_connect_closure_by_id (obj,
960 atk_object_signals[PROPERTY_CHANGE],
963 G_CALLBACK (handler), NULL,
964 (GClosureNotify) NULL),
969 atk_object_real_remove_property_change_handler (AtkObject *obj,
972 g_signal_handler_disconnect (obj, handler_id);
976 * This function is a signal handler for notify signal which gets emitted
977 * when a property changes value.
979 * It constructs an AtkPropertyValues structure and emits a "property_changed"
980 * signal which causes the user specified AtkPropertyChangeHandler
984 atk_object_notify (GObject *obj,
987 AtkPropertyValues values;
989 memset (&values.old_value, 0, sizeof (GValue));
990 memset (&values.new_value, 0, sizeof (GValue));
991 g_value_init (&values.new_value, pspec->value_type);
992 g_object_get_property(obj, pspec->name, &values.new_value);
993 values.property_name = pspec->name;
994 g_signal_emit (obj, atk_object_signals[PROPERTY_CHANGE],
995 g_quark_from_string (pspec->name),