• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.1 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, see <http://www.gnu.org/licenses/>.
16  */
17 #ifndef __G_OBJECT_H__
18 #define __G_OBJECT_H__
19 
20 #if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
21 #error "Only <glib-object.h> can be included directly."
22 #endif
23 
24 #include        <gobject/gtype.h>
25 #include        <gobject/gvalue.h>
26 #include        <gobject/gparam.h>
27 #include        <gobject/gclosure.h>
28 #include        <gobject/gsignal.h>
29 #include        <gobject/gboxed.h>
30 
31 G_BEGIN_DECLS
32 
33 /* --- type macros --- */
34 /**
35  * G_TYPE_IS_OBJECT:
36  * @type: Type id to check
37  *
38  * Check if the passed in type id is a %G_TYPE_OBJECT or derived from it.
39  *
40  * Returns: %FALSE or %TRUE, indicating whether @type is a %G_TYPE_OBJECT.
41  */
42 #define G_TYPE_IS_OBJECT(type)      (G_TYPE_FUNDAMENTAL (type) == G_TYPE_OBJECT)
43 /**
44  * G_OBJECT:
45  * @object: Object which is subject to casting.
46  *
47  * Casts a #GObject or derived pointer into a (GObject*) pointer.
48  * Depending on the current debugging level, this function may invoke
49  * certain runtime checks to identify invalid casts.
50  */
51 #define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
52 /**
53  * G_OBJECT_CLASS:
54  * @class: a valid #GObjectClass
55  *
56  * Casts a derived #GObjectClass structure into a #GObjectClass structure.
57  */
58 #define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
59 /**
60  * G_IS_OBJECT:
61  * @object: Instance to check for being a %G_TYPE_OBJECT.
62  *
63  * Checks whether a valid #GTypeInstance pointer is of type %G_TYPE_OBJECT.
64  */
65 #if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_42
66 #define G_IS_OBJECT(object)         (G_TYPE_CHECK_INSTANCE_FUNDAMENTAL_TYPE ((object), G_TYPE_OBJECT))
67 #else
68 #define G_IS_OBJECT(object)         (G_TYPE_CHECK_INSTANCE_TYPE ((object), G_TYPE_OBJECT))
69 #endif
70 /**
71  * G_IS_OBJECT_CLASS:
72  * @class: a #GObjectClass
73  *
74  * Checks whether @class "is a" valid #GObjectClass structure of type
75  * %G_TYPE_OBJECT or derived.
76  */
77 #define G_IS_OBJECT_CLASS(class)    (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_OBJECT))
78 /**
79  * G_OBJECT_GET_CLASS:
80  * @object: a #GObject instance.
81  *
82  * Get the class structure associated to a #GObject instance.
83  *
84  * Returns: pointer to object class structure.
85  */
86 #define G_OBJECT_GET_CLASS(object)  (G_TYPE_INSTANCE_GET_CLASS ((object), G_TYPE_OBJECT, GObjectClass))
87 /**
88  * G_OBJECT_TYPE:
89  * @object: Object to return the type id for.
90  *
91  * Get the type id of an object.
92  *
93  * Returns: Type id of @object.
94  */
95 #define G_OBJECT_TYPE(object)       (G_TYPE_FROM_INSTANCE (object))
96 /**
97  * G_OBJECT_TYPE_NAME:
98  * @object: Object to return the type name for.
99  *
100  * Get the name of an object's type.
101  *
102  * Returns: Type name of @object. The string is owned by the type system and
103  *  should not be freed.
104  */
105 #define G_OBJECT_TYPE_NAME(object)  (g_type_name (G_OBJECT_TYPE (object)))
106 /**
107  * G_OBJECT_CLASS_TYPE:
108  * @class: a valid #GObjectClass
109  *
110  * Get the type id of a class structure.
111  *
112  * Returns: Type id of @class.
113  */
114 #define G_OBJECT_CLASS_TYPE(class)  (G_TYPE_FROM_CLASS (class))
115 /**
116  * G_OBJECT_CLASS_NAME:
117  * @class: a valid #GObjectClass
118  *
119  * Return the name of a class structure's type.
120  *
121  * Returns: Type name of @class. The string is owned by the type system and
122  *  should not be freed.
123  */
124 #define G_OBJECT_CLASS_NAME(class)  (g_type_name (G_OBJECT_CLASS_TYPE (class)))
125 /**
126  * G_VALUE_HOLDS_OBJECT:
127  * @value: a valid #GValue structure
128  *
129  * Checks whether the given #GValue can hold values derived from type %G_TYPE_OBJECT.
130  *
131  * Returns: %TRUE on success.
132  */
133 #define G_VALUE_HOLDS_OBJECT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_OBJECT))
134 
135 /* --- type macros --- */
136 /**
137  * G_TYPE_INITIALLY_UNOWNED:
138  *
139  * The type for #GInitiallyUnowned.
140  */
141 #define G_TYPE_INITIALLY_UNOWNED	      (g_initially_unowned_get_type())
142 /**
143  * G_INITIALLY_UNOWNED:
144  * @object: Object which is subject to casting.
145  *
146  * Casts a #GInitiallyUnowned or derived pointer into a (GInitiallyUnowned*)
147  * pointer. Depending on the current debugging level, this function may invoke
148  * certain runtime checks to identify invalid casts.
149  */
150 #define G_INITIALLY_UNOWNED(object)           (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_INITIALLY_UNOWNED, GInitiallyUnowned))
151 /**
152  * G_INITIALLY_UNOWNED_CLASS:
153  * @class: a valid #GInitiallyUnownedClass
154  *
155  * Casts a derived #GInitiallyUnownedClass structure into a
156  * #GInitiallyUnownedClass structure.
157  */
158 #define G_INITIALLY_UNOWNED_CLASS(class)      (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_INITIALLY_UNOWNED, GInitiallyUnownedClass))
159 /**
160  * G_IS_INITIALLY_UNOWNED:
161  * @object: Instance to check for being a %G_TYPE_INITIALLY_UNOWNED.
162  *
163  * Checks whether a valid #GTypeInstance pointer is of type %G_TYPE_INITIALLY_UNOWNED.
164  */
165 #define G_IS_INITIALLY_UNOWNED(object)        (G_TYPE_CHECK_INSTANCE_TYPE ((object), G_TYPE_INITIALLY_UNOWNED))
166 /**
167  * G_IS_INITIALLY_UNOWNED_CLASS:
168  * @class: a #GInitiallyUnownedClass
169  *
170  * Checks whether @class "is a" valid #GInitiallyUnownedClass structure of type
171  * %G_TYPE_INITIALLY_UNOWNED or derived.
172  */
173 #define G_IS_INITIALLY_UNOWNED_CLASS(class)   (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_INITIALLY_UNOWNED))
174 /**
175  * G_INITIALLY_UNOWNED_GET_CLASS:
176  * @object: a #GInitiallyUnowned instance.
177  *
178  * Get the class structure associated to a #GInitiallyUnowned instance.
179  *
180  * Returns: pointer to object class structure.
181  */
182 #define G_INITIALLY_UNOWNED_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), G_TYPE_INITIALLY_UNOWNED, GInitiallyUnownedClass))
183 /* GInitiallyUnowned ia a GObject with initially floating reference count */
184 
185 
186 /* --- typedefs & structures --- */
187 typedef struct _GObject                  GObject;
188 typedef struct _GObjectClass             GObjectClass;
189 typedef struct _GObject                  GInitiallyUnowned;
190 typedef struct _GObjectClass             GInitiallyUnownedClass;
191 typedef struct _GObjectConstructParam    GObjectConstructParam;
192 /**
193  * GObjectGetPropertyFunc:
194  * @object: a #GObject
195  * @property_id: the numeric id under which the property was registered with
196  *  g_object_class_install_property().
197  * @value: a #GValue to return the property value in
198  * @pspec: the #GParamSpec describing the property
199  *
200  * The type of the @get_property function of #GObjectClass.
201  */
202 typedef void (*GObjectGetPropertyFunc)  (GObject      *object,
203                                          guint         property_id,
204                                          GValue       *value,
205                                          GParamSpec   *pspec);
206 /**
207  * GObjectSetPropertyFunc:
208  * @object: a #GObject
209  * @property_id: the numeric id under which the property was registered with
210  *  g_object_class_install_property().
211  * @value: the new value for the property
212  * @pspec: the #GParamSpec describing the property
213  *
214  * The type of the @set_property function of #GObjectClass.
215  */
216 typedef void (*GObjectSetPropertyFunc)  (GObject      *object,
217                                          guint         property_id,
218                                          const GValue *value,
219                                          GParamSpec   *pspec);
220 /**
221  * GObjectFinalizeFunc:
222  * @object: the #GObject being finalized
223  *
224  * The type of the @finalize function of #GObjectClass.
225  */
226 typedef void (*GObjectFinalizeFunc)     (GObject      *object);
227 /**
228  * GWeakNotify:
229  * @data: data that was provided when the weak reference was established
230  * @where_the_object_was: the object being finalized
231  *
232  * A #GWeakNotify function can be added to an object as a callback that gets
233  * triggered when the object is finalized. Since the object is already being
234  * finalized when the #GWeakNotify is called, there's not much you could do
235  * with the object, apart from e.g. using its address as hash-index or the like.
236  */
237 typedef void (*GWeakNotify)		(gpointer      data,
238 					 GObject      *where_the_object_was);
239 /**
240  * GObject:
241  *
242  * All the fields in the GObject structure are private
243  * to the #GObject implementation and should never be accessed directly.
244  */
245 struct  _GObject
246 {
247   GTypeInstance  g_type_instance;
248 
249   /*< private >*/
250   volatile guint ref_count;
251   GData         *qdata;
252 };
253 /**
254  * GObjectClass:
255  * @g_type_class: the parent class
256  * @constructor: the @constructor function is called by g_object_new () to
257  *  complete the object initialization after all the construction properties are
258  *  set. The first thing a @constructor implementation must do is chain up to the
259  *  @constructor of the parent class. Overriding @constructor should be rarely
260  *  needed, e.g. to handle construct properties, or to implement singletons.
261  * @set_property: the generic setter for all properties of this type. Should be
262  *  overridden for every type with properties. If implementations of
263  *  @set_property don't emit property change notification explicitly, this will
264  *  be done implicitly by the type system. However, if the notify signal is
265  *  emitted explicitly, the type system will not emit it a second time.
266  * @get_property: the generic getter for all properties of this type. Should be
267  *  overridden for every type with properties.
268  * @dispose: the @dispose function is supposed to drop all references to other
269  *  objects, but keep the instance otherwise intact, so that client method
270  *  invocations still work. It may be run multiple times (due to reference
271  *  loops). Before returning, @dispose should chain up to the @dispose method
272  *  of the parent class.
273  * @finalize: instance finalization function, should finish the finalization of
274  *  the instance begun in @dispose and chain up to the @finalize method of the
275  *  parent class.
276  * @dispatch_properties_changed: emits property change notification for a bunch
277  *  of properties. Overriding @dispatch_properties_changed should be rarely
278  *  needed.
279  * @notify: the class closure for the notify signal
280  * @constructed: the @constructed function is called by g_object_new() as the
281  *  final step of the object creation process.  At the point of the call, all
282  *  construction properties have been set on the object.  The purpose of this
283  *  call is to allow for object initialisation steps that can only be performed
284  *  after construction properties have been set.  @constructed implementors
285  *  should chain up to the @constructed call of their parent class to allow it
286  *  to complete its initialisation.
287  *
288  * The class structure for the GObject type.
289  *
290  * |[<!-- language="C" -->
291  * // Example of implementing a singleton using a constructor.
292  * static MySingleton *the_singleton = NULL;
293  *
294  * static GObject*
295  * my_singleton_constructor (GType                  type,
296  *                           guint                  n_construct_params,
297  *                           GObjectConstructParam *construct_params)
298  * {
299  *   GObject *object;
300  *
301  *   if (!the_singleton)
302  *     {
303  *       object = G_OBJECT_CLASS (parent_class)->constructor (type,
304  *                                                            n_construct_params,
305  *                                                            construct_params);
306  *       the_singleton = MY_SINGLETON (object);
307  *     }
308  *   else
309  *     object = g_object_ref (G_OBJECT (the_singleton));
310  *
311  *   return object;
312  * }
313  * ]|
314  */
315 struct  _GObjectClass
316 {
317   GTypeClass   g_type_class;
318 
319   /*< private >*/
320   GSList      *construct_properties;
321 
322   /*< public >*/
323   /* seldom overidden */
324   GObject*   (*constructor)     (GType                  type,
325                                  guint                  n_construct_properties,
326                                  GObjectConstructParam *construct_properties);
327   /* overridable methods */
328   void       (*set_property)		(GObject        *object,
329                                          guint           property_id,
330                                          const GValue   *value,
331                                          GParamSpec     *pspec);
332   void       (*get_property)		(GObject        *object,
333                                          guint           property_id,
334                                          GValue         *value,
335                                          GParamSpec     *pspec);
336   void       (*dispose)			(GObject        *object);
337   void       (*finalize)		(GObject        *object);
338   /* seldom overidden */
339   void       (*dispatch_properties_changed) (GObject      *object,
340 					     guint	   n_pspecs,
341 					     GParamSpec  **pspecs);
342   /* signals */
343   void	     (*notify)			(GObject	*object,
344 					 GParamSpec	*pspec);
345 
346   /* called when done constructing */
347   void	     (*constructed)		(GObject	*object);
348 
349   /*< private >*/
350   gsize		flags;
351 
352   /* padding */
353   gpointer	pdummy[6];
354 };
355 /**
356  * GObjectConstructParam:
357  * @pspec: the #GParamSpec of the construct parameter
358  * @value: the value to set the parameter to
359  *
360  * The GObjectConstructParam struct is an auxiliary
361  * structure used to hand #GParamSpec/#GValue pairs to the @constructor of
362  * a #GObjectClass.
363  */
364 struct _GObjectConstructParam
365 {
366   GParamSpec *pspec;
367   GValue     *value;
368 };
369 
370 /**
371  * GInitiallyUnowned:
372  *
373  * All the fields in the GInitiallyUnowned structure
374  * are private to the #GInitiallyUnowned implementation and should never be
375  * accessed directly.
376  */
377 /**
378  * GInitiallyUnownedClass:
379  *
380  * The class structure for the GInitiallyUnowned type.
381  */
382 
383 
384 /* --- prototypes --- */
385 GLIB_AVAILABLE_IN_ALL
386 GType       g_initially_unowned_get_type      (void);
387 GLIB_AVAILABLE_IN_ALL
388 void        g_object_class_install_property   (GObjectClass   *oclass,
389 					       guint           property_id,
390 					       GParamSpec     *pspec);
391 GLIB_AVAILABLE_IN_ALL
392 GParamSpec* g_object_class_find_property      (GObjectClass   *oclass,
393 					       const gchar    *property_name);
394 GLIB_AVAILABLE_IN_ALL
395 GParamSpec**g_object_class_list_properties    (GObjectClass   *oclass,
396 					       guint	      *n_properties);
397 GLIB_AVAILABLE_IN_ALL
398 void        g_object_class_override_property  (GObjectClass   *oclass,
399 					       guint           property_id,
400 					       const gchar    *name);
401 GLIB_AVAILABLE_IN_ALL
402 void        g_object_class_install_properties (GObjectClass   *oclass,
403                                                guint           n_pspecs,
404                                                GParamSpec    **pspecs);
405 
406 GLIB_AVAILABLE_IN_ALL
407 void        g_object_interface_install_property (gpointer     g_iface,
408 						 GParamSpec  *pspec);
409 GLIB_AVAILABLE_IN_ALL
410 GParamSpec* g_object_interface_find_property    (gpointer     g_iface,
411 						 const gchar *property_name);
412 GLIB_AVAILABLE_IN_ALL
413 GParamSpec**g_object_interface_list_properties  (gpointer     g_iface,
414 						 guint       *n_properties_p);
415 
416 GLIB_AVAILABLE_IN_ALL
417 GType       g_object_get_type                 (void) G_GNUC_CONST;
418 GLIB_AVAILABLE_IN_ALL
419 gpointer    g_object_new                      (GType           object_type,
420 					       const gchar    *first_property_name,
421 					       ...);
422 GLIB_AVAILABLE_IN_2_54
423 GObject*    g_object_new_with_properties      (GType           object_type,
424                                                guint           n_properties,
425                                                const char     *names[],
426                                                const GValue    values[]);
427 
428 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
429 
430 GLIB_DEPRECATED_IN_2_54_FOR(g_object_new_with_properties)
431 gpointer    g_object_newv		      (GType           object_type,
432 					       guint	       n_parameters,
433 					       GParameter     *parameters);
434 
435 G_GNUC_END_IGNORE_DEPRECATIONS
436 
437 GLIB_AVAILABLE_IN_ALL
438 GObject*    g_object_new_valist               (GType           object_type,
439 					       const gchar    *first_property_name,
440 					       va_list         var_args);
441 GLIB_AVAILABLE_IN_ALL
442 void	    g_object_set                      (gpointer	       object,
443 					       const gchar    *first_property_name,
444 					       ...) G_GNUC_NULL_TERMINATED;
445 GLIB_AVAILABLE_IN_ALL
446 void        g_object_get                      (gpointer        object,
447 					       const gchar    *first_property_name,
448 					       ...) G_GNUC_NULL_TERMINATED;
449 GLIB_AVAILABLE_IN_ALL
450 gpointer    g_object_connect                  (gpointer	       object,
451 					       const gchar    *signal_spec,
452 					       ...) G_GNUC_NULL_TERMINATED;
453 GLIB_AVAILABLE_IN_ALL
454 void	    g_object_disconnect               (gpointer	       object,
455 					       const gchar    *signal_spec,
456 					       ...) G_GNUC_NULL_TERMINATED;
457 GLIB_AVAILABLE_IN_2_54
458 void        g_object_setv                     (GObject        *object,
459                                                guint           n_properties,
460                                                const gchar    *names[],
461                                                const GValue    values[]);
462 GLIB_AVAILABLE_IN_ALL
463 void        g_object_set_valist               (GObject        *object,
464 					       const gchar    *first_property_name,
465 					       va_list         var_args);
466 GLIB_AVAILABLE_IN_2_54
467 void        g_object_getv                     (GObject        *object,
468                                                guint           n_properties,
469                                                const gchar    *names[],
470                                                GValue          values[]);
471 GLIB_AVAILABLE_IN_ALL
472 void        g_object_get_valist               (GObject        *object,
473 					       const gchar    *first_property_name,
474 					       va_list         var_args);
475 GLIB_AVAILABLE_IN_ALL
476 void        g_object_set_property             (GObject        *object,
477 					       const gchar    *property_name,
478 					       const GValue   *value);
479 GLIB_AVAILABLE_IN_ALL
480 void        g_object_get_property             (GObject        *object,
481 					       const gchar    *property_name,
482 					       GValue         *value);
483 GLIB_AVAILABLE_IN_ALL
484 void        g_object_freeze_notify            (GObject        *object);
485 GLIB_AVAILABLE_IN_ALL
486 void        g_object_notify                   (GObject        *object,
487 					       const gchar    *property_name);
488 GLIB_AVAILABLE_IN_ALL
489 void        g_object_notify_by_pspec          (GObject        *object,
490 					       GParamSpec     *pspec);
491 GLIB_AVAILABLE_IN_ALL
492 void        g_object_thaw_notify              (GObject        *object);
493 GLIB_AVAILABLE_IN_ALL
494 gboolean    g_object_is_floating    	      (gpointer        object);
495 GLIB_AVAILABLE_IN_ALL
496 gpointer    g_object_ref_sink       	      (gpointer	       object);
497 GLIB_AVAILABLE_IN_ALL
498 gpointer    g_object_ref                      (gpointer        object);
499 GLIB_AVAILABLE_IN_ALL
500 void        g_object_unref                    (gpointer        object);
501 GLIB_AVAILABLE_IN_ALL
502 void	    g_object_weak_ref		      (GObject	      *object,
503 					       GWeakNotify     notify,
504 					       gpointer	       data);
505 GLIB_AVAILABLE_IN_ALL
506 void	    g_object_weak_unref		      (GObject	      *object,
507 					       GWeakNotify     notify,
508 					       gpointer	       data);
509 GLIB_AVAILABLE_IN_ALL
510 void        g_object_add_weak_pointer         (GObject        *object,
511                                                gpointer       *weak_pointer_location);
512 GLIB_AVAILABLE_IN_ALL
513 void        g_object_remove_weak_pointer      (GObject        *object,
514                                                gpointer       *weak_pointer_location);
515 
516 #if defined(g_has_typeof) && GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_56
517 /* Make reference APIs type safe with macros */
518 #define g_object_ref(Obj)      ((__typeof__(Obj)) (g_object_ref) (Obj))
519 #define g_object_ref_sink(Obj) ((__typeof__(Obj)) (g_object_ref_sink) (Obj))
520 #endif
521 
522 /**
523  * GToggleNotify:
524  * @data: Callback data passed to g_object_add_toggle_ref()
525  * @object: The object on which g_object_add_toggle_ref() was called.
526  * @is_last_ref: %TRUE if the toggle reference is now the
527  *  last reference to the object. %FALSE if the toggle
528  *  reference was the last reference and there are now other
529  *  references.
530  *
531  * A callback function used for notification when the state
532  * of a toggle reference changes. See g_object_add_toggle_ref().
533  */
534 typedef void (*GToggleNotify) (gpointer      data,
535 			       GObject      *object,
536 			       gboolean      is_last_ref);
537 
538 GLIB_AVAILABLE_IN_ALL
539 void g_object_add_toggle_ref    (GObject       *object,
540 				 GToggleNotify  notify,
541 				 gpointer       data);
542 GLIB_AVAILABLE_IN_ALL
543 void g_object_remove_toggle_ref (GObject       *object,
544 				 GToggleNotify  notify,
545 				 gpointer       data);
546 
547 GLIB_AVAILABLE_IN_ALL
548 gpointer    g_object_get_qdata                (GObject        *object,
549 					       GQuark          quark);
550 GLIB_AVAILABLE_IN_ALL
551 void        g_object_set_qdata                (GObject        *object,
552 					       GQuark          quark,
553 					       gpointer        data);
554 GLIB_AVAILABLE_IN_ALL
555 void        g_object_set_qdata_full           (GObject        *object,
556 					       GQuark          quark,
557 					       gpointer        data,
558 					       GDestroyNotify  destroy);
559 GLIB_AVAILABLE_IN_ALL
560 gpointer    g_object_steal_qdata              (GObject        *object,
561 					       GQuark          quark);
562 
563 GLIB_AVAILABLE_IN_2_34
564 gpointer    g_object_dup_qdata                (GObject        *object,
565                                                GQuark          quark,
566                                                GDuplicateFunc  dup_func,
567 					       gpointer         user_data);
568 GLIB_AVAILABLE_IN_2_34
569 gboolean    g_object_replace_qdata            (GObject        *object,
570                                                GQuark          quark,
571                                                gpointer        oldval,
572                                                gpointer        newval,
573                                                GDestroyNotify  destroy,
574 					       GDestroyNotify *old_destroy);
575 
576 GLIB_AVAILABLE_IN_ALL
577 gpointer    g_object_get_data                 (GObject        *object,
578 					       const gchar    *key);
579 GLIB_AVAILABLE_IN_ALL
580 void        g_object_set_data                 (GObject        *object,
581 					       const gchar    *key,
582 					       gpointer        data);
583 GLIB_AVAILABLE_IN_ALL
584 void        g_object_set_data_full            (GObject        *object,
585 					       const gchar    *key,
586 					       gpointer        data,
587 					       GDestroyNotify  destroy);
588 GLIB_AVAILABLE_IN_ALL
589 gpointer    g_object_steal_data               (GObject        *object,
590 					       const gchar    *key);
591 
592 GLIB_AVAILABLE_IN_2_34
593 gpointer    g_object_dup_data                 (GObject        *object,
594                                                const gchar    *key,
595                                                GDuplicateFunc  dup_func,
596 					       gpointer         user_data);
597 GLIB_AVAILABLE_IN_2_34
598 gboolean    g_object_replace_data             (GObject        *object,
599                                                const gchar    *key,
600                                                gpointer        oldval,
601                                                gpointer        newval,
602                                                GDestroyNotify  destroy,
603 					       GDestroyNotify *old_destroy);
604 
605 
606 GLIB_AVAILABLE_IN_ALL
607 void        g_object_watch_closure            (GObject        *object,
608 					       GClosure       *closure);
609 GLIB_AVAILABLE_IN_ALL
610 GClosure*   g_cclosure_new_object             (GCallback       callback_func,
611 					       GObject	      *object);
612 GLIB_AVAILABLE_IN_ALL
613 GClosure*   g_cclosure_new_object_swap        (GCallback       callback_func,
614 					       GObject	      *object);
615 GLIB_AVAILABLE_IN_ALL
616 GClosure*   g_closure_new_object              (guint           sizeof_closure,
617 					       GObject        *object);
618 GLIB_AVAILABLE_IN_ALL
619 void        g_value_set_object                (GValue         *value,
620 					       gpointer        v_object);
621 GLIB_AVAILABLE_IN_ALL
622 gpointer    g_value_get_object                (const GValue   *value);
623 GLIB_AVAILABLE_IN_ALL
624 gpointer    g_value_dup_object                (const GValue   *value);
625 GLIB_AVAILABLE_IN_ALL
626 gulong	    g_signal_connect_object           (gpointer	       instance,
627 					       const gchar    *detailed_signal,
628 					       GCallback       c_handler,
629 					       gpointer	       gobject,
630 					       GConnectFlags   connect_flags);
631 
632 /*< protected >*/
633 GLIB_AVAILABLE_IN_ALL
634 void        g_object_force_floating           (GObject        *object);
635 GLIB_AVAILABLE_IN_ALL
636 void        g_object_run_dispose	      (GObject	      *object);
637 
638 
639 GLIB_AVAILABLE_IN_ALL
640 void        g_value_take_object               (GValue         *value,
641 					       gpointer        v_object);
642 GLIB_DEPRECATED_FOR(g_value_take_object)
643 void        g_value_set_object_take_ownership (GValue         *value,
644                                                gpointer        v_object);
645 
646 GLIB_DEPRECATED
647 gsize	    g_object_compat_control	      (gsize	       what,
648 					       gpointer	       data);
649 
650 /* --- implementation macros --- */
651 #define G_OBJECT_WARN_INVALID_PSPEC(object, pname, property_id, pspec) \
652 G_STMT_START { \
653   GObject *_glib__object = (GObject*) (object); \
654   GParamSpec *_glib__pspec = (GParamSpec*) (pspec); \
655   guint _glib__property_id = (property_id); \
656   g_warning ("%s:%d: invalid %s id %u for \"%s\" of type '%s' in '%s'", \
657              __FILE__, __LINE__, \
658              (pname), \
659              _glib__property_id, \
660              _glib__pspec->name, \
661              g_type_name (G_PARAM_SPEC_TYPE (_glib__pspec)), \
662              G_OBJECT_TYPE_NAME (_glib__object)); \
663 } G_STMT_END
664 /**
665  * G_OBJECT_WARN_INVALID_PROPERTY_ID:
666  * @object: the #GObject on which set_property() or get_property() was called
667  * @property_id: the numeric id of the property
668  * @pspec: the #GParamSpec of the property
669  *
670  * This macro should be used to emit a standard warning about unexpected
671  * properties in set_property() and get_property() implementations.
672  */
673 #define G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec) \
674     G_OBJECT_WARN_INVALID_PSPEC ((object), "property", (property_id), (pspec))
675 
676 GLIB_AVAILABLE_IN_ALL
677 void    g_clear_object (GObject **object_ptr);
678 #define g_clear_object(object_ptr) g_clear_pointer ((object_ptr), g_object_unref)
679 
680 /**
681  * g_set_object: (skip)
682  * @object_ptr: a pointer to a #GObject reference
683  * @new_object: (nullable) (transfer none): a pointer to the new #GObject to
684  *   assign to it, or %NULL to clear the pointer
685  *
686  * Updates a #GObject pointer to refer to @new_object. It increments the
687  * reference count of @new_object (if non-%NULL), decrements the reference
688  * count of the current value of @object_ptr (if non-%NULL), and assigns
689  * @new_object to @object_ptr. The assignment is not atomic.
690  *
691  * @object_ptr must not be %NULL.
692  *
693  * A macro is also included that allows this function to be used without
694  * pointer casts. The function itself is static inline, so its address may vary
695  * between compilation units.
696  *
697  * One convenient usage of this function is in implementing property setters:
698  * |[
699  *   void
700  *   foo_set_bar (Foo *foo,
701  *                Bar *new_bar)
702  *   {
703  *     g_return_if_fail (IS_FOO (foo));
704  *     g_return_if_fail (new_bar == NULL || IS_BAR (new_bar));
705  *
706  *     if (g_set_object (&foo->bar, new_bar))
707  *       g_object_notify (foo, "bar");
708  *   }
709  * ]|
710  *
711  * Returns: %TRUE if the value of @object_ptr changed, %FALSE otherwise
712  *
713  * Since: 2.44
714  */
gboolean(g_set_object)715 static inline gboolean
716 (g_set_object) (GObject **object_ptr,
717                 GObject  *new_object)
718 {
719   GObject *old_object = *object_ptr;
720 
721   /* rely on g_object_[un]ref() to check the pointers are actually GObjects;
722    * elide a (object_ptr != NULL) check because most of the time we will be
723    * operating on struct members with a constant offset, so a NULL check would
724    * not catch bugs
725    */
726 
727   if (old_object == new_object)
728     return FALSE;
729 
730   if (new_object != NULL)
731     g_object_ref (new_object);
732 
733   *object_ptr = new_object;
734 
735   if (old_object != NULL)
736     g_object_unref (old_object);
737 
738   return TRUE;
739 }
740 
741 #define g_set_object(object_ptr, new_object) \
742  (/* Check types match. */ \
743   0 ? *(object_ptr) = (new_object), FALSE : \
744   (g_set_object) ((GObject **) (object_ptr), (GObject *) (new_object)) \
745  )
746 
747 /**
748  * g_assert_finalize_object: (skip)
749  * @object: (transfer full) (type GObject.Object): an object
750  *
751  * Assert that @object is non-%NULL, then release one reference to it with
752  * g_object_unref() and assert that it has been finalized (i.e. that there
753  * are no more references).
754  *
755  * If assertions are disabled via `G_DISABLE_ASSERT`,
756  * this macro just calls g_object_unref() without any further checks.
757  *
758  * This macro should only be used in regression tests.
759  *
760  * Since: 2.62
761  */
762 static inline void
763 (g_assert_finalize_object) (GObject *object)
764 {
765   gpointer weak_pointer = object;
766 
767   g_assert_true (G_IS_OBJECT (weak_pointer));
768   g_object_add_weak_pointer (object, &weak_pointer);
769   g_object_unref (weak_pointer);
770   g_assert_null (weak_pointer);
771 }
772 
773 #ifdef G_DISABLE_ASSERT
774 #define g_assert_finalize_object(object) g_object_unref (object)
775 #else
776 #define g_assert_finalize_object(object) (g_assert_finalize_object ((GObject *) object))
777 #endif
778 
779 /**
780  * g_clear_weak_pointer: (skip)
781  * @weak_pointer_location: The memory address of a pointer
782  *
783  * Clears a weak reference to a #GObject.
784  *
785  * @weak_pointer_location must not be %NULL.
786  *
787  * If the weak reference is %NULL then this function does nothing.
788  * Otherwise, the weak reference to the object is removed for that location
789  * and the pointer is set to %NULL.
790  *
791  * A macro is also included that allows this function to be used without
792  * pointer casts. The function itself is static inline, so its address may vary
793  * between compilation units.
794  *
795  * Since: 2.56
796  */
797 static inline void
798 (g_clear_weak_pointer) (gpointer *weak_pointer_location)
799 {
800   GObject *object = (GObject *) *weak_pointer_location;
801 
802   if (object != NULL)
803     {
804       g_object_remove_weak_pointer (object, weak_pointer_location);
805       *weak_pointer_location = NULL;
806     }
807 }
808 
809 #define g_clear_weak_pointer(weak_pointer_location) \
810  (/* Check types match. */ \
811   (g_clear_weak_pointer) ((gpointer *) (weak_pointer_location)) \
812  )
813 
814 /**
815  * g_set_weak_pointer: (skip)
816  * @weak_pointer_location: the memory address of a pointer
817  * @new_object: (nullable) (transfer none): a pointer to the new #GObject to
818  *   assign to it, or %NULL to clear the pointer
819  *
820  * Updates a pointer to weakly refer to @new_object. It assigns @new_object
821  * to @weak_pointer_location and ensures that @weak_pointer_location will
822  * automaticaly be set to %NULL if @new_object gets destroyed. The assignment
823  * is not atomic. The weak reference is not thread-safe, see
824  * g_object_add_weak_pointer() for details.
825  *
826  * @weak_pointer_location must not be %NULL.
827  *
828  * A macro is also included that allows this function to be used without
829  * pointer casts. The function itself is static inline, so its address may vary
830  * between compilation units.
831  *
832  * One convenient usage of this function is in implementing property setters:
833  * |[
834  *   void
835  *   foo_set_bar (Foo *foo,
836  *                Bar *new_bar)
837  *   {
838  *     g_return_if_fail (IS_FOO (foo));
839  *     g_return_if_fail (new_bar == NULL || IS_BAR (new_bar));
840  *
841  *     if (g_set_weak_pointer (&foo->bar, new_bar))
842  *       g_object_notify (foo, "bar");
843  *   }
844  * ]|
845  *
846  * Returns: %TRUE if the value of @weak_pointer_location changed, %FALSE otherwise
847  *
848  * Since: 2.56
849  */
gboolean(g_set_weak_pointer)850 static inline gboolean
851 (g_set_weak_pointer) (gpointer *weak_pointer_location,
852                       GObject  *new_object)
853 {
854   GObject *old_object = (GObject *) *weak_pointer_location;
855 
856   /* elide a (weak_pointer_location != NULL) check because most of the time we
857    * will be operating on struct members with a constant offset, so a NULL
858    * check would not catch bugs
859    */
860 
861   if (old_object == new_object)
862     return FALSE;
863 
864   if (old_object != NULL)
865     g_object_remove_weak_pointer (old_object, weak_pointer_location);
866 
867   *weak_pointer_location = new_object;
868 
869   if (new_object != NULL)
870     g_object_add_weak_pointer (new_object, weak_pointer_location);
871 
872   return TRUE;
873 }
874 
875 #define g_set_weak_pointer(weak_pointer_location, new_object) \
876  (/* Check types match. */ \
877   0 ? *(weak_pointer_location) = (new_object), FALSE : \
878   (g_set_weak_pointer) ((gpointer *) (weak_pointer_location), (GObject *) (new_object)) \
879  )
880 
881 typedef struct {
882     /*<private>*/
883     union { gpointer p; } priv;
884 } GWeakRef;
885 
886 GLIB_AVAILABLE_IN_ALL
887 void     g_weak_ref_init       (GWeakRef *weak_ref,
888                                 gpointer  object);
889 GLIB_AVAILABLE_IN_ALL
890 void     g_weak_ref_clear      (GWeakRef *weak_ref);
891 GLIB_AVAILABLE_IN_ALL
892 gpointer g_weak_ref_get        (GWeakRef *weak_ref);
893 GLIB_AVAILABLE_IN_ALL
894 void     g_weak_ref_set        (GWeakRef *weak_ref,
895                                 gpointer  object);
896 
897 G_END_DECLS
898 
899 #endif /* __G_OBJECT_H__ */
900