Home | History | Annotate | Download | only in gobject
      1 /* GObject - GLib Type, Object, Parameter and Signal Library
      2  * Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc.
      3  *
      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.
      8  *
      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.
     13  *
     14  * You should have received a copy of the GNU Lesser General
     15  * Public 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.
     18  */
     19 #if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
     20 #error "Only <glib-object.h> can be included directly."
     21 #endif
     22 
     23 #ifndef __G_OBJECT_H__
     24 #define __G_OBJECT_H__
     25 
     26 #include        <gobject/gtype.h>
     27 #include        <gobject/gvalue.h>
     28 #include        <gobject/gparam.h>
     29 #include        <gobject/gclosure.h>
     30 #include        <gobject/gsignal.h>
     31 
     32 G_BEGIN_DECLS
     33 
     34 /* --- type macros --- */
     35 /**
     36  * G_TYPE_IS_OBJECT:
     37  * @type: Type id to check
     38  *
     39  * Check if the passed in type id is a %G_TYPE_OBJECT or derived from it.
     40  *
     41  * Returns: %FALSE or %TRUE, indicating whether @type is a %G_TYPE_OBJECT.
     42  */
     43 #define G_TYPE_IS_OBJECT(type)      (G_TYPE_FUNDAMENTAL (type) == G_TYPE_OBJECT)
     44 /**
     45  * G_OBJECT:
     46  * @object: Object which is subject to casting.
     47  *
     48  * Casts a #GObject or derived pointer into a (GObject*) pointer.
     49  * Depending on the current debugging level, this function may invoke
     50  * certain runtime checks to identify invalid casts.
     51  */
     52 #define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
     53 /**
     54  * G_OBJECT_CLASS:
     55  * @class: a valid #GObjectClass
     56  *
     57  * Casts a derived #GObjectClass structure into a #GObjectClass structure.
     58  */
     59 #define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
     60 /**
     61  * G_IS_OBJECT:
     62  * @object: Instance to check for being a %G_TYPE_OBJECT.
     63  *
     64  * Checks whether a valid #GTypeInstance pointer is of type %G_TYPE_OBJECT.
     65  */
     66 #define G_IS_OBJECT(object)         (G_TYPE_CHECK_INSTANCE_TYPE ((object), G_TYPE_OBJECT))
     67 /**
     68  * G_IS_OBJECT_CLASS:
     69  * @class: a #GObjectClass
     70  *
     71  * Checks whether @class "is a" valid #GObjectClass structure of type
     72  * %G_TYPE_OBJECT or derived.
     73  */
     74 #define G_IS_OBJECT_CLASS(class)    (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_OBJECT))
     75 /**
     76  * G_OBJECT_GET_CLASS:
     77  * @object: a #GObject instance.
     78  *
     79  * Get the class structure associated to a #GObject instance.
     80  *
     81  * Returns: pointer to object class structure.
     82  */
     83 #define G_OBJECT_GET_CLASS(object)  (G_TYPE_INSTANCE_GET_CLASS ((object), G_TYPE_OBJECT, GObjectClass))
     84 /**
     85  * G_OBJECT_TYPE:
     86  * @object: Object to return the type id for.
     87  *
     88  * Get the type id of an object.
     89  *
     90  * Returns: Type id of @object.
     91  */
     92 #define G_OBJECT_TYPE(object)       (G_TYPE_FROM_INSTANCE (object))
     93 /**
     94  * G_OBJECT_TYPE_NAME:
     95  * @object: Object to return the type name for.
     96  *
     97  * Get the name of an object's type.
     98  *
     99  * Returns: Type name of @object. The string is owned by the type system and
    100  *  should not be freed.
    101  */
    102 #define G_OBJECT_TYPE_NAME(object)  (g_type_name (G_OBJECT_TYPE (object)))
    103 /**
    104  * G_OBJECT_CLASS_TYPE:
    105  * @class: a valid #GObjectClass
    106  *
    107  * Get the type id of a class structure.
    108  *
    109  * Returns: Type id of @class.
    110  */
    111 #define G_OBJECT_CLASS_TYPE(class)  (G_TYPE_FROM_CLASS (class))
    112 /**
    113  * G_OBJECT_CLASS_NAME:
    114  * @class: a valid #GObjectClass
    115  *
    116  * Return the name of a class structure's type.
    117  *
    118  * Returns: Type name of @class. The string is owned by the type system and
    119  *  should not be freed.
    120  */
    121 #define G_OBJECT_CLASS_NAME(class)  (g_type_name (G_OBJECT_CLASS_TYPE (class)))
    122 /**
    123  * G_VALUE_HOLDS_OBJECT:
    124  * @value: a valid #GValue structure
    125  *
    126  * Checks whether the given #GValue can hold values derived from type %G_TYPE_OBJECT.
    127  *
    128  * Returns: %TRUE on success.
    129  */
    130 #define G_VALUE_HOLDS_OBJECT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_OBJECT))
    131 
    132 /* --- type macros --- */
    133 /**
    134  * G_TYPE_INITIALLY_UNOWNED:
    135  *
    136  * The type for #GInitiallyUnowned.
    137  */
    138 #define G_TYPE_INITIALLY_UNOWNED	      (g_initially_unowned_get_type())
    139 /**
    140  * G_INITIALLY_UNOWNED:
    141  * @object: Object which is subject to casting.
    142  *
    143  * Casts a #GInitiallyUnowned or derived pointer into a (GInitiallyUnowned*)
    144  * pointer. Depending on the current debugging level, this function may invoke
    145  * certain runtime checks to identify invalid casts.
    146  */
    147 #define G_INITIALLY_UNOWNED(object)           (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_INITIALLY_UNOWNED, GInitiallyUnowned))
    148 /**
    149  * G_INITIALLY_UNOWNED_CLASS:
    150  * @class: a valid #GInitiallyUnownedClass
    151  *
    152  * Casts a derived #GInitiallyUnownedClass structure into a
    153  * #GInitiallyUnownedClass structure.
    154  */
    155 #define G_INITIALLY_UNOWNED_CLASS(class)      (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_INITIALLY_UNOWNED, GInitiallyUnownedClass))
    156 /**
    157  * G_IS_INITIALLY_UNOWNED:
    158  * @object: Instance to check for being a %G_TYPE_INITIALLY_UNOWNED.
    159  *
    160  * Checks whether a valid #GTypeInstance pointer is of type %G_TYPE_INITIALLY_UNOWNED.
    161  */
    162 #define G_IS_INITIALLY_UNOWNED(object)        (G_TYPE_CHECK_INSTANCE_TYPE ((object), G_TYPE_INITIALLY_UNOWNED))
    163 /**
    164  * G_IS_INITIALLY_UNOWNED_CLASS:
    165  * @class: a #GInitiallyUnownedClass
    166  *
    167  * Checks whether @class "is a" valid #GInitiallyUnownedClass structure of type
    168  * %G_TYPE_INITIALLY_UNOWNED or derived.
    169  */
    170 #define G_IS_INITIALLY_UNOWNED_CLASS(class)   (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_INITIALLY_UNOWNED))
    171 /**
    172  * G_INITIALLY_UNOWNED_GET_CLASS:
    173  * @object: a #GInitiallyUnowned instance.
    174  *
    175  * Get the class structure associated to a #GInitiallyUnowned instance.
    176  *
    177  * Returns: pointer to object class structure.
    178  */
    179 #define G_INITIALLY_UNOWNED_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), G_TYPE_INITIALLY_UNOWNED, GInitiallyUnownedClass))
    180 /* GInitiallyUnowned ia a GObject with initially floating reference count */
    181 
    182 
    183 /* --- typedefs & structures --- */
    184 typedef struct _GObject                  GObject;
    185 typedef struct _GObjectClass             GObjectClass;
    186 typedef struct _GObject                  GInitiallyUnowned;
    187 typedef struct _GObjectClass             GInitiallyUnownedClass;
    188 typedef struct _GObjectConstructParam    GObjectConstructParam;
    189 /**
    190  * GObjectGetPropertyFunc:
    191  * @object: a #GObject
    192  * @property_id: the numeric id under which the property was registered with
    193  *  g_object_class_install_property().
    194  * @value: a #GValue to return the property value in
    195  * @pspec: the #GParamSpec describing the property
    196  *
    197  * The type of the @get_property function of #GObjectClass.
    198  */
    199 typedef void (*GObjectGetPropertyFunc)  (GObject      *object,
    200                                          guint         property_id,
    201                                          GValue       *value,
    202                                          GParamSpec   *pspec);
    203 /**
    204  * GObjectSetPropertyFunc:
    205  * @object: a #GObject
    206  * @property_id: the numeric id under which the property was registered with
    207  *  g_object_class_install_property().
    208  * @value: the new value for the property
    209  * @pspec: the #GParamSpec describing the property
    210  *
    211  * The type of the @set_property function of #GObjectClass.
    212  */
    213 typedef void (*GObjectSetPropertyFunc)  (GObject      *object,
    214                                          guint         property_id,
    215                                          const GValue *value,
    216                                          GParamSpec   *pspec);
    217 /**
    218  * GObjectFinalizeFunc:
    219  * @object: the #GObject being finalized
    220  *
    221  * The type of the @finalize function of #GObjectClass.
    222  */
    223 typedef void (*GObjectFinalizeFunc)     (GObject      *object);
    224 /**
    225  * GWeakNotify:
    226  * @data: data that was provided when the weak reference was established
    227  * @where_the_object_was: the object being finalized
    228  *
    229  * A #GWeakNotify function can be added to an object as a callback that gets
    230  * triggered when the object is finalized. Since the object is already being
    231  * finalized when the #GWeakNotify is called, there's not much you could do
    232  * with the object, apart from e.g. using its adress as hash-index or the like.
    233  */
    234 typedef void (*GWeakNotify)		(gpointer      data,
    235 					 GObject      *where_the_object_was);
    236 /**
    237  * GObject:
    238  *
    239  * All the fields in the <structname>GObject</structname> structure are private
    240  * to the #GObject implementation and should never be accessed directly.
    241  */
    242 struct  _GObject
    243 {
    244   GTypeInstance  g_type_instance;
    245 
    246   /*< private >*/
    247   volatile guint ref_count;
    248   GData         *qdata;
    249 };
    250 /**
    251  * GObjectClass:
    252  * @g_type_class: the parent class
    253  * @constructor: the @constructor function is called by g_object_new () to
    254  *  complete the object initialization after all the construction properties are
    255  *  set. The first thing a @constructor implementation must do is chain up to the
    256  *  @constructor of the parent class. Overriding @constructor should be rarely
    257  *  needed, e.g. to handle construct properties, or to implement singletons.
    258  * @set_property: the generic setter for all properties of this type. Should be
    259  *  overridden for every type with properties. Implementations of @set_property
    260  *  don't need to emit property change notification explicitly, this is handled
    261  *  by the type system.
    262  * @get_property: the generic getter for all properties of this type. Should be
    263  *  overridden for every type with properties.
    264  * @dispose: the @dispose function is supposed to drop all references to other
    265  *  objects, but keep the instance otherwise intact, so that client method
    266  *  invocations still work. It may be run multiple times (due to reference
    267  *  loops). Before returning, @dispose should chain up to the @dispose method
    268  *  of the parent class.
    269  * @finalize: instance finalization function, should finish the finalization of
    270  *  the instance begun in @dispose and chain up to the @finalize method of the
    271  *  parent class.
    272  * @dispatch_properties_changed: emits property change notification for a bunch
    273  *  of properties. Overriding @dispatch_properties_changed should be rarely
    274  *  needed.
    275  * @notify: the class closure for the notify signal
    276  * @constructed: the @constructed function is called by g_object_new() as the
    277  *  final step of the object creation process.  At the point of the call, all
    278  *  construction properties have been set on the object.  The purpose of this
    279  *  call is to allow for object initialisation steps that can only be performed
    280  *  after construction properties have been set.  @constructed implementors
    281  *  should chain up to the @constructed call of their parent class to allow it
    282  *  to complete its initialisation.
    283  *
    284  * The class structure for the <structname>GObject</structname> type.
    285  *
    286  * <example>
    287  * <title>Implementing singletons using a constructor</title>
    288  * <programlisting>
    289  * static MySingleton *the_singleton = NULL;
    290  *
    291  * static GObject*
    292  * my_singleton_constructor (GType                  type,
    293  *                           guint                  n_construct_params,
    294  *                           GObjectConstructParam *construct_params)
    295  * {
    296  *   GObject *object;
    297  *
    298  *   if (!the_singleton)
    299  *     {
    300  *       object = G_OBJECT_CLASS (parent_class)->constructor (type,
    301  *                                                            n_construct_params,
    302  *                                                            construct_params);
    303  *       the_singleton = MY_SINGLETON (object);
    304  *     }
    305  *   else
    306  *     object = g_object_ref (G_OBJECT (the_singleton));
    307  *
    308  *   return object;
    309  * }
    310  * </programlisting></example>
    311  */
    312 struct  _GObjectClass
    313 {
    314   GTypeClass   g_type_class;
    315 
    316   /*< private >*/
    317   GSList      *construct_properties;
    318 
    319   /*< public >*/
    320   /* seldomly overidden */
    321   GObject*   (*constructor)     (GType                  type,
    322                                  guint                  n_construct_properties,
    323                                  GObjectConstructParam *construct_properties);
    324   /* overridable methods */
    325   void       (*set_property)		(GObject        *object,
    326                                          guint           property_id,
    327                                          const GValue   *value,
    328                                          GParamSpec     *pspec);
    329   void       (*get_property)		(GObject        *object,
    330                                          guint           property_id,
    331                                          GValue         *value,
    332                                          GParamSpec     *pspec);
    333   void       (*dispose)			(GObject        *object);
    334   void       (*finalize)		(GObject        *object);
    335   /* seldomly overidden */
    336   void       (*dispatch_properties_changed) (GObject      *object,
    337 					     guint	   n_pspecs,
    338 					     GParamSpec  **pspecs);
    339   /* signals */
    340   void	     (*notify)			(GObject	*object,
    341 					 GParamSpec	*pspec);
    342 
    343   /* called when done constructing */
    344   void	     (*constructed)		(GObject	*object);
    345 
    346   /*< private >*/
    347   /* padding */
    348   gpointer	pdummy[7];
    349 };
    350 /**
    351  * GObjectConstructParam:
    352  * @pspec: the #GParamSpec of the construct parameter
    353  * @value: the value to set the parameter to
    354  *
    355  * The <structname>GObjectConstructParam</structname> struct is an auxiliary
    356  * structure used to hand #GParamSpec/#GValue pairs to the @constructor of
    357  * a #GObjectClass.
    358  */
    359 struct _GObjectConstructParam
    360 {
    361   GParamSpec *pspec;
    362   GValue     *value;
    363 };
    364 
    365 /**
    366  * GInitiallyUnowned:
    367  *
    368  * All the fields in the <structname>GInitiallyUnowned</structname> structure
    369  * are private to the #GInitiallyUnowned implementation and should never be
    370  * accessed directly.
    371  */
    372 /**
    373  * GInitiallyUnownedClass:
    374  *
    375  * The class structure for the <structname>GInitiallyUnowned</structname> type.
    376  */
    377 
    378 
    379 /* --- prototypes --- */
    380 GType       g_initially_unowned_get_type      (void);
    381 void        g_object_class_install_property   (GObjectClass   *oclass,
    382 					       guint           property_id,
    383 					       GParamSpec     *pspec);
    384 GParamSpec* g_object_class_find_property      (GObjectClass   *oclass,
    385 					       const gchar    *property_name);
    386 GParamSpec**g_object_class_list_properties    (GObjectClass   *oclass,
    387 					       guint	      *n_properties);
    388 void        g_object_class_override_property  (GObjectClass   *oclass,
    389 					       guint           property_id,
    390 					       const gchar    *name);
    391 
    392 void        g_object_interface_install_property (gpointer     g_iface,
    393 						 GParamSpec  *pspec);
    394 GParamSpec* g_object_interface_find_property    (gpointer     g_iface,
    395 						 const gchar *property_name);
    396 GParamSpec**g_object_interface_list_properties  (gpointer     g_iface,
    397 						 guint       *n_properties_p);
    398 
    399 GType       g_object_get_type                 (void) G_GNUC_CONST;
    400 gpointer    g_object_new                      (GType           object_type,
    401 					       const gchar    *first_property_name,
    402 					       ...);
    403 gpointer    g_object_newv		      (GType           object_type,
    404 					       guint	       n_parameters,
    405 					       GParameter     *parameters);
    406 GObject*    g_object_new_valist               (GType           object_type,
    407 					       const gchar    *first_property_name,
    408 					       va_list         var_args);
    409 void	    g_object_set                      (gpointer	       object,
    410 					       const gchar    *first_property_name,
    411 					       ...) G_GNUC_NULL_TERMINATED;
    412 void        g_object_get                      (gpointer        object,
    413 					       const gchar    *first_property_name,
    414 					       ...) G_GNUC_NULL_TERMINATED;
    415 gpointer    g_object_connect                  (gpointer	       object,
    416 					       const gchar    *signal_spec,
    417 					       ...) G_GNUC_NULL_TERMINATED;
    418 void	    g_object_disconnect               (gpointer	       object,
    419 					       const gchar    *signal_spec,
    420 					       ...) G_GNUC_NULL_TERMINATED;
    421 void        g_object_set_valist               (GObject        *object,
    422 					       const gchar    *first_property_name,
    423 					       va_list         var_args);
    424 void        g_object_get_valist               (GObject        *object,
    425 					       const gchar    *first_property_name,
    426 					       va_list         var_args);
    427 void        g_object_set_property             (GObject        *object,
    428 					       const gchar    *property_name,
    429 					       const GValue   *value);
    430 void        g_object_get_property             (GObject        *object,
    431 					       const gchar    *property_name,
    432 					       GValue         *value);
    433 void        g_object_freeze_notify            (GObject        *object);
    434 void        g_object_notify                   (GObject        *object,
    435 					       const gchar    *property_name);
    436 void        g_object_thaw_notify              (GObject        *object);
    437 gboolean    g_object_is_floating    	      (gpointer        object);
    438 gpointer    g_object_ref_sink       	      (gpointer	       object);
    439 gpointer    g_object_ref                      (gpointer        object);
    440 void        g_object_unref                    (gpointer        object);
    441 void	    g_object_weak_ref		      (GObject	      *object,
    442 					       GWeakNotify     notify,
    443 					       gpointer	       data);
    444 void	    g_object_weak_unref		      (GObject	      *object,
    445 					       GWeakNotify     notify,
    446 					       gpointer	       data);
    447 void        g_object_add_weak_pointer         (GObject        *object,
    448                                                gpointer       *weak_pointer_location);
    449 void        g_object_remove_weak_pointer      (GObject        *object,
    450                                                gpointer       *weak_pointer_location);
    451 
    452 /**
    453  * GToggleNotify:
    454  * @data: Callback data passed to g_object_add_toggle_ref()
    455  * @object: The object on which g_object_add_toggle_ref() was called.
    456  * @is_last_ref: %TRUE if the toggle reference is now the
    457  *  last reference to the object. %FALSE if the toggle
    458  *  reference was the last reference and there are now other
    459  *  references.
    460  *
    461  * A callback function used for notification when the state
    462  * of a toggle reference changes. See g_object_add_toggle_ref().
    463  */
    464 typedef void (*GToggleNotify) (gpointer      data,
    465 			       GObject      *object,
    466 			       gboolean      is_last_ref);
    467 
    468 void g_object_add_toggle_ref    (GObject       *object,
    469 				 GToggleNotify  notify,
    470 				 gpointer       data);
    471 void g_object_remove_toggle_ref (GObject       *object,
    472 				 GToggleNotify  notify,
    473 				 gpointer       data);
    474 
    475 gpointer    g_object_get_qdata                (GObject        *object,
    476 					       GQuark          quark);
    477 void        g_object_set_qdata                (GObject        *object,
    478 					       GQuark          quark,
    479 					       gpointer        data);
    480 void        g_object_set_qdata_full           (GObject        *object,
    481 					       GQuark          quark,
    482 					       gpointer        data,
    483 					       GDestroyNotify  destroy);
    484 gpointer    g_object_steal_qdata              (GObject        *object,
    485 					       GQuark          quark);
    486 gpointer    g_object_get_data                 (GObject        *object,
    487 					       const gchar    *key);
    488 void        g_object_set_data                 (GObject        *object,
    489 					       const gchar    *key,
    490 					       gpointer        data);
    491 void        g_object_set_data_full            (GObject        *object,
    492 					       const gchar    *key,
    493 					       gpointer        data,
    494 					       GDestroyNotify  destroy);
    495 gpointer    g_object_steal_data               (GObject        *object,
    496 					       const gchar    *key);
    497 void        g_object_watch_closure            (GObject        *object,
    498 					       GClosure       *closure);
    499 GClosure*   g_cclosure_new_object             (GCallback       callback_func,
    500 					       GObject	      *object);
    501 GClosure*   g_cclosure_new_object_swap        (GCallback       callback_func,
    502 					       GObject	      *object);
    503 GClosure*   g_closure_new_object              (guint           sizeof_closure,
    504 					       GObject        *object);
    505 void        g_value_set_object                (GValue         *value,
    506 					       gpointer        v_object);
    507 gpointer    g_value_get_object                (const GValue   *value);
    508 gpointer    g_value_dup_object                (const GValue   *value);
    509 gulong	    g_signal_connect_object           (gpointer	       instance,
    510 					       const gchar    *detailed_signal,
    511 					       GCallback       c_handler,
    512 					       gpointer	       gobject,
    513 					       GConnectFlags   connect_flags);
    514 
    515 /*< protected >*/
    516 void        g_object_force_floating           (GObject        *object);
    517 void        g_object_run_dispose	      (GObject	      *object);
    518 
    519 
    520 void        g_value_take_object               (GValue         *value,
    521 					       gpointer        v_object);
    522 #ifndef G_DISABLE_DEPRECATED
    523 void        g_value_set_object_take_ownership (GValue         *value,
    524 					       gpointer        v_object);
    525 #endif
    526 
    527 #if !defined(G_DISABLE_DEPRECATED) || defined(GTK_COMPILATION)
    528 gsize	    g_object_compat_control	      (gsize	       what,
    529 					       gpointer	       data);
    530 #endif
    531 
    532 /* --- implementation macros --- */
    533 #define G_OBJECT_WARN_INVALID_PSPEC(object, pname, property_id, pspec) \
    534 G_STMT_START { \
    535   GObject *_object = (GObject*) (object); \
    536   GParamSpec *_pspec = (GParamSpec*) (pspec); \
    537   guint _property_id = (property_id); \
    538   g_warning ("%s: invalid %s id %u for \"%s\" of type `%s' in `%s'", \
    539              G_STRLOC, \
    540              (pname), \
    541              _property_id, \
    542              _pspec->name, \
    543              g_type_name (G_PARAM_SPEC_TYPE (_pspec)), \
    544              G_OBJECT_TYPE_NAME (_object)); \
    545 } G_STMT_END
    546 /**
    547  * G_OBJECT_WARN_INVALID_PROPERTY_ID:
    548  * @object: the #GObject on which set_property() or get_property() was called
    549  * @property_id: the numeric id of the property
    550  * @pspec: the #GParamSpec of the property
    551  *
    552  * This macro should be used to emit a standard warning about unexpected
    553  * properties in set_property() and get_property() implementations.
    554  */
    555 #define G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec) \
    556     G_OBJECT_WARN_INVALID_PSPEC ((object), "property", (property_id), (pspec))
    557 
    558 G_END_DECLS
    559 
    560 #endif /* __G_OBJECT_H__ */
    561