remove trailing whitespace from newly added gtk-doc comments and
[platform/upstream/glib.git] / gobject / gobject.c
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
20 /*
21  * MT safe with regards to reference counting.
22  */
23
24 #include "config.h"
25
26 #include <string.h>
27 #include <signal.h>
28
29 #include "glib/gdatasetprivate.h"
30
31 #include "gobject.h"
32 #include "gvaluecollector.h"
33 #include "gsignal.h"
34 #include "gparamspecs.h"
35 #include "gvaluetypes.h"
36 #include "gobjectalias.h"
37
38 /* This should be included after gobjectalias.h (or pltcheck.sh will fail) */
39 #include "gobjectnotifyqueue.c"
40
41
42 /**
43  * SECTION:objects
44  *
45  * @Short_description: The base object type
46  *
47  * @See_also:#GParamSpecObject, g_param_spec_object()
48  *
49  * @Title: The Base Object Type
50  *
51  * GObject is the fundamental type providing the common attributes and
52  * methods for all object types in GTK+, Pango and other libraries
53  * based on GObject.  The GObject class provides methods for object
54  * construction and destruction, property access methods, and signal
55  * support.  Signals are described in detail in <xref
56  * linkend="gobject-Signals"/>.
57  *
58  * <para id="floating-ref">
59  * #GInitiallyUnowned is derived from #GObject. The only difference between
60  * the two is that the initial reference of a #GInitiallyUnowned is flagged
61  * as a <firstterm>floating</firstterm> reference.
62  * This means that it is not specifically claimed to be "owned" by
63  * any code portion. The main motivation for providing floating references is
64  * C convenience. In particular, it allows code to be written as:
65  * |[
66  * container = create_container();
67  * container_add_child (container, create_child());
68  * ]|
69  * If <function>container_add_child()</function> will g_object_ref_sink() the
70  * passed in child, no reference of the newly created child is leaked.
71  * Without floating references, <function>container_add_child()</function>
72  * can only g_object_ref() the new child, so to implement this code without
73  * reference leaks, it would have to be written as:
74  * |[
75  * Child *child;
76  * container = create_container();
77  * child = create_child();
78  * container_add_child (container, child);
79  * g_object_unref (child);
80  * ]|
81  * The floating reference can be converted into
82  * an ordinary reference by calling g_object_ref_sink().
83  * For already sunken objects (objects that don't have a floating reference
84  * anymore), g_object_ref_sink() is equivalent to g_object_ref() and returns
85  * a new reference.
86  * Since floating references are useful almost exclusively for C convenience,
87  * language bindings that provide automated reference and memory ownership
88  * maintenance (such as smart pointers or garbage collection) therefore don't
89  * need to expose floating references in their API.
90  * </para>
91  *
92  * Some object implementations may need to save an objects floating state
93  * across certain code portions (an example is #GtkMenu), to achive this, the
94  * following sequence can be used:
95  *
96  * |[
97  * // save floating state
98  * gboolean was_floating = g_object_is_floating (object);
99  * g_object_ref_sink (object);
100  * // protected code portion
101  * ...;
102  * // restore floating state
103  * if (was_floating)
104  *   g_object_force_floating (object);
105  * g_obejct_unref (object); // release previously acquired reference
106  * ]|
107  */
108
109
110 #define PREALLOC_CPARAMS        (8)
111
112
113 /* --- macros --- */
114 #define PARAM_SPEC_PARAM_ID(pspec)              ((pspec)->param_id)
115 #define PARAM_SPEC_SET_PARAM_ID(pspec, id)      ((pspec)->param_id = (id))
116
117 #define OBJECT_HAS_TOGGLE_REF_FLAG 0x1
118 #define OBJECT_HAS_TOGGLE_REF(object) \
119     ((G_DATALIST_GET_FLAGS (&(object)->qdata) & OBJECT_HAS_TOGGLE_REF_FLAG) != 0)
120 #define OBJECT_FLOATING_FLAG 0x2
121
122
123 /* --- signals --- */
124 enum {
125   NOTIFY,
126   LAST_SIGNAL
127 };
128
129
130 /* --- properties --- */
131 enum {
132   PROP_NONE
133 };
134
135
136 /* --- prototypes --- */
137 static void     g_object_base_class_init                (GObjectClass   *class);
138 static void     g_object_base_class_finalize            (GObjectClass   *class);
139 static void     g_object_do_class_init                  (GObjectClass   *class);
140 static void     g_object_init                           (GObject        *object);
141 static GObject* g_object_constructor                    (GType                  type,
142                                                          guint                  n_construct_properties,
143                                                          GObjectConstructParam *construct_params);
144 static void     g_object_real_dispose                   (GObject        *object);
145 static void     g_object_finalize                       (GObject        *object);
146 static void     g_object_do_set_property                (GObject        *object,
147                                                          guint           property_id,
148                                                          const GValue   *value,
149                                                          GParamSpec     *pspec);
150 static void     g_object_do_get_property                (GObject        *object,
151                                                          guint           property_id,
152                                                          GValue         *value,
153                                                          GParamSpec     *pspec);
154 static void     g_value_object_init                     (GValue         *value);
155 static void     g_value_object_free_value               (GValue         *value);
156 static void     g_value_object_copy_value               (const GValue   *src_value,
157                                                          GValue         *dest_value);
158 static void     g_value_object_transform_value          (const GValue   *src_value,
159                                                          GValue         *dest_value);
160 static gpointer g_value_object_peek_pointer             (const GValue   *value);
161 static gchar*   g_value_object_collect_value            (GValue         *value,
162                                                          guint           n_collect_values,
163                                                          GTypeCValue    *collect_values,
164                                                          guint           collect_flags);
165 static gchar*   g_value_object_lcopy_value              (const GValue   *value,
166                                                          guint           n_collect_values,
167                                                          GTypeCValue    *collect_values,
168                                                          guint           collect_flags);
169 static void     g_object_dispatch_properties_changed    (GObject        *object,
170                                                          guint           n_pspecs,
171                                                          GParamSpec    **pspecs);
172 static inline void         object_get_property          (GObject        *object,
173                                                          GParamSpec     *pspec,
174                                                          GValue         *value);
175 static inline void         object_set_property          (GObject        *object,
176                                                          GParamSpec     *pspec,
177                                                          const GValue   *value,
178                                                          GObjectNotifyQueue *nqueue);
179 static guint               object_floating_flag_handler (GObject        *object,
180                                                          gint            job);
181
182 static void object_interface_check_properties           (gpointer        func_data,
183                                                          gpointer        g_iface);
184
185
186 /* --- variables --- */
187 static GQuark               quark_closure_array = 0;
188 static GQuark               quark_weak_refs = 0;
189 static GQuark               quark_toggle_refs = 0;
190 static GParamSpecPool      *pspec_pool = NULL;
191 static GObjectNotifyContext property_notify_context = { 0, };
192 static gulong               gobject_signals[LAST_SIGNAL] = { 0, };
193 static guint (*floating_flag_handler) (GObject*, gint) = object_floating_flag_handler;
194 G_LOCK_DEFINE_STATIC (construction_mutex);
195 static GSList *construction_objects = NULL;
196
197 /* --- functions --- */
198 #ifdef  G_ENABLE_DEBUG
199 #define IF_DEBUG(debug_type)    if (_g_type_debug_flags & G_TYPE_DEBUG_ ## debug_type)
200 G_LOCK_DEFINE_STATIC     (debug_objects);
201 static volatile GObject *g_trap_object_ref = NULL;
202 static guint             debug_objects_count = 0;
203 static GHashTable       *debug_objects_ht = NULL;
204
205 static void
206 debug_objects_foreach (gpointer key,
207                        gpointer value,
208                        gpointer user_data)
209 {
210   GObject *object = value;
211
212   g_message ("[%p] stale %s\tref_count=%u",
213              object,
214              G_OBJECT_TYPE_NAME (object),
215              object->ref_count);
216 }
217
218 static void
219 debug_objects_atexit (void)
220 {
221   IF_DEBUG (OBJECTS)
222     {
223       G_LOCK (debug_objects);
224       g_message ("stale GObjects: %u", debug_objects_count);
225       g_hash_table_foreach (debug_objects_ht, debug_objects_foreach, NULL);
226       G_UNLOCK (debug_objects);
227     }
228 }
229 #endif  /* G_ENABLE_DEBUG */
230
231 void
232 g_object_type_init (void)
233 {
234   static gboolean initialized = FALSE;
235   static const GTypeFundamentalInfo finfo = {
236     G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE,
237   };
238   static GTypeInfo info = {
239     sizeof (GObjectClass),
240     (GBaseInitFunc) g_object_base_class_init,
241     (GBaseFinalizeFunc) g_object_base_class_finalize,
242     (GClassInitFunc) g_object_do_class_init,
243     NULL        /* class_destroy */,
244     NULL        /* class_data */,
245     sizeof (GObject),
246     0           /* n_preallocs */,
247     (GInstanceInitFunc) g_object_init,
248     NULL,       /* value_table */
249   };
250   static const GTypeValueTable value_table = {
251     g_value_object_init,          /* value_init */
252     g_value_object_free_value,    /* value_free */
253     g_value_object_copy_value,    /* value_copy */
254     g_value_object_peek_pointer,  /* value_peek_pointer */
255     "p",                          /* collect_format */
256     g_value_object_collect_value, /* collect_value */
257     "p",                          /* lcopy_format */
258     g_value_object_lcopy_value,   /* lcopy_value */
259   };
260   GType type;
261   
262   g_return_if_fail (initialized == FALSE);
263   initialized = TRUE;
264   
265   /* G_TYPE_OBJECT
266    */
267   info.value_table = &value_table;
268   type = g_type_register_fundamental (G_TYPE_OBJECT, g_intern_static_string ("GObject"), &info, &finfo, 0);
269   g_assert (type == G_TYPE_OBJECT);
270   g_value_register_transform_func (G_TYPE_OBJECT, G_TYPE_OBJECT, g_value_object_transform_value);
271   
272 #ifdef  G_ENABLE_DEBUG
273   IF_DEBUG (OBJECTS)
274     {
275       debug_objects_ht = g_hash_table_new (g_direct_hash, NULL);
276       g_atexit (debug_objects_atexit);
277     }
278 #endif  /* G_ENABLE_DEBUG */
279 }
280
281 static void
282 g_object_base_class_init (GObjectClass *class)
283 {
284   GObjectClass *pclass = g_type_class_peek_parent (class);
285
286   /* reset instance specific fields and methods that don't get inherited */
287   class->construct_properties = pclass ? g_slist_copy (pclass->construct_properties) : NULL;
288   class->get_property = NULL;
289   class->set_property = NULL;
290 }
291
292 static void
293 g_object_base_class_finalize (GObjectClass *class)
294 {
295   GList *list, *node;
296   
297   _g_signals_destroy (G_OBJECT_CLASS_TYPE (class));
298
299   g_slist_free (class->construct_properties);
300   class->construct_properties = NULL;
301   list = g_param_spec_pool_list_owned (pspec_pool, G_OBJECT_CLASS_TYPE (class));
302   for (node = list; node; node = node->next)
303     {
304       GParamSpec *pspec = node->data;
305       
306       g_param_spec_pool_remove (pspec_pool, pspec);
307       PARAM_SPEC_SET_PARAM_ID (pspec, 0);
308       g_param_spec_unref (pspec);
309     }
310   g_list_free (list);
311 }
312
313 static void
314 g_object_notify_dispatcher (GObject     *object,
315                             guint        n_pspecs,
316                             GParamSpec **pspecs)
317 {
318   G_OBJECT_GET_CLASS (object)->dispatch_properties_changed (object, n_pspecs, pspecs);
319 }
320
321 static void
322 g_object_do_class_init (GObjectClass *class)
323 {
324   /* read the comment about typedef struct CArray; on why not to change this quark */
325   quark_closure_array = g_quark_from_static_string ("GObject-closure-array");
326
327   quark_weak_refs = g_quark_from_static_string ("GObject-weak-references");
328   quark_toggle_refs = g_quark_from_static_string ("GObject-toggle-references");
329   pspec_pool = g_param_spec_pool_new (TRUE);
330   property_notify_context.quark_notify_queue = g_quark_from_static_string ("GObject-notify-queue");
331   property_notify_context.dispatcher = g_object_notify_dispatcher;
332   
333   class->constructor = g_object_constructor;
334   class->set_property = g_object_do_set_property;
335   class->get_property = g_object_do_get_property;
336   class->dispose = g_object_real_dispose;
337   class->finalize = g_object_finalize;
338   class->dispatch_properties_changed = g_object_dispatch_properties_changed;
339   class->notify = NULL;
340
341   /**
342    * GObject::notify:
343    * @pspec: the #GParamSpec of the property which changed
344    * @gobject: the object which received the signal.
345    *
346    * The notify signal is emitted on an object when one of its
347    * properties has been changed. Note that getting this signal
348    * doesn't guarantee that the value of the property has actually
349    * changed, it may also be emitted when the setter for the property
350    * is called to reinstate the previous value.
351    *
352    * This signal is typically used to obtain change notification for a
353    * single property, by specifying the property name as a detail in the
354    * g_signal_connect() call, like this:
355    * |[
356    * g_signal_connect (text_view->buffer, "notify::paste-target-list",
357    *                   G_CALLBACK (gtk_text_view_target_list_notify),
358    *                   text_view)
359    * ]|
360    * It is important to note that you must use
361    * <link linkend="canonical-parameter-name">canonical</link> parameter names as
362    * detail strings for the notify signal.
363    */
364   gobject_signals[NOTIFY] =
365     g_signal_new (g_intern_static_string ("notify"),
366                   G_TYPE_FROM_CLASS (class),
367                   G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE | G_SIGNAL_DETAILED | G_SIGNAL_NO_HOOKS | G_SIGNAL_ACTION,
368                   G_STRUCT_OFFSET (GObjectClass, notify),
369                   NULL, NULL,
370                   g_cclosure_marshal_VOID__PARAM,
371                   G_TYPE_NONE,
372                   1, G_TYPE_PARAM);
373
374   /* Install a check function that we'll use to verify that classes that
375    * implement an interface implement all properties for that interface
376    */
377   g_type_add_interface_check (NULL, object_interface_check_properties);
378 }
379
380 static void
381 install_property_internal (GType       g_type,
382                            guint       property_id,
383                            GParamSpec *pspec)
384 {
385   if (g_param_spec_pool_lookup (pspec_pool, pspec->name, g_type, FALSE))
386     {
387       g_warning ("When installing property: type `%s' already has a property named `%s'",
388                  g_type_name (g_type),
389                  pspec->name);
390       return;
391     }
392
393   g_param_spec_ref (pspec);
394   g_param_spec_sink (pspec);
395   PARAM_SPEC_SET_PARAM_ID (pspec, property_id);
396   g_param_spec_pool_insert (pspec_pool, pspec, g_type);
397 }
398
399 /**
400  * g_object_class_install_property:
401  * @oclass: a #GObjectClass
402  * @property_id: the id for the new property
403  * @pspec: the #GParamSpec for the new property
404  *
405  * Installs a new property. This is usually done in the class initializer.
406  */
407 void
408 g_object_class_install_property (GObjectClass *class,
409                                  guint         property_id,
410                                  GParamSpec   *pspec)
411 {
412   g_return_if_fail (G_IS_OBJECT_CLASS (class));
413   g_return_if_fail (G_IS_PARAM_SPEC (pspec));
414   if (pspec->flags & G_PARAM_WRITABLE)
415     g_return_if_fail (class->set_property != NULL);
416   if (pspec->flags & G_PARAM_READABLE)
417     g_return_if_fail (class->get_property != NULL);
418   g_return_if_fail (property_id > 0);
419   g_return_if_fail (PARAM_SPEC_PARAM_ID (pspec) == 0);  /* paranoid */
420   if (pspec->flags & G_PARAM_CONSTRUCT)
421     g_return_if_fail ((pspec->flags & G_PARAM_CONSTRUCT_ONLY) == 0);
422   if (pspec->flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY))
423     g_return_if_fail (pspec->flags & G_PARAM_WRITABLE);
424
425   install_property_internal (G_OBJECT_CLASS_TYPE (class), property_id, pspec);
426
427   if (pspec->flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY))
428     class->construct_properties = g_slist_prepend (class->construct_properties, pspec);
429
430   /* for property overrides of construct poperties, we have to get rid
431    * of the overidden inherited construct property
432    */
433   pspec = g_param_spec_pool_lookup (pspec_pool, pspec->name, g_type_parent (G_OBJECT_CLASS_TYPE (class)), TRUE);
434   if (pspec && pspec->flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY))
435     class->construct_properties = g_slist_remove (class->construct_properties, pspec);
436 }
437
438 /**
439  * g_object_interface_install_property:
440  * @g_iface: any interface vtable for the interface, or the default
441  *  vtable for the interface.
442  * @pspec: the #GParamSpec for the new property
443  *
444  * Add a property to an interface; this is only useful for interfaces
445  * that are added to GObject-derived types. Adding a property to an
446  * interface forces all objects classes with that interface to have a
447  * compatible property. The compatible property could be a newly
448  * created #GParamSpec, but normally
449  * g_object_class_override_property() will be used so that the object
450  * class only needs to provide an implementation and inherits the
451  * property description, default value, bounds, and so forth from the
452  * interface property.
453  *
454  * This function is meant to be called from the interface's default
455  * vtable initialization function (the @class_init member of
456  * #GTypeInfo.) It must not be called after after @class_init has
457  * been called for any object types implementing this interface.
458  *
459  * Since: 2.4
460  */
461 void
462 g_object_interface_install_property (gpointer      g_iface,
463                                      GParamSpec   *pspec)
464 {
465   GTypeInterface *iface_class = g_iface;
466         
467   g_return_if_fail (G_TYPE_IS_INTERFACE (iface_class->g_type));
468   g_return_if_fail (G_IS_PARAM_SPEC (pspec));
469   g_return_if_fail (!G_IS_PARAM_SPEC_OVERRIDE (pspec)); /* paranoid */
470   g_return_if_fail (PARAM_SPEC_PARAM_ID (pspec) == 0);  /* paranoid */
471                     
472   install_property_internal (iface_class->g_type, 0, pspec);
473 }
474
475 /**
476  * g_object_class_find_property:
477  * @oclass: a #GObjectClass
478  * @property_name: the name of the property to look up
479  *
480  * Looks up the #GParamSpec for a property of a class.
481  *
482  * Returns: the #GParamSpec for the property, or %NULL if the class
483  *          doesn't have a property of that name
484  */
485 GParamSpec*
486 g_object_class_find_property (GObjectClass *class,
487                               const gchar  *property_name)
488 {
489   GParamSpec *pspec;
490   GParamSpec *redirect;
491         
492   g_return_val_if_fail (G_IS_OBJECT_CLASS (class), NULL);
493   g_return_val_if_fail (property_name != NULL, NULL);
494   
495   pspec = g_param_spec_pool_lookup (pspec_pool,
496                                     property_name,
497                                     G_OBJECT_CLASS_TYPE (class),
498                                     TRUE);
499   if (pspec)
500     {
501       redirect = g_param_spec_get_redirect_target (pspec);
502       if (redirect)
503         return redirect;
504       else
505         return pspec;
506     }
507   else
508     return NULL;
509 }
510
511 /**
512  * g_object_interface_find_property:
513  * @g_iface: any interface vtable for the interface, or the default
514  *  vtable for the interface
515  * @property_name: name of a property to lookup.
516  *
517  * Find the #GParamSpec with the given name for an
518  * interface. Generally, the interface vtable passed in as @g_iface
519  * will be the default vtable from g_type_default_interface_ref(), or,
520  * if you know the interface has already been loaded,
521  * g_type_default_interface_peek().
522  *
523  * Since: 2.4
524  *
525  * Returns: the #GParamSpec for the property of the interface with the
526  *          name @property_name, or %NULL if no such property exists.
527  */
528 GParamSpec*
529 g_object_interface_find_property (gpointer      g_iface,
530                                   const gchar  *property_name)
531 {
532   GTypeInterface *iface_class = g_iface;
533         
534   g_return_val_if_fail (G_TYPE_IS_INTERFACE (iface_class->g_type), NULL);
535   g_return_val_if_fail (property_name != NULL, NULL);
536   
537   return g_param_spec_pool_lookup (pspec_pool,
538                                    property_name,
539                                    iface_class->g_type,
540                                    FALSE);
541 }
542
543 /**
544  * g_object_class_override_property:
545  * @oclass: a #GObjectClass
546  * @property_id: the new property ID
547  * @name: the name of a property registered in a parent class or
548  *  in an interface of this class.
549  *
550  * Registers @property_id as referring to a property with the
551  * name @name in a parent class or in an interface implemented
552  * by @oclass. This allows this class to <firstterm>override</firstterm>
553  * a property implementation in a parent class or to provide
554  * the implementation of a property from an interface.
555  *
556  * <note>
557  * Internally, overriding is implemented by creating a property of type
558  * #GParamSpecOverride; generally operations that query the properties of
559  * the object class, such as g_object_class_find_property() or
560  * g_object_class_list_properties() will return the overridden
561  * property. However, in one case, the @construct_properties argument of
562  * the @constructor virtual function, the #GParamSpecOverride is passed
563  * instead, so that the @param_id field of the #GParamSpec will be
564  * correct.  For virtually all uses, this makes no difference. If you
565  * need to get the overridden property, you can call
566  * g_param_spec_get_redirect_target().
567  * </note>
568  *
569  * Since: 2.4
570  */
571 void
572 g_object_class_override_property (GObjectClass *oclass,
573                                   guint         property_id,
574                                   const gchar  *name)
575 {
576   GParamSpec *overridden = NULL;
577   GParamSpec *new;
578   GType parent_type;
579   
580   g_return_if_fail (G_IS_OBJECT_CLASS (oclass));
581   g_return_if_fail (property_id > 0);
582   g_return_if_fail (name != NULL);
583
584   /* Find the overridden property; first check parent types
585    */
586   parent_type = g_type_parent (G_OBJECT_CLASS_TYPE (oclass));
587   if (parent_type != G_TYPE_NONE)
588     overridden = g_param_spec_pool_lookup (pspec_pool,
589                                            name,
590                                            parent_type,
591                                            TRUE);
592   if (!overridden)
593     {
594       GType *ifaces;
595       guint n_ifaces;
596       
597       /* Now check interfaces
598        */
599       ifaces = g_type_interfaces (G_OBJECT_CLASS_TYPE (oclass), &n_ifaces);
600       while (n_ifaces-- && !overridden)
601         {
602           overridden = g_param_spec_pool_lookup (pspec_pool,
603                                                  name,
604                                                  ifaces[n_ifaces],
605                                                  FALSE);
606         }
607       
608       g_free (ifaces);
609     }
610
611   if (!overridden)
612     {
613       g_warning ("%s: Can't find property to override for '%s::%s'",
614                  G_STRFUNC, G_OBJECT_CLASS_NAME (oclass), name);
615       return;
616     }
617
618   new = g_param_spec_override (name, overridden);
619   g_object_class_install_property (oclass, property_id, new);
620 }
621
622 /**
623  * g_object_class_list_properties:
624  * @oclass: a #GObjectClass
625  * @n_properties: return location for the length of the returned array
626  *
627  * Get an array of #GParamSpec* for all properties of a class.
628  *
629  * Returns: an array of #GParamSpec* which should be freed after use
630  */
631 GParamSpec** /* free result */
632 g_object_class_list_properties (GObjectClass *class,
633                                 guint        *n_properties_p)
634 {
635   GParamSpec **pspecs;
636   guint n;
637
638   g_return_val_if_fail (G_IS_OBJECT_CLASS (class), NULL);
639
640   pspecs = g_param_spec_pool_list (pspec_pool,
641                                    G_OBJECT_CLASS_TYPE (class),
642                                    &n);
643   if (n_properties_p)
644     *n_properties_p = n;
645
646   return pspecs;
647 }
648
649 /**
650  * g_object_interface_list_properties:
651  * @g_iface: any interface vtable for the interface, or the default
652  *  vtable for the interface
653  * @n_properties_p: location to store number of properties returned.
654  *
655  * Lists the properties of an interface.Generally, the interface
656  * vtable passed in as @g_iface will be the default vtable from
657  * g_type_default_interface_ref(), or, if you know the interface has
658  * already been loaded, g_type_default_interface_peek().
659  *
660  * Since: 2.4
661  *
662  * Returns: a pointer to an array of pointers to #GParamSpec
663  *          structures. The paramspecs are owned by GLib, but the
664  *          array should be freed with g_free() when you are done with
665  *          it.
666  */
667 GParamSpec**
668 g_object_interface_list_properties (gpointer      g_iface,
669                                     guint        *n_properties_p)
670 {
671   GTypeInterface *iface_class = g_iface;
672   GParamSpec **pspecs;
673   guint n;
674
675   g_return_val_if_fail (G_TYPE_IS_INTERFACE (iface_class->g_type), NULL);
676
677   pspecs = g_param_spec_pool_list (pspec_pool,
678                                    iface_class->g_type,
679                                    &n);
680   if (n_properties_p)
681     *n_properties_p = n;
682
683   return pspecs;
684 }
685
686 static void
687 g_object_init (GObject *object)
688 {
689   object->ref_count = 1;
690   g_datalist_init (&object->qdata);
691   
692   /* freeze object's notification queue, g_object_newv() preserves pairedness */
693   g_object_notify_queue_freeze (object, &property_notify_context);
694   /* enter construction list for notify_queue_thaw() and to allow construct-only properties */
695   G_LOCK (construction_mutex);
696   construction_objects = g_slist_prepend (construction_objects, object);
697   G_UNLOCK (construction_mutex);
698
699 #ifdef  G_ENABLE_DEBUG
700   IF_DEBUG (OBJECTS)
701     {
702       G_LOCK (debug_objects);
703       debug_objects_count++;
704       g_hash_table_insert (debug_objects_ht, object, object);
705       G_UNLOCK (debug_objects);
706     }
707 #endif  /* G_ENABLE_DEBUG */
708 }
709
710 static void
711 g_object_do_set_property (GObject      *object,
712                           guint         property_id,
713                           const GValue *value,
714                           GParamSpec   *pspec)
715 {
716   switch (property_id)
717     {
718     default:
719       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
720       break;
721     }
722 }
723
724 static void
725 g_object_do_get_property (GObject     *object,
726                           guint        property_id,
727                           GValue      *value,
728                           GParamSpec  *pspec)
729 {
730   switch (property_id)
731     {
732     default:
733       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
734       break;
735     }
736 }
737
738 static void
739 g_object_real_dispose (GObject *object)
740 {
741   g_signal_handlers_destroy (object);
742   g_datalist_id_set_data (&object->qdata, quark_closure_array, NULL);
743   g_datalist_id_set_data (&object->qdata, quark_weak_refs, NULL);
744 }
745
746 static void
747 g_object_finalize (GObject *object)
748 {
749   g_datalist_clear (&object->qdata);
750   
751 #ifdef  G_ENABLE_DEBUG
752   IF_DEBUG (OBJECTS)
753     {
754       G_LOCK (debug_objects);
755       g_assert (g_hash_table_lookup (debug_objects_ht, object) == object);
756       g_hash_table_remove (debug_objects_ht, object);
757       debug_objects_count--;
758       G_UNLOCK (debug_objects);
759     }
760 #endif  /* G_ENABLE_DEBUG */
761 }
762
763
764 static void
765 g_object_dispatch_properties_changed (GObject     *object,
766                                       guint        n_pspecs,
767                                       GParamSpec **pspecs)
768 {
769   guint i;
770
771   for (i = 0; i < n_pspecs; i++)
772     g_signal_emit (object, gobject_signals[NOTIFY], g_quark_from_string (pspecs[i]->name), pspecs[i]);
773 }
774
775 /**
776  * g_object_run_dispose:
777  * @object: a #GObject
778  *
779  * Releases all references to other objects. This can be used to break
780  * reference cycles.
781  *
782  * This functions should only be called from object system implementations.
783  */
784 void
785 g_object_run_dispose (GObject *object)
786 {
787   g_return_if_fail (G_IS_OBJECT (object));
788   g_return_if_fail (object->ref_count > 0);
789
790   g_object_ref (object);
791   G_OBJECT_GET_CLASS (object)->dispose (object);
792   g_object_unref (object);
793 }
794
795 /**
796  * g_object_freeze_notify:
797  * @object: a #GObject
798  *
799  * Stops emission of "notify" signals on @object. The signals are
800  * queued until g_object_thaw_notify() is called on @object.
801  *
802  * This is necessary for accessors that modify multiple properties to prevent
803  * premature notification while the object is still being modified.
804  */
805 void
806 g_object_freeze_notify (GObject *object)
807 {
808   g_return_if_fail (G_IS_OBJECT (object));
809
810   if (g_atomic_int_get (&object->ref_count) == 0)
811     return;
812
813   g_object_ref (object);
814   g_object_notify_queue_freeze (object, &property_notify_context);
815   g_object_unref (object);
816 }
817
818 /**
819  * g_object_notify:
820  * @object: a #GObject
821  * @property_name: the name of a property installed on the class of @object.
822  *
823  * Emits a "notify" signal for the property @property_name on @object.
824  */
825 void
826 g_object_notify (GObject     *object,
827                  const gchar *property_name)
828 {
829   GParamSpec *pspec;
830   
831   g_return_if_fail (G_IS_OBJECT (object));
832   g_return_if_fail (property_name != NULL);
833   if (g_atomic_int_get (&object->ref_count) == 0)
834     return;
835   
836   g_object_ref (object);
837   /* We don't need to get the redirect target
838    * (by, e.g. calling g_object_class_find_property())
839    * because g_object_notify_queue_add() does that
840    */
841   pspec = g_param_spec_pool_lookup (pspec_pool,
842                                     property_name,
843                                     G_OBJECT_TYPE (object),
844                                     TRUE);
845
846   if (!pspec)
847     g_warning ("%s: object class `%s' has no property named `%s'",
848                G_STRFUNC,
849                G_OBJECT_TYPE_NAME (object),
850                property_name);
851   else
852     {
853       GObjectNotifyQueue *nqueue;
854       
855       nqueue = g_object_notify_queue_freeze (object, &property_notify_context);
856       g_object_notify_queue_add (object, nqueue, pspec);
857       g_object_notify_queue_thaw (object, nqueue);
858     }
859   g_object_unref (object);
860 }
861
862 /**
863  * g_object_thaw_notify:
864  * @object: a #GObject
865  *
866  * Reverts the effect of a previous call to g_object_freeze_notify().
867  * This causes all queued "notify" signals on @object to be emitted.
868  */
869 void
870 g_object_thaw_notify (GObject *object)
871 {
872   GObjectNotifyQueue *nqueue;
873   
874   g_return_if_fail (G_IS_OBJECT (object));
875   if (g_atomic_int_get (&object->ref_count) == 0)
876     return;
877   
878   g_object_ref (object);
879   nqueue = g_object_notify_queue_from_object (object, &property_notify_context);
880   if (!nqueue || !nqueue->freeze_count)
881     g_warning ("%s: property-changed notification for %s(%p) is not frozen",
882                G_STRFUNC, G_OBJECT_TYPE_NAME (object), object);
883   else
884     g_object_notify_queue_thaw (object, nqueue);
885   g_object_unref (object);
886 }
887
888 static inline void
889 object_get_property (GObject     *object,
890                      GParamSpec  *pspec,
891                      GValue      *value)
892 {
893   GObjectClass *class = g_type_class_peek (pspec->owner_type);
894   guint param_id = PARAM_SPEC_PARAM_ID (pspec);
895   GParamSpec *redirect;
896
897   redirect = g_param_spec_get_redirect_target (pspec);
898   if (redirect)
899     pspec = redirect;    
900   
901   class->get_property (object, param_id, value, pspec);
902 }
903
904 static inline void
905 object_set_property (GObject             *object,
906                      GParamSpec          *pspec,
907                      const GValue        *value,
908                      GObjectNotifyQueue  *nqueue)
909 {
910   GValue tmp_value = { 0, };
911   GObjectClass *class = g_type_class_peek (pspec->owner_type);
912   guint param_id = PARAM_SPEC_PARAM_ID (pspec);
913   GParamSpec *redirect;
914
915   redirect = g_param_spec_get_redirect_target (pspec);
916   if (redirect)
917     pspec = redirect;
918
919   /* provide a copy to work from, convert (if necessary) and validate */
920   g_value_init (&tmp_value, G_PARAM_SPEC_VALUE_TYPE (pspec));
921   if (!g_value_transform (value, &tmp_value))
922     g_warning ("unable to set property `%s' of type `%s' from value of type `%s'",
923                pspec->name,
924                g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec)),
925                G_VALUE_TYPE_NAME (value));
926   else if (g_param_value_validate (pspec, &tmp_value) && !(pspec->flags & G_PARAM_LAX_VALIDATION))
927     {
928       gchar *contents = g_strdup_value_contents (value);
929
930       g_warning ("value \"%s\" of type `%s' is invalid or out of range for property `%s' of type `%s'",
931                  contents,
932                  G_VALUE_TYPE_NAME (value),
933                  pspec->name,
934                  g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec)));
935       g_free (contents);
936     }
937   else
938     {
939       class->set_property (object, param_id, &tmp_value, pspec);
940       g_object_notify_queue_add (object, nqueue, pspec);
941     }
942   g_value_unset (&tmp_value);
943 }
944
945 static void
946 object_interface_check_properties (gpointer func_data,
947                                    gpointer g_iface)
948 {
949   GTypeInterface *iface_class = g_iface;
950   GObjectClass *class = g_type_class_peek (iface_class->g_instance_type);
951   GType iface_type = iface_class->g_type;
952   GParamSpec **pspecs;
953   guint n;
954
955   if (!G_IS_OBJECT_CLASS (class))
956     return;
957
958   pspecs = g_param_spec_pool_list (pspec_pool, iface_type, &n);
959
960   while (n--)
961     {
962       GParamSpec *class_pspec = g_param_spec_pool_lookup (pspec_pool,
963                                                           pspecs[n]->name,
964                                                           G_OBJECT_CLASS_TYPE (class),
965                                                           TRUE);
966       
967       if (!class_pspec)
968         {
969           g_critical ("Object class %s doesn't implement property "
970                       "'%s' from interface '%s'",
971                       g_type_name (G_OBJECT_CLASS_TYPE (class)),
972                       pspecs[n]->name,
973                       g_type_name (iface_type));
974
975           continue;
976         }
977
978       /* The implementation paramspec must have a less restrictive
979        * type than the interface parameter spec for set() and a
980        * more restrictive type for get(). We just require equality,
981        * rather than doing something more complicated checking
982        * the READABLE and WRITABLE flags. We also simplify here
983        * by only checking the value type, not the G_PARAM_SPEC_TYPE.
984        */
985       if (class_pspec &&
986           !g_type_is_a (G_PARAM_SPEC_VALUE_TYPE (pspecs[n]),
987                         G_PARAM_SPEC_VALUE_TYPE (class_pspec)))
988         {
989           g_critical ("Property '%s' on class '%s' has type '%s' "
990                       "which is different from the type '%s', "
991                       "of the property on interface '%s'\n",
992                       pspecs[n]->name,
993                       g_type_name (G_OBJECT_CLASS_TYPE (class)),
994                       g_type_name (G_PARAM_SPEC_VALUE_TYPE (class_pspec)),
995                       g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspecs[n])),
996                       g_type_name (iface_type));
997         }
998       
999 #define SUBSET(a,b,mask) (((a) & ~(b) & (mask)) == 0)
1000       
1001       /* CONSTRUCT and CONSTRUCT_ONLY add restrictions.
1002        * READABLE and WRITABLE remove restrictions. The implementation
1003        * paramspec must have less restrictive flags.
1004        */
1005       if (class_pspec &&
1006           (!SUBSET (class_pspec->flags,
1007                     pspecs[n]->flags,
1008                     G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY) ||
1009            !SUBSET (pspecs[n]->flags,
1010                     class_pspec->flags,
1011                     G_PARAM_READABLE | G_PARAM_WRITABLE)))
1012         {
1013           g_critical ("Flags for property '%s' on class '%s' "
1014                       "are not compatible with the property on"
1015                       "interface '%s'\n",
1016                       pspecs[n]->name,
1017                       g_type_name (G_OBJECT_CLASS_TYPE (class)),
1018                       g_type_name (iface_type));
1019         }
1020 #undef SUBSET     
1021     }
1022   
1023   g_free (pspecs);
1024 }
1025
1026 /**
1027  * g_object_new:
1028  * @object_type: the type id of the #GObject subtype to instantiate
1029  * @first_property_name: the name of the first property
1030  * @...: the value of the first property, followed optionally by more
1031  *  name/value pairs, followed by %NULL
1032  *
1033  * Creates a new instance of a #GObject subtype and sets its properties.
1034  *
1035  * Construction parameters (see #G_PARAM_CONSTRUCT, #G_PARAM_CONSTRUCT_ONLY)
1036  * which are not explicitly specified are set to their default values.
1037  *
1038  * Returns: a new instance of @object_type
1039  */
1040 gpointer
1041 g_object_new (GType        object_type,
1042               const gchar *first_property_name,
1043               ...)
1044 {
1045   GObject *object;
1046   va_list var_args;
1047   
1048   g_return_val_if_fail (G_TYPE_IS_OBJECT (object_type), NULL);
1049   
1050   va_start (var_args, first_property_name);
1051   object = g_object_new_valist (object_type, first_property_name, var_args);
1052   va_end (var_args);
1053   
1054   return object;
1055 }
1056
1057 static gboolean
1058 slist_maybe_remove (GSList       **slist,
1059                     gconstpointer  data)
1060 {
1061   GSList *last = NULL, *node = *slist;
1062   while (node)
1063     {
1064       if (node->data == data)
1065         {
1066           if (last)
1067             last->next = node->next;
1068           else
1069             *slist = node->next;
1070           g_slist_free_1 (node);
1071           return TRUE;
1072         }
1073       last = node;
1074       node = last->next;
1075     }
1076   return FALSE;
1077 }
1078
1079 static inline gboolean
1080 object_in_construction_list (GObject *object)
1081 {
1082   gboolean in_construction;
1083   G_LOCK (construction_mutex);
1084   in_construction = g_slist_find (construction_objects, object) != NULL;
1085   G_UNLOCK (construction_mutex);
1086   return in_construction;
1087 }
1088
1089 /**
1090  * g_object_newv:
1091  * @object_type: the type id of the #GObject subtype to instantiate
1092  * @n_parameters: the length of the @parameters array
1093  * @parameters: an array of #GParameter
1094  *
1095  * Creates a new instance of a #GObject subtype and sets its properties.
1096  *
1097  * Construction parameters (see #G_PARAM_CONSTRUCT, #G_PARAM_CONSTRUCT_ONLY)
1098  * which are not explicitly specified are set to their default values.
1099  *
1100  * Returns: a new instance of @object_type
1101  */
1102 gpointer
1103 g_object_newv (GType       object_type,
1104                guint       n_parameters,
1105                GParameter *parameters)
1106 {
1107   GObjectConstructParam *cparams, *oparams;
1108   GObjectNotifyQueue *nqueue = NULL; /* shouldn't be initialized, just to silence compiler */
1109   GObject *object;
1110   GObjectClass *class, *unref_class = NULL;
1111   GSList *slist;
1112   guint n_total_cparams = 0, n_cparams = 0, n_oparams = 0, n_cvalues;
1113   GValue *cvalues;
1114   GList *clist = NULL;
1115   gboolean newly_constructed;
1116   guint i;
1117
1118   g_return_val_if_fail (G_TYPE_IS_OBJECT (object_type), NULL);
1119
1120   class = g_type_class_peek_static (object_type);
1121   if (!class)
1122     class = unref_class = g_type_class_ref (object_type);
1123   for (slist = class->construct_properties; slist; slist = slist->next)
1124     {
1125       clist = g_list_prepend (clist, slist->data);
1126       n_total_cparams += 1;
1127     }
1128
1129   /* collect parameters, sort into construction and normal ones */
1130   oparams = g_new (GObjectConstructParam, n_parameters);
1131   cparams = g_new (GObjectConstructParam, n_total_cparams);
1132   for (i = 0; i < n_parameters; i++)
1133     {
1134       GValue *value = &parameters[i].value;
1135       GParamSpec *pspec = g_param_spec_pool_lookup (pspec_pool,
1136                                                     parameters[i].name,
1137                                                     object_type,
1138                                                     TRUE);
1139       if (!pspec)
1140         {
1141           g_warning ("%s: object class `%s' has no property named `%s'",
1142                      G_STRFUNC,
1143                      g_type_name (object_type),
1144                      parameters[i].name);
1145           continue;
1146         }
1147       if (!(pspec->flags & G_PARAM_WRITABLE))
1148         {
1149           g_warning ("%s: property `%s' of object class `%s' is not writable",
1150                      G_STRFUNC,
1151                      pspec->name,
1152                      g_type_name (object_type));
1153           continue;
1154         }
1155       if (pspec->flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY))
1156         {
1157           GList *list = g_list_find (clist, pspec);
1158
1159           if (!list)
1160             {
1161               g_warning ("%s: construct property \"%s\" for object `%s' can't be set twice",
1162                          G_STRFUNC, pspec->name, g_type_name (object_type));
1163               continue;
1164             }
1165           cparams[n_cparams].pspec = pspec;
1166           cparams[n_cparams].value = value;
1167           n_cparams++;
1168           if (!list->prev)
1169             clist = list->next;
1170           else
1171             list->prev->next = list->next;
1172           if (list->next)
1173             list->next->prev = list->prev;
1174           g_list_free_1 (list);
1175         }
1176       else
1177         {
1178           oparams[n_oparams].pspec = pspec;
1179           oparams[n_oparams].value = value;
1180           n_oparams++;
1181         }
1182     }
1183
1184   /* set remaining construction properties to default values */
1185   n_cvalues = n_total_cparams - n_cparams;
1186   cvalues = g_new (GValue, n_cvalues);
1187   while (clist)
1188     {
1189       GList *tmp = clist->next;
1190       GParamSpec *pspec = clist->data;
1191       GValue *value = cvalues + n_total_cparams - n_cparams - 1;
1192
1193       value->g_type = 0;
1194       g_value_init (value, G_PARAM_SPEC_VALUE_TYPE (pspec));
1195       g_param_value_set_default (pspec, value);
1196
1197       cparams[n_cparams].pspec = pspec;
1198       cparams[n_cparams].value = value;
1199       n_cparams++;
1200
1201       g_list_free_1 (clist);
1202       clist = tmp;
1203     }
1204
1205   /* construct object from construction parameters */
1206   object = class->constructor (object_type, n_total_cparams, cparams);
1207   /* free construction values */
1208   g_free (cparams);
1209   while (n_cvalues--)
1210     g_value_unset (cvalues + n_cvalues);
1211   g_free (cvalues);
1212
1213   /* adjust freeze_count according to g_object_init() and remaining properties */
1214   G_LOCK (construction_mutex);
1215   newly_constructed = slist_maybe_remove (&construction_objects, object);
1216   G_UNLOCK (construction_mutex);
1217   if (newly_constructed || n_oparams)
1218     nqueue = g_object_notify_queue_freeze (object, &property_notify_context);
1219   if (newly_constructed)
1220     g_object_notify_queue_thaw (object, nqueue);
1221
1222   /* run 'constructed' handler if there is one */
1223   if (newly_constructed && class->constructed)
1224     class->constructed (object);
1225
1226   /* set remaining properties */
1227   for (i = 0; i < n_oparams; i++)
1228     object_set_property (object, oparams[i].pspec, oparams[i].value, nqueue);
1229   g_free (oparams);
1230
1231   /* release our own freeze count and handle notifications */
1232   if (newly_constructed || n_oparams)
1233     g_object_notify_queue_thaw (object, nqueue);
1234
1235   if (unref_class)
1236     g_type_class_unref (unref_class);
1237
1238   return object;
1239 }
1240
1241 /**
1242  * g_object_new_valist:
1243  * @object_type: the type id of the #GObject subtype to instantiate
1244  * @first_property_name: the name of the first property
1245  * @var_args: the value of the first property, followed optionally by more
1246  *  name/value pairs, followed by %NULL
1247  *
1248  * Creates a new instance of a #GObject subtype and sets its properties.
1249  *
1250  * Construction parameters (see #G_PARAM_CONSTRUCT, #G_PARAM_CONSTRUCT_ONLY)
1251  * which are not explicitly specified are set to their default values.
1252  *
1253  * Returns: a new instance of @object_type
1254  */
1255 GObject*
1256 g_object_new_valist (GType        object_type,
1257                      const gchar *first_property_name,
1258                      va_list      var_args)
1259 {
1260   GObjectClass *class;
1261   GParameter *params;
1262   const gchar *name;
1263   GObject *object;
1264   guint n_params = 0, n_alloced_params = 16;
1265   
1266   g_return_val_if_fail (G_TYPE_IS_OBJECT (object_type), NULL);
1267
1268   if (!first_property_name)
1269     return g_object_newv (object_type, 0, NULL);
1270
1271   class = g_type_class_ref (object_type);
1272
1273   params = g_new (GParameter, n_alloced_params);
1274   name = first_property_name;
1275   while (name)
1276     {
1277       gchar *error = NULL;
1278       GParamSpec *pspec = g_param_spec_pool_lookup (pspec_pool,
1279                                                     name,
1280                                                     object_type,
1281                                                     TRUE);
1282       if (!pspec)
1283         {
1284           g_warning ("%s: object class `%s' has no property named `%s'",
1285                      G_STRFUNC,
1286                      g_type_name (object_type),
1287                      name);
1288           break;
1289         }
1290       if (n_params >= n_alloced_params)
1291         {
1292           n_alloced_params += 16;
1293           params = g_renew (GParameter, params, n_alloced_params);
1294         }
1295       params[n_params].name = name;
1296       params[n_params].value.g_type = 0;
1297       g_value_init (&params[n_params].value, G_PARAM_SPEC_VALUE_TYPE (pspec));
1298       G_VALUE_COLLECT (&params[n_params].value, var_args, 0, &error);
1299       if (error)
1300         {
1301           g_warning ("%s: %s", G_STRFUNC, error);
1302           g_free (error);
1303           g_value_unset (&params[n_params].value);
1304           break;
1305         }
1306       n_params++;
1307       name = va_arg (var_args, gchar*);
1308     }
1309
1310   object = g_object_newv (object_type, n_params, params);
1311
1312   while (n_params--)
1313     g_value_unset (&params[n_params].value);
1314   g_free (params);
1315
1316   g_type_class_unref (class);
1317
1318   return object;
1319 }
1320
1321 static GObject*
1322 g_object_constructor (GType                  type,
1323                       guint                  n_construct_properties,
1324                       GObjectConstructParam *construct_params)
1325 {
1326   GObject *object;
1327
1328   /* create object */
1329   object = (GObject*) g_type_create_instance (type);
1330   
1331   /* set construction parameters */
1332   if (n_construct_properties)
1333     {
1334       GObjectNotifyQueue *nqueue = g_object_notify_queue_freeze (object, &property_notify_context);
1335       
1336       /* set construct properties */
1337       while (n_construct_properties--)
1338         {
1339           GValue *value = construct_params->value;
1340           GParamSpec *pspec = construct_params->pspec;
1341
1342           construct_params++;
1343           object_set_property (object, pspec, value, nqueue);
1344         }
1345       g_object_notify_queue_thaw (object, nqueue);
1346       /* the notification queue is still frozen from g_object_init(), so
1347        * we don't need to handle it here, g_object_newv() takes
1348        * care of that
1349        */
1350     }
1351
1352   return object;
1353 }
1354
1355 /**
1356  * g_object_set_valist:
1357  * @object: a #GObject
1358  * @first_property_name: name of the first property to set
1359  * @var_args: value for the first property, followed optionally by more
1360  *  name/value pairs, followed by %NULL
1361  *
1362  * Sets properties on an object.
1363  */
1364 void
1365 g_object_set_valist (GObject     *object,
1366                      const gchar *first_property_name,
1367                      va_list      var_args)
1368 {
1369   GObjectNotifyQueue *nqueue;
1370   const gchar *name;
1371   
1372   g_return_if_fail (G_IS_OBJECT (object));
1373   
1374   g_object_ref (object);
1375   nqueue = g_object_notify_queue_freeze (object, &property_notify_context);
1376   
1377   name = first_property_name;
1378   while (name)
1379     {
1380       GValue value = { 0, };
1381       GParamSpec *pspec;
1382       gchar *error = NULL;
1383       
1384       pspec = g_param_spec_pool_lookup (pspec_pool,
1385                                         name,
1386                                         G_OBJECT_TYPE (object),
1387                                         TRUE);
1388       if (!pspec)
1389         {
1390           g_warning ("%s: object class `%s' has no property named `%s'",
1391                      G_STRFUNC,
1392                      G_OBJECT_TYPE_NAME (object),
1393                      name);
1394           break;
1395         }
1396       if (!(pspec->flags & G_PARAM_WRITABLE))
1397         {
1398           g_warning ("%s: property `%s' of object class `%s' is not writable",
1399                      G_STRFUNC,
1400                      pspec->name,
1401                      G_OBJECT_TYPE_NAME (object));
1402           break;
1403         }
1404       if ((pspec->flags & G_PARAM_CONSTRUCT_ONLY) && !object_in_construction_list (object))
1405         {
1406           g_warning ("%s: construct property \"%s\" for object `%s' can't be set after construction",
1407                      G_STRFUNC, pspec->name, G_OBJECT_TYPE_NAME (object));
1408           break;
1409         }
1410
1411       g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec));
1412       
1413       G_VALUE_COLLECT (&value, var_args, 0, &error);
1414       if (error)
1415         {
1416           g_warning ("%s: %s", G_STRFUNC, error);
1417           g_free (error);
1418           g_value_unset (&value);
1419           break;
1420         }
1421       
1422       object_set_property (object, pspec, &value, nqueue);
1423       g_value_unset (&value);
1424       
1425       name = va_arg (var_args, gchar*);
1426     }
1427
1428   g_object_notify_queue_thaw (object, nqueue);
1429   g_object_unref (object);
1430 }
1431
1432 /**
1433  * g_object_get_valist:
1434  * @object: a #GObject
1435  * @first_property_name: name of the first property to get
1436  * @var_args: return location for the first property, followed optionally by more
1437  *  name/return location pairs, followed by %NULL
1438  *
1439  * Gets properties of an object.
1440  *
1441  * In general, a copy is made of the property contents and the caller
1442  * is responsible for freeing the memory in the appropriate manner for
1443  * the type, for instance by calling g_free() or g_object_unref().
1444  *
1445  * See g_object_get().
1446  */
1447 void
1448 g_object_get_valist (GObject     *object,
1449                      const gchar *first_property_name,
1450                      va_list      var_args)
1451 {
1452   const gchar *name;
1453   
1454   g_return_if_fail (G_IS_OBJECT (object));
1455   
1456   g_object_ref (object);
1457   
1458   name = first_property_name;
1459   
1460   while (name)
1461     {
1462       GValue value = { 0, };
1463       GParamSpec *pspec;
1464       gchar *error;
1465       
1466       pspec = g_param_spec_pool_lookup (pspec_pool,
1467                                         name,
1468                                         G_OBJECT_TYPE (object),
1469                                         TRUE);
1470       if (!pspec)
1471         {
1472           g_warning ("%s: object class `%s' has no property named `%s'",
1473                      G_STRFUNC,
1474                      G_OBJECT_TYPE_NAME (object),
1475                      name);
1476           break;
1477         }
1478       if (!(pspec->flags & G_PARAM_READABLE))
1479         {
1480           g_warning ("%s: property `%s' of object class `%s' is not readable",
1481                      G_STRFUNC,
1482                      pspec->name,
1483                      G_OBJECT_TYPE_NAME (object));
1484           break;
1485         }
1486       
1487       g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec));
1488       
1489       object_get_property (object, pspec, &value);
1490       
1491       G_VALUE_LCOPY (&value, var_args, 0, &error);
1492       if (error)
1493         {
1494           g_warning ("%s: %s", G_STRFUNC, error);
1495           g_free (error);
1496           g_value_unset (&value);
1497           break;
1498         }
1499       
1500       g_value_unset (&value);
1501       
1502       name = va_arg (var_args, gchar*);
1503     }
1504   
1505   g_object_unref (object);
1506 }
1507
1508 /**
1509  * g_object_set:
1510  * @object: a #GObject
1511  * @first_property_name: name of the first property to set
1512  * @...: value for the first property, followed optionally by more
1513  *  name/value pairs, followed by %NULL
1514  *
1515  * Sets properties on an object.
1516  */
1517 void
1518 g_object_set (gpointer     _object,
1519               const gchar *first_property_name,
1520               ...)
1521 {
1522   GObject *object = _object;
1523   va_list var_args;
1524   
1525   g_return_if_fail (G_IS_OBJECT (object));
1526   
1527   va_start (var_args, first_property_name);
1528   g_object_set_valist (object, first_property_name, var_args);
1529   va_end (var_args);
1530 }
1531
1532 /**
1533  * g_object_get:
1534  * @object: a #GObject
1535  * @first_property_name: name of the first property to get
1536  * @...: return location for the first property, followed optionally by more
1537  *  name/return location pairs, followed by %NULL
1538  *
1539  * Gets properties of an object.
1540  *
1541  * In general, a copy is made of the property contents and the caller
1542  * is responsible for freeing the memory in the appropriate manner for
1543  * the type, for instance by calling g_free() or g_object_unref().
1544  *
1545  * <example>
1546  * <title>Using g_object_get(<!-- -->)</title>
1547  * An example of using g_object_get() to get the contents
1548  * of three properties - one of type #G_TYPE_INT,
1549  * one of type #G_TYPE_STRING, and one of type #G_TYPE_OBJECT:
1550  * <programlisting>
1551  *  gint intval;
1552  *  gchar *strval;
1553  *  GObject *objval;
1554  *
1555  *  g_object_get (my_object,
1556  *                "int-property", &intval,
1557  *                "str-property", &strval,
1558  *                "obj-property", &objval,
1559  *                NULL);
1560  *
1561  *  // Do something with intval, strval, objval
1562  *
1563  *  g_free (strval);
1564  *  g_object_unref (objval);
1565  * </programlisting>
1566  * </example>
1567  */
1568 void
1569 g_object_get (gpointer     _object,
1570               const gchar *first_property_name,
1571               ...)
1572 {
1573   GObject *object = _object;
1574   va_list var_args;
1575   
1576   g_return_if_fail (G_IS_OBJECT (object));
1577   
1578   va_start (var_args, first_property_name);
1579   g_object_get_valist (object, first_property_name, var_args);
1580   va_end (var_args);
1581 }
1582
1583 /**
1584  * g_object_set_property:
1585  * @object: a #GObject
1586  * @property_name: the name of the property to set
1587  * @value: the value
1588  *
1589  * Sets a property on an object.
1590  */
1591 void
1592 g_object_set_property (GObject      *object,
1593                        const gchar  *property_name,
1594                        const GValue *value)
1595 {
1596   GObjectNotifyQueue *nqueue;
1597   GParamSpec *pspec;
1598   
1599   g_return_if_fail (G_IS_OBJECT (object));
1600   g_return_if_fail (property_name != NULL);
1601   g_return_if_fail (G_IS_VALUE (value));
1602   
1603   g_object_ref (object);
1604   nqueue = g_object_notify_queue_freeze (object, &property_notify_context);
1605   
1606   pspec = g_param_spec_pool_lookup (pspec_pool,
1607                                     property_name,
1608                                     G_OBJECT_TYPE (object),
1609                                     TRUE);
1610   if (!pspec)
1611     g_warning ("%s: object class `%s' has no property named `%s'",
1612                G_STRFUNC,
1613                G_OBJECT_TYPE_NAME (object),
1614                property_name);
1615   else if (!(pspec->flags & G_PARAM_WRITABLE))
1616     g_warning ("%s: property `%s' of object class `%s' is not writable",
1617                G_STRFUNC,
1618                pspec->name,
1619                G_OBJECT_TYPE_NAME (object));
1620   else if ((pspec->flags & G_PARAM_CONSTRUCT_ONLY) && !object_in_construction_list (object))
1621     g_warning ("%s: construct property \"%s\" for object `%s' can't be set after construction",
1622                G_STRFUNC, pspec->name, G_OBJECT_TYPE_NAME (object));
1623   else
1624     object_set_property (object, pspec, value, nqueue);
1625   
1626   g_object_notify_queue_thaw (object, nqueue);
1627   g_object_unref (object);
1628 }
1629
1630 /**
1631  * g_object_get_property:
1632  * @object: a #GObject
1633  * @property_name: the name of the property to get
1634  * @value: return location for the property value
1635  *
1636  * Gets a property of an object.
1637  *
1638  * In general, a copy is made of the property contents and the caller is
1639  * responsible for freeing the memory by calling g_value_unset().
1640  *
1641  * Note that g_object_get_property() is really intended for language
1642  * bindings, g_object_get() is much more convenient for C programming.
1643  */
1644 void
1645 g_object_get_property (GObject     *object,
1646                        const gchar *property_name,
1647                        GValue      *value)
1648 {
1649   GParamSpec *pspec;
1650   
1651   g_return_if_fail (G_IS_OBJECT (object));
1652   g_return_if_fail (property_name != NULL);
1653   g_return_if_fail (G_IS_VALUE (value));
1654   
1655   g_object_ref (object);
1656   
1657   pspec = g_param_spec_pool_lookup (pspec_pool,
1658                                     property_name,
1659                                     G_OBJECT_TYPE (object),
1660                                     TRUE);
1661   if (!pspec)
1662     g_warning ("%s: object class `%s' has no property named `%s'",
1663                G_STRFUNC,
1664                G_OBJECT_TYPE_NAME (object),
1665                property_name);
1666   else if (!(pspec->flags & G_PARAM_READABLE))
1667     g_warning ("%s: property `%s' of object class `%s' is not readable",
1668                G_STRFUNC,
1669                pspec->name,
1670                G_OBJECT_TYPE_NAME (object));
1671   else
1672     {
1673       GValue *prop_value, tmp_value = { 0, };
1674       
1675       /* auto-conversion of the callers value type
1676        */
1677       if (G_VALUE_TYPE (value) == G_PARAM_SPEC_VALUE_TYPE (pspec))
1678         {
1679           g_value_reset (value);
1680           prop_value = value;
1681         }
1682       else if (!g_value_type_transformable (G_PARAM_SPEC_VALUE_TYPE (pspec), G_VALUE_TYPE (value)))
1683         {
1684           g_warning ("%s: can't retrieve property `%s' of type `%s' as value of type `%s'",
1685                      G_STRFUNC, pspec->name,
1686                      g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec)),
1687                      G_VALUE_TYPE_NAME (value));
1688           g_object_unref (object);
1689           return;
1690         }
1691       else
1692         {
1693           g_value_init (&tmp_value, G_PARAM_SPEC_VALUE_TYPE (pspec));
1694           prop_value = &tmp_value;
1695         }
1696       object_get_property (object, pspec, prop_value);
1697       if (prop_value != value)
1698         {
1699           g_value_transform (prop_value, value);
1700           g_value_unset (&tmp_value);
1701         }
1702     }
1703   
1704   g_object_unref (object);
1705 }
1706
1707 /**
1708  * g_object_connect:
1709  * @object: a #GObject
1710  * @signal_spec: the spec for the first signal
1711  * @...: #GCallback for the first signal, followed by data for the
1712  *       first signal, followed optionally by more signal
1713  *       spec/callback/data triples, followed by %NULL
1714  *
1715  * A convenience function to connect multiple signals at once.
1716  *
1717  * The signal specs expected by this function have the form
1718  * "modifier::signal_name", where modifier can be one of the following:
1719  * <variablelist>
1720  * <varlistentry>
1721  * <term>signal</term>
1722  * <listitem><para>
1723  * equivalent to <literal>g_signal_connect_data (..., NULL, 0)</literal>
1724  * </para></listitem>
1725  * </varlistentry>
1726  * <varlistentry>
1727  * <term>object_signal</term>
1728  * <term>object-signal</term>
1729  * <listitem><para>
1730  * equivalent to <literal>g_signal_connect_object (..., 0)</literal>
1731  * </para></listitem>
1732  * </varlistentry>
1733  * <varlistentry>
1734  * <term>swapped_signal</term>
1735  * <term>swapped-signal</term>
1736  * <listitem><para>
1737  * equivalent to <literal>g_signal_connect_data (..., NULL, G_CONNECT_SWAPPED)</literal>
1738  * </para></listitem>
1739  * </varlistentry>
1740  * <varlistentry>
1741  * <term>swapped_object_signal</term>
1742  * <term>swapped-object-signal</term>
1743  * <listitem><para>
1744  * equivalent to <literal>g_signal_connect_object (..., G_CONNECT_SWAPPED)</literal>
1745  * </para></listitem>
1746  * </varlistentry>
1747  * <varlistentry>
1748  * <term>signal_after</term>
1749  * <term>signal-after</term>
1750  * <listitem><para>
1751  * equivalent to <literal>g_signal_connect_data (..., NULL, G_CONNECT_AFTER)</literal>
1752  * </para></listitem>
1753  * </varlistentry>
1754  * <varlistentry>
1755  * <term>object_signal_after</term>
1756  * <term>object-signal-after</term>
1757  * <listitem><para>
1758  * equivalent to <literal>g_signal_connect_object (..., G_CONNECT_AFTER)</literal>
1759  * </para></listitem>
1760  * </varlistentry>
1761  * <varlistentry>
1762  * <term>swapped_signal_after</term>
1763  * <term>swapped-signal-after</term>
1764  * <listitem><para>
1765  * equivalent to <literal>g_signal_connect_data (..., NULL, G_CONNECT_SWAPPED | G_CONNECT_AFTER)</literal>
1766  * </para></listitem>
1767  * </varlistentry>
1768  * <varlistentry>
1769  * <term>swapped_object_signal_after</term>
1770  * <term>swapped-object-signal-after</term>
1771  * <listitem><para>
1772  * equivalent to <literal>g_signal_connect_object (..., G_CONNECT_SWAPPED | G_CONNECT_AFTER)</literal>
1773  * </para></listitem>
1774  * </varlistentry>
1775  * </variablelist>
1776  *
1777  * |[
1778  *   menu->toplevel = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
1779  *                                                 "type", GTK_WINDOW_POPUP,
1780  *                                                 "child", menu,
1781  *                                                 NULL),
1782  *                                   "signal::event", gtk_menu_window_event, menu,
1783  *                                   "signal::size_request", gtk_menu_window_size_request, menu,
1784  *                                   "signal::destroy", gtk_widget_destroyed, &amp;menu-&gt;toplevel,
1785  *                                   NULL);
1786  * ]|
1787  *
1788  * Returns: @object
1789  */
1790 gpointer
1791 g_object_connect (gpointer     _object,
1792                   const gchar *signal_spec,
1793                   ...)
1794 {
1795   GObject *object = _object;
1796   va_list var_args;
1797
1798   g_return_val_if_fail (G_IS_OBJECT (object), NULL);
1799   g_return_val_if_fail (object->ref_count > 0, object);
1800
1801   va_start (var_args, signal_spec);
1802   while (signal_spec)
1803     {
1804       GCallback callback = va_arg (var_args, GCallback);
1805       gpointer data = va_arg (var_args, gpointer);
1806       gulong sid;
1807
1808       if (strncmp (signal_spec, "signal::", 8) == 0)
1809         sid = g_signal_connect_data (object, signal_spec + 8,
1810                                      callback, data, NULL,
1811                                      0);
1812       else if (strncmp (signal_spec, "object_signal::", 15) == 0 ||
1813                strncmp (signal_spec, "object-signal::", 15) == 0)
1814         sid = g_signal_connect_object (object, signal_spec + 15,
1815                                        callback, data,
1816                                        0);
1817       else if (strncmp (signal_spec, "swapped_signal::", 16) == 0 ||
1818                strncmp (signal_spec, "swapped-signal::", 16) == 0)
1819         sid = g_signal_connect_data (object, signal_spec + 16,
1820                                      callback, data, NULL,
1821                                      G_CONNECT_SWAPPED);
1822       else if (strncmp (signal_spec, "swapped_object_signal::", 23) == 0 ||
1823                strncmp (signal_spec, "swapped-object-signal::", 23) == 0)
1824         sid = g_signal_connect_object (object, signal_spec + 23,
1825                                        callback, data,
1826                                        G_CONNECT_SWAPPED);
1827       else if (strncmp (signal_spec, "signal_after::", 14) == 0 ||
1828                strncmp (signal_spec, "signal-after::", 14) == 0)
1829         sid = g_signal_connect_data (object, signal_spec + 14,
1830                                      callback, data, NULL,
1831                                      G_CONNECT_AFTER);
1832       else if (strncmp (signal_spec, "object_signal_after::", 21) == 0 ||
1833                strncmp (signal_spec, "object-signal-after::", 21) == 0)
1834         sid = g_signal_connect_object (object, signal_spec + 21,
1835                                        callback, data,
1836                                        G_CONNECT_AFTER);
1837       else if (strncmp (signal_spec, "swapped_signal_after::", 22) == 0 ||
1838                strncmp (signal_spec, "swapped-signal-after::", 22) == 0)
1839         sid = g_signal_connect_data (object, signal_spec + 22,
1840                                      callback, data, NULL,
1841                                      G_CONNECT_SWAPPED | G_CONNECT_AFTER);
1842       else if (strncmp (signal_spec, "swapped_object_signal_after::", 29) == 0 ||
1843                strncmp (signal_spec, "swapped-object-signal-after::", 29) == 0)
1844         sid = g_signal_connect_object (object, signal_spec + 29,
1845                                        callback, data,
1846                                        G_CONNECT_SWAPPED | G_CONNECT_AFTER);
1847       else
1848         {
1849           g_warning ("%s: invalid signal spec \"%s\"", G_STRFUNC, signal_spec);
1850           break;
1851         }
1852       signal_spec = va_arg (var_args, gchar*);
1853     }
1854   va_end (var_args);
1855
1856   return object;
1857 }
1858
1859 /**
1860  * g_object_disconnect:
1861  * @object: a #GObject
1862  * @signal_spec: the spec for the first signal
1863  * @...: #GCallback for the first signal, followed by data for the first signal,
1864  *  followed optionally by more signal spec/callback/data triples,
1865  *  followed by %NULL
1866  *
1867  * A convenience function to disconnect multiple signals at once.
1868  *
1869  * The signal specs expected by this function have the form
1870  * "any_signal", which means to disconnect any signal with matching
1871  * callback and data, or "any_signal::signal_name", which only
1872  * disconnects the signal named "signal_name".
1873  */
1874 void
1875 g_object_disconnect (gpointer     _object,
1876                      const gchar *signal_spec,
1877                      ...)
1878 {
1879   GObject *object = _object;
1880   va_list var_args;
1881
1882   g_return_if_fail (G_IS_OBJECT (object));
1883   g_return_if_fail (object->ref_count > 0);
1884
1885   va_start (var_args, signal_spec);
1886   while (signal_spec)
1887     {
1888       GCallback callback = va_arg (var_args, GCallback);
1889       gpointer data = va_arg (var_args, gpointer);
1890       guint sid = 0, detail = 0, mask = 0;
1891
1892       if (strncmp (signal_spec, "any_signal::", 12) == 0 ||
1893           strncmp (signal_spec, "any-signal::", 12) == 0)
1894         {
1895           signal_spec += 12;
1896           mask = G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA;
1897         }
1898       else if (strcmp (signal_spec, "any_signal") == 0 ||
1899                strcmp (signal_spec, "any-signal") == 0)
1900         {
1901           signal_spec += 10;
1902           mask = G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA;
1903         }
1904       else
1905         {
1906           g_warning ("%s: invalid signal spec \"%s\"", G_STRFUNC, signal_spec);
1907           break;
1908         }
1909
1910       if ((mask & G_SIGNAL_MATCH_ID) &&
1911           !g_signal_parse_name (signal_spec, G_OBJECT_TYPE (object), &sid, &detail, FALSE))
1912         g_warning ("%s: invalid signal name \"%s\"", G_STRFUNC, signal_spec);
1913       else if (!g_signal_handlers_disconnect_matched (object, mask | (detail ? G_SIGNAL_MATCH_DETAIL : 0),
1914                                                       sid, detail,
1915                                                       NULL, (gpointer)callback, data))
1916         g_warning ("%s: signal handler %p(%p) is not connected", G_STRFUNC, callback, data);
1917       signal_spec = va_arg (var_args, gchar*);
1918     }
1919   va_end (var_args);
1920 }
1921
1922 typedef struct {
1923   GObject *object;
1924   guint n_weak_refs;
1925   struct {
1926     GWeakNotify notify;
1927     gpointer    data;
1928   } weak_refs[1];  /* flexible array */
1929 } WeakRefStack;
1930
1931 static void
1932 weak_refs_notify (gpointer data)
1933 {
1934   WeakRefStack *wstack = data;
1935   guint i;
1936
1937   for (i = 0; i < wstack->n_weak_refs; i++)
1938     wstack->weak_refs[i].notify (wstack->weak_refs[i].data, wstack->object);
1939   g_free (wstack);
1940 }
1941
1942 /**
1943  * g_object_weak_ref:
1944  * @object: #GObject to reference weakly
1945  * @notify: callback to invoke before the object is freed
1946  * @data: extra data to pass to notify
1947  *
1948  * Adds a weak reference callback to an object. Weak references are
1949  * used for notification when an object is finalized. They are called
1950  * "weak references" because they allow you to safely hold a pointer
1951  * to an object without calling g_object_ref() (g_object_ref() adds a
1952  * strong reference, that is, forces the object to stay alive).
1953  */
1954 void
1955 g_object_weak_ref (GObject    *object,
1956                    GWeakNotify notify,
1957                    gpointer    data)
1958 {
1959   WeakRefStack *wstack;
1960   guint i;
1961   
1962   g_return_if_fail (G_IS_OBJECT (object));
1963   g_return_if_fail (notify != NULL);
1964   g_return_if_fail (object->ref_count >= 1);
1965
1966   wstack = g_datalist_id_remove_no_notify (&object->qdata, quark_weak_refs);
1967   if (wstack)
1968     {
1969       i = wstack->n_weak_refs++;
1970       wstack = g_realloc (wstack, sizeof (*wstack) + sizeof (wstack->weak_refs[0]) * i);
1971     }
1972   else
1973     {
1974       wstack = g_renew (WeakRefStack, NULL, 1);
1975       wstack->object = object;
1976       wstack->n_weak_refs = 1;
1977       i = 0;
1978     }
1979   wstack->weak_refs[i].notify = notify;
1980   wstack->weak_refs[i].data = data;
1981   g_datalist_id_set_data_full (&object->qdata, quark_weak_refs, wstack, weak_refs_notify);
1982 }
1983
1984 /**
1985  * g_object_weak_unref:
1986  * @object: #GObject to remove a weak reference from
1987  * @notify: callback to search for
1988  * @data: data to search for
1989  *
1990  * Removes a weak reference callback to an object.
1991  */
1992 void
1993 g_object_weak_unref (GObject    *object,
1994                      GWeakNotify notify,
1995                      gpointer    data)
1996 {
1997   WeakRefStack *wstack;
1998   gboolean found_one = FALSE;
1999
2000   g_return_if_fail (G_IS_OBJECT (object));
2001   g_return_if_fail (notify != NULL);
2002
2003   wstack = g_datalist_id_get_data (&object->qdata, quark_weak_refs);
2004   if (wstack)
2005     {
2006       guint i;
2007
2008       for (i = 0; i < wstack->n_weak_refs; i++)
2009         if (wstack->weak_refs[i].notify == notify &&
2010             wstack->weak_refs[i].data == data)
2011           {
2012             found_one = TRUE;
2013             wstack->n_weak_refs -= 1;
2014             if (i != wstack->n_weak_refs)
2015               wstack->weak_refs[i] = wstack->weak_refs[wstack->n_weak_refs];
2016
2017             break;
2018           }
2019     }
2020   if (!found_one)
2021     g_warning ("%s: couldn't find weak ref %p(%p)", G_STRFUNC, notify, data);
2022 }
2023
2024 /**
2025  * g_object_add_weak_pointer:
2026  * @object: The object that should be weak referenced.
2027  * @weak_pointer_location: The memory address of a pointer.
2028  *
2029  * Adds a weak reference from weak_pointer to @object to indicate that
2030  * the pointer located at @weak_pointer_location is only valid during
2031  * the lifetime of @object. When the @object is finalized,
2032  * @weak_pointer will be set to %NULL.
2033  */
2034 void
2035 g_object_add_weak_pointer (GObject  *object, 
2036                            gpointer *weak_pointer_location)
2037 {
2038   g_return_if_fail (G_IS_OBJECT (object));
2039   g_return_if_fail (weak_pointer_location != NULL);
2040
2041   g_object_weak_ref (object, 
2042                      (GWeakNotify) g_nullify_pointer, 
2043                      weak_pointer_location);
2044 }
2045
2046 /**
2047  * g_object_remove_weak_pointer:
2048  * @object: The object that is weak referenced.
2049  * @weak_pointer_location: The memory address of a pointer.
2050  *
2051  * Removes a weak reference from @object that was previously added
2052  * using g_object_add_weak_pointer(). The @weak_pointer_location has
2053  * to match the one used with g_object_add_weak_pointer().
2054  */
2055 void
2056 g_object_remove_weak_pointer (GObject  *object, 
2057                               gpointer *weak_pointer_location)
2058 {
2059   g_return_if_fail (G_IS_OBJECT (object));
2060   g_return_if_fail (weak_pointer_location != NULL);
2061
2062   g_object_weak_unref (object, 
2063                        (GWeakNotify) g_nullify_pointer, 
2064                        weak_pointer_location);
2065 }
2066
2067 static guint
2068 object_floating_flag_handler (GObject        *object,
2069                               gint            job)
2070 {
2071   switch (job)
2072     {
2073       gpointer oldvalue;
2074     case +1:    /* force floating if possible */
2075       do
2076         oldvalue = g_atomic_pointer_get (&object->qdata);
2077       while (!g_atomic_pointer_compare_and_exchange ((void**) &object->qdata, oldvalue,
2078                                                      (gpointer) ((gsize) oldvalue | OBJECT_FLOATING_FLAG)));
2079       return (gsize) oldvalue & OBJECT_FLOATING_FLAG;
2080     case -1:    /* sink if possible */
2081       do
2082         oldvalue = g_atomic_pointer_get (&object->qdata);
2083       while (!g_atomic_pointer_compare_and_exchange ((void**) &object->qdata, oldvalue,
2084                                                      (gpointer) ((gsize) oldvalue & ~(gsize) OBJECT_FLOATING_FLAG)));
2085       return (gsize) oldvalue & OBJECT_FLOATING_FLAG;
2086     default:    /* check floating */
2087       return 0 != ((gsize) g_atomic_pointer_get (&object->qdata) & OBJECT_FLOATING_FLAG);
2088     }
2089 }
2090
2091 /**
2092  * g_object_is_floating:
2093  * @object: a #GObject
2094  *
2095  * Checks wether @object has a <link linkend="floating-ref">floating</link>
2096  * reference.
2097  *
2098  * Since: 2.10
2099  *
2100  * Returns: %TRUE if @object has a floating reference
2101  */
2102 gboolean
2103 g_object_is_floating (gpointer _object)
2104 {
2105   GObject *object = _object;
2106   g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
2107   return floating_flag_handler (object, 0);
2108 }
2109
2110 /**
2111  * g_object_ref_sink:
2112  * @object: a #GObject
2113  *
2114  * Increase the reference count of @object, and possibly remove the
2115  * <link linkend="floating-ref">floating</link> reference, if @object
2116  * has a floating reference.
2117  *
2118  * In other words, if the object is floating, then this call "assumes
2119  * ownership" of the floating reference, converting it to a normal
2120  * reference by clearing the floating flag while leaving the reference
2121  * count unchanged.  If the object is not floating, then this call
2122  * adds a new normal reference increasing the reference count by one.
2123  *
2124  * Since: 2.10
2125  *
2126  * Returns: @object
2127  */
2128 gpointer
2129 g_object_ref_sink (gpointer _object)
2130 {
2131   GObject *object = _object;
2132   gboolean was_floating;
2133   g_return_val_if_fail (G_IS_OBJECT (object), object);
2134   g_return_val_if_fail (object->ref_count >= 1, object);
2135   g_object_ref (object);
2136   was_floating = floating_flag_handler (object, -1);
2137   if (was_floating)
2138     g_object_unref (object);
2139   return object;
2140 }
2141
2142 /**
2143  * g_object_force_floating:
2144  * @object: a #GObject
2145  *
2146  * This function is intended for #GObject implementations to re-enforce a
2147  * <link linkend="floating-ref">floating</link> object reference.
2148  * Doing this is seldomly required, all
2149  * #GInitiallyUnowned<!-- -->s are created with a floating reference which
2150  * usually just needs to be sunken by calling g_object_ref_sink().
2151  *
2152  * Since: 2.10
2153  */
2154 void
2155 g_object_force_floating (GObject *object)
2156 {
2157   gboolean was_floating;
2158   g_return_if_fail (G_IS_OBJECT (object));
2159   g_return_if_fail (object->ref_count >= 1);
2160
2161   was_floating = floating_flag_handler (object, +1);
2162 }
2163
2164 typedef struct {
2165   GObject *object;
2166   guint n_toggle_refs;
2167   struct {
2168     GToggleNotify notify;
2169     gpointer    data;
2170   } toggle_refs[1];  /* flexible array */
2171 } ToggleRefStack;
2172
2173 static void
2174 toggle_refs_notify (GObject *object,
2175                     gboolean is_last_ref)
2176 {
2177   ToggleRefStack *tstack = g_datalist_id_get_data (&object->qdata, quark_toggle_refs);
2178
2179   /* Reentrancy here is not as tricky as it seems, because a toggle reference
2180    * will only be notified when there is exactly one of them.
2181    */
2182   g_assert (tstack->n_toggle_refs == 1);
2183   tstack->toggle_refs[0].notify (tstack->toggle_refs[0].data, tstack->object, is_last_ref);
2184 }
2185
2186 /**
2187  * g_object_add_toggle_ref:
2188  * @object: a #GObject
2189  * @notify: a function to call when this reference is the
2190  *  last reference to the object, or is no longer
2191  *  the last reference.
2192  * @data: data to pass to @notify
2193  *
2194  * Increases the reference count of the object by one and sets a
2195  * callback to be called when all other references to the object are
2196  * dropped, or when this is already the last reference to the object
2197  * and another reference is established.
2198  *
2199  * This functionality is intended for binding @object to a proxy
2200  * object managed by another memory manager. This is done with two
2201  * paired references: the strong reference added by
2202  * g_object_add_toggle_ref() and a reverse reference to the proxy
2203  * object which is either a strong reference or weak reference.
2204  *
2205  * The setup is that when there are no other references to @object,
2206  * only a weak reference is held in the reverse direction from @object
2207  * to the proxy object, but when there are other references held to
2208  * @object, a strong reference is held. The @notify callback is called
2209  * when the reference from @object to the proxy object should be
2210  * <firstterm>toggled</firstterm> from strong to weak (@is_last_ref
2211  * true) or weak to strong (@is_last_ref false).
2212  *
2213  * Since a (normal) reference must be held to the object before
2214  * calling g_object_toggle_ref(), the initial state of the reverse
2215  * link is always strong.
2216  *
2217  * Multiple toggle references may be added to the same gobject,
2218  * however if there are multiple toggle references to an object, none
2219  * of them will ever be notified until all but one are removed.  For
2220  * this reason, you should only ever use a toggle reference if there
2221  * is important state in the proxy object.
2222  *
2223  * Since: 2.8
2224  */
2225 void
2226 g_object_add_toggle_ref (GObject       *object,
2227                          GToggleNotify  notify,
2228                          gpointer       data)
2229 {
2230   ToggleRefStack *tstack;
2231   guint i;
2232   
2233   g_return_if_fail (G_IS_OBJECT (object));
2234   g_return_if_fail (notify != NULL);
2235   g_return_if_fail (object->ref_count >= 1);
2236
2237   g_object_ref (object);
2238
2239   tstack = g_datalist_id_remove_no_notify (&object->qdata, quark_toggle_refs);
2240   if (tstack)
2241     {
2242       i = tstack->n_toggle_refs++;
2243       /* allocate i = tstate->n_toggle_refs - 1 positions beyond the 1 declared
2244        * in tstate->toggle_refs */
2245       tstack = g_realloc (tstack, sizeof (*tstack) + sizeof (tstack->toggle_refs[0]) * i);
2246     }
2247   else
2248     {
2249       tstack = g_renew (ToggleRefStack, NULL, 1);
2250       tstack->object = object;
2251       tstack->n_toggle_refs = 1;
2252       i = 0;
2253     }
2254
2255   /* Set a flag for fast lookup after adding the first toggle reference */
2256   if (tstack->n_toggle_refs == 1)
2257     g_datalist_set_flags (&object->qdata, OBJECT_HAS_TOGGLE_REF_FLAG);
2258   
2259   tstack->toggle_refs[i].notify = notify;
2260   tstack->toggle_refs[i].data = data;
2261   g_datalist_id_set_data_full (&object->qdata, quark_toggle_refs, tstack,
2262                                (GDestroyNotify)g_free);
2263 }
2264
2265 /**
2266  * g_object_remove_toggle_ref:
2267  * @object: a #GObject
2268  * @notify: a function to call when this reference is the
2269  *  last reference to the object, or is no longer
2270  *  the last reference.
2271  * @data: data to pass to @notify
2272  *
2273  * Removes a reference added with g_object_add_toggle_ref(). The
2274  * reference count of the object is decreased by one.
2275  *
2276  * Since: 2.8
2277  */
2278 void
2279 g_object_remove_toggle_ref (GObject       *object,
2280                             GToggleNotify  notify,
2281                             gpointer       data)
2282 {
2283   ToggleRefStack *tstack;
2284   gboolean found_one = FALSE;
2285
2286   g_return_if_fail (G_IS_OBJECT (object));
2287   g_return_if_fail (notify != NULL);
2288
2289   tstack = g_datalist_id_get_data (&object->qdata, quark_toggle_refs);
2290   if (tstack)
2291     {
2292       guint i;
2293
2294       for (i = 0; i < tstack->n_toggle_refs; i++)
2295         if (tstack->toggle_refs[i].notify == notify &&
2296             tstack->toggle_refs[i].data == data)
2297           {
2298             found_one = TRUE;
2299             tstack->n_toggle_refs -= 1;
2300             if (i != tstack->n_toggle_refs)
2301               tstack->toggle_refs[i] = tstack->toggle_refs[tstack->n_toggle_refs];
2302
2303             if (tstack->n_toggle_refs == 0)
2304               g_datalist_unset_flags (&object->qdata, OBJECT_HAS_TOGGLE_REF_FLAG);
2305
2306             g_object_unref (object);
2307             
2308             break;
2309           }
2310     }
2311   
2312   if (!found_one)
2313     g_warning ("%s: couldn't find toggle ref %p(%p)", G_STRFUNC, notify, data);
2314 }
2315
2316 /**
2317  * g_object_ref:
2318  * @object: a #GObject
2319  *
2320  * Increases the reference count of @object.
2321  *
2322  * Returns: the same @object
2323  */
2324 gpointer
2325 g_object_ref (gpointer _object)
2326 {
2327   GObject *object = _object;
2328   gint old_val;
2329
2330   g_return_val_if_fail (G_IS_OBJECT (object), NULL);
2331   g_return_val_if_fail (object->ref_count > 0, NULL);
2332   
2333 #ifdef  G_ENABLE_DEBUG
2334   if (g_trap_object_ref == object)
2335     G_BREAKPOINT ();
2336 #endif  /* G_ENABLE_DEBUG */
2337
2338
2339   old_val = g_atomic_int_exchange_and_add (&object->ref_count, 1);
2340
2341   if (old_val == 1 && OBJECT_HAS_TOGGLE_REF (object))
2342     toggle_refs_notify (object, FALSE);
2343   
2344   return object;
2345 }
2346
2347 /**
2348  * g_object_unref:
2349  * @object: a #GObject
2350  *
2351  * Decreases the reference count of @object. When its reference count
2352  * drops to 0, the object is finalized (i.e. its memory is freed).
2353  */
2354 void
2355 g_object_unref (gpointer _object)
2356 {
2357   GObject *object = _object;
2358   gint old_ref;
2359   gboolean is_zero;
2360   
2361   g_return_if_fail (G_IS_OBJECT (object));
2362   g_return_if_fail (object->ref_count > 0);
2363   
2364 #ifdef  G_ENABLE_DEBUG
2365   if (g_trap_object_ref == object)
2366     G_BREAKPOINT ();
2367 #endif  /* G_ENABLE_DEBUG */
2368
2369   /* here we want to atomically do: if (ref_count>1) { ref_count--; return; } */
2370  retry_atomic_decrement1:
2371   old_ref = g_atomic_int_get (&object->ref_count);
2372   if (old_ref > 1)
2373     {
2374       if (!g_atomic_int_compare_and_exchange (&object->ref_count, old_ref, old_ref - 1))
2375         goto retry_atomic_decrement1;
2376
2377       /* if we went from 2->1 we need to notify toggle refs if any */
2378       if (old_ref == 2 && OBJECT_HAS_TOGGLE_REF (object))
2379         toggle_refs_notify (object, TRUE);
2380     }
2381   else
2382     {
2383       /* we are about tp remove the last reference */
2384       G_OBJECT_GET_CLASS (object)->dispose (object);
2385
2386       /* may have been re-referenced meanwhile */
2387     retry_atomic_decrement2:
2388       old_ref = g_atomic_int_get (&object->ref_count);
2389       if (old_ref > 1)
2390         {
2391           if (!g_atomic_int_compare_and_exchange (&object->ref_count, old_ref, old_ref - 1))
2392             goto retry_atomic_decrement2;
2393
2394           /* if we went from 2->1 we need to notify toggle refs if any */
2395           if (old_ref == 2 && OBJECT_HAS_TOGGLE_REF (object))
2396             toggle_refs_notify (object, TRUE);
2397           
2398           return;
2399         }
2400       
2401       /* we are still in the process of taking away the last ref */
2402       g_datalist_id_set_data (&object->qdata, quark_closure_array, NULL);
2403       g_signal_handlers_destroy (object);
2404       g_datalist_id_set_data (&object->qdata, quark_weak_refs, NULL);
2405       
2406       /* decrement the last reference */
2407       is_zero = g_atomic_int_dec_and_test (&object->ref_count);
2408       
2409       /* may have been re-referenced meanwhile */
2410       if (G_LIKELY (is_zero)) 
2411         {
2412           G_OBJECT_GET_CLASS (object)->finalize (object);
2413 #ifdef  G_ENABLE_DEBUG
2414           IF_DEBUG (OBJECTS)
2415             {
2416               /* catch objects not chaining finalize handlers */
2417               G_LOCK (debug_objects);
2418               g_assert (g_hash_table_lookup (debug_objects_ht, object) == NULL);
2419               G_UNLOCK (debug_objects);
2420             }
2421 #endif  /* G_ENABLE_DEBUG */
2422           g_type_free_instance ((GTypeInstance*) object);
2423         }
2424     }
2425 }
2426
2427 /**
2428  * g_object_get_qdata:
2429  * @object: The GObject to get a stored user data pointer from
2430  * @quark: A #GQuark, naming the user data pointer
2431  * 
2432  * This function gets back user data pointers stored via
2433  * g_object_set_qdata().
2434  * 
2435  * Returns: The user data pointer set, or %NULL
2436  */
2437 gpointer
2438 g_object_get_qdata (GObject *object,
2439                     GQuark   quark)
2440 {
2441   g_return_val_if_fail (G_IS_OBJECT (object), NULL);
2442   
2443   return quark ? g_datalist_id_get_data (&object->qdata, quark) : NULL;
2444 }
2445
2446 /**
2447  * g_object_set_qdata:
2448  * @object: The GObject to set store a user data pointer
2449  * @quark: A #GQuark, naming the user data pointer
2450  * @data: An opaque user data pointer
2451  *
2452  * This sets an opaque, named pointer on an object.
2453  * The name is specified through a #GQuark (retrived e.g. via
2454  * g_quark_from_static_string()), and the pointer
2455  * can be gotten back from the @object with g_object_get_qdata()
2456  * until the @object is finalized.
2457  * Setting a previously set user data pointer, overrides (frees)
2458  * the old pointer set, using #NULL as pointer essentially
2459  * removes the data stored.
2460  */
2461 void
2462 g_object_set_qdata (GObject *object,
2463                     GQuark   quark,
2464                     gpointer data)
2465 {
2466   g_return_if_fail (G_IS_OBJECT (object));
2467   g_return_if_fail (quark > 0);
2468   
2469   g_datalist_id_set_data (&object->qdata, quark, data);
2470 }
2471
2472 /**
2473  * g_object_set_qdata_full:
2474  * @object: The GObject to set store a user data pointer
2475  * @quark: A #GQuark, naming the user data pointer
2476  * @data: An opaque user data pointer
2477  * @destroy: Function to invoke with @data as argument, when @data
2478  *           needs to be freed
2479  *
2480  * This function works like g_object_set_qdata(), but in addition,
2481  * a void (*destroy) (gpointer) function may be specified which is
2482  * called with @data as argument when the @object is finalized, or
2483  * the data is being overwritten by a call to g_object_set_qdata()
2484  * with the same @quark.
2485  */
2486 void
2487 g_object_set_qdata_full (GObject       *object,
2488                          GQuark         quark,
2489                          gpointer       data,
2490                          GDestroyNotify destroy)
2491 {
2492   g_return_if_fail (G_IS_OBJECT (object));
2493   g_return_if_fail (quark > 0);
2494   
2495   g_datalist_id_set_data_full (&object->qdata, quark, data,
2496                                data ? destroy : (GDestroyNotify) NULL);
2497 }
2498
2499 /**
2500  * g_object_steal_qdata:
2501  * @object: The GObject to get a stored user data pointer from
2502  * @quark: A #GQuark, naming the user data pointer
2503  *
2504  * This function gets back user data pointers stored via
2505  * g_object_set_qdata() and removes the @data from object
2506  * without invoking it's destroy() function (if any was
2507  * set).
2508  * Usually, calling this function is only required to update
2509  * user data pointers with a destroy notifier, for example:
2510  * |[
2511  * void
2512  * object_add_to_user_list (GObject     *object,
2513  *                          const gchar *new_string)
2514  * {
2515  *   // the quark, naming the object data
2516  *   GQuark quark_string_list = g_quark_from_static_string ("my-string-list");
2517  *   // retrive the old string list
2518  *   GList *list = g_object_steal_qdata (object, quark_string_list);
2519  *
2520  *   // prepend new string
2521  *   list = g_list_prepend (list, g_strdup (new_string));
2522  *   // this changed 'list', so we need to set it again
2523  *   g_object_set_qdata_full (object, quark_string_list, list, free_string_list);
2524  * }
2525  * static void
2526  * free_string_list (gpointer data)
2527  * {
2528  *   GList *node, *list = data;
2529  *
2530  *   for (node = list; node; node = node->next)
2531  *     g_free (node->data);
2532  *   g_list_free (list);
2533  * }
2534  * ]|
2535  * Using g_object_get_qdata() in the above example, instead of
2536  * g_object_steal_qdata() would have left the destroy function set,
2537  * and thus the partial string list would have been freed upon
2538  * g_object_set_qdata_full().
2539  *
2540  * Returns: The user data pointer set, or %NULL
2541  */
2542 gpointer
2543 g_object_steal_qdata (GObject *object,
2544                       GQuark   quark)
2545 {
2546   g_return_val_if_fail (G_IS_OBJECT (object), NULL);
2547   g_return_val_if_fail (quark > 0, NULL);
2548   
2549   return g_datalist_id_remove_no_notify (&object->qdata, quark);
2550 }
2551
2552 /**
2553  * g_object_get_data:
2554  * @object: #GObject containing the associations
2555  * @key: name of the key for that association
2556  * 
2557  * Gets a named field from the objects table of associations (see g_object_set_data()).
2558  * 
2559  * Returns: the data if found, or %NULL if no such data exists.
2560  */
2561 gpointer
2562 g_object_get_data (GObject     *object,
2563                    const gchar *key)
2564 {
2565   GQuark quark;
2566
2567   g_return_val_if_fail (G_IS_OBJECT (object), NULL);
2568   g_return_val_if_fail (key != NULL, NULL);
2569
2570   quark = g_quark_try_string (key);
2571
2572   return quark ? g_datalist_id_get_data (&object->qdata, quark) : NULL;
2573 }
2574
2575 /**
2576  * g_object_set_data:
2577  * @object: #GObject containing the associations.
2578  * @key: name of the key
2579  * @data: data to associate with that key
2580  *
2581  * Each object carries around a table of associations from
2582  * strings to pointers.  This function lets you set an association.
2583  *
2584  * If the object already had an association with that name,
2585  * the old association will be destroyed.
2586  */
2587 void
2588 g_object_set_data (GObject     *object,
2589                    const gchar *key,
2590                    gpointer     data)
2591 {
2592   g_return_if_fail (G_IS_OBJECT (object));
2593   g_return_if_fail (key != NULL);
2594
2595   g_datalist_id_set_data (&object->qdata, g_quark_from_string (key), data);
2596 }
2597
2598 /**
2599  * g_object_set_data_full:
2600  * @object: #GObject containing the associations
2601  * @key: name of the key
2602  * @data: data to associate with that key
2603  * @destroy: function to call when the association is destroyed
2604  *
2605  * Like g_object_set_data() except it adds notification
2606  * for when the association is destroyed, either by setting it
2607  * to a different value or when the object is destroyed.
2608  *
2609  * Note that the @destroy callback is not called if @data is %NULL.
2610  */
2611 void
2612 g_object_set_data_full (GObject       *object,
2613                         const gchar   *key,
2614                         gpointer       data,
2615                         GDestroyNotify destroy)
2616 {
2617   g_return_if_fail (G_IS_OBJECT (object));
2618   g_return_if_fail (key != NULL);
2619
2620   g_datalist_id_set_data_full (&object->qdata, g_quark_from_string (key), data,
2621                                data ? destroy : (GDestroyNotify) NULL);
2622 }
2623
2624 /**
2625  * g_object_steal_data:
2626  * @object: #GObject containing the associations
2627  * @key: name of the key
2628  *
2629  * Remove a specified datum from the object's data associations,
2630  * without invoking the association's destroy handler.
2631  *
2632  * Returns: the data if found, or %NULL if no such data exists.
2633  */
2634 gpointer
2635 g_object_steal_data (GObject     *object,
2636                      const gchar *key)
2637 {
2638   GQuark quark;
2639
2640   g_return_val_if_fail (G_IS_OBJECT (object), NULL);
2641   g_return_val_if_fail (key != NULL, NULL);
2642
2643   quark = g_quark_try_string (key);
2644
2645   return quark ? g_datalist_id_remove_no_notify (&object->qdata, quark) : NULL;
2646 }
2647
2648 static void
2649 g_value_object_init (GValue *value)
2650 {
2651   value->data[0].v_pointer = NULL;
2652 }
2653
2654 static void
2655 g_value_object_free_value (GValue *value)
2656 {
2657   if (value->data[0].v_pointer)
2658     g_object_unref (value->data[0].v_pointer);
2659 }
2660
2661 static void
2662 g_value_object_copy_value (const GValue *src_value,
2663                            GValue       *dest_value)
2664 {
2665   if (src_value->data[0].v_pointer)
2666     dest_value->data[0].v_pointer = g_object_ref (src_value->data[0].v_pointer);
2667   else
2668     dest_value->data[0].v_pointer = NULL;
2669 }
2670
2671 static void
2672 g_value_object_transform_value (const GValue *src_value,
2673                                 GValue       *dest_value)
2674 {
2675   if (src_value->data[0].v_pointer && g_type_is_a (G_OBJECT_TYPE (src_value->data[0].v_pointer), G_VALUE_TYPE (dest_value)))
2676     dest_value->data[0].v_pointer = g_object_ref (src_value->data[0].v_pointer);
2677   else
2678     dest_value->data[0].v_pointer = NULL;
2679 }
2680
2681 static gpointer
2682 g_value_object_peek_pointer (const GValue *value)
2683 {
2684   return value->data[0].v_pointer;
2685 }
2686
2687 static gchar*
2688 g_value_object_collect_value (GValue      *value,
2689                               guint        n_collect_values,
2690                               GTypeCValue *collect_values,
2691                               guint        collect_flags)
2692 {
2693   if (collect_values[0].v_pointer)
2694     {
2695       GObject *object = collect_values[0].v_pointer;
2696       
2697       if (object->g_type_instance.g_class == NULL)
2698         return g_strconcat ("invalid unclassed object pointer for value type `",
2699                             G_VALUE_TYPE_NAME (value),
2700                             "'",
2701                             NULL);
2702       else if (!g_value_type_compatible (G_OBJECT_TYPE (object), G_VALUE_TYPE (value)))
2703         return g_strconcat ("invalid object type `",
2704                             G_OBJECT_TYPE_NAME (object),
2705                             "' for value type `",
2706                             G_VALUE_TYPE_NAME (value),
2707                             "'",
2708                             NULL);
2709       /* never honour G_VALUE_NOCOPY_CONTENTS for ref-counted types */
2710       value->data[0].v_pointer = g_object_ref (object);
2711     }
2712   else
2713     value->data[0].v_pointer = NULL;
2714   
2715   return NULL;
2716 }
2717
2718 static gchar*
2719 g_value_object_lcopy_value (const GValue *value,
2720                             guint        n_collect_values,
2721                             GTypeCValue *collect_values,
2722                             guint        collect_flags)
2723 {
2724   GObject **object_p = collect_values[0].v_pointer;
2725   
2726   if (!object_p)
2727     return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
2728
2729   if (!value->data[0].v_pointer)
2730     *object_p = NULL;
2731   else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
2732     *object_p = value->data[0].v_pointer;
2733   else
2734     *object_p = g_object_ref (value->data[0].v_pointer);
2735   
2736   return NULL;
2737 }
2738
2739 /**
2740  * g_value_set_object:
2741  * @value: a valid #GValue of %G_TYPE_OBJECT derived type
2742  * @v_object: object value to be set
2743  *
2744  * Set the contents of a %G_TYPE_OBJECT derived #GValue to @v_object.
2745  *
2746  * g_value_set_object() increases the reference count of @v_object
2747  * (the #GValue holds a reference to @v_object).  If you do not wish
2748  * to increase the reference count of the object (i.e. you wish to
2749  * pass your current reference to the #GValue because you no longer
2750  * need it), use g_value_take_object() instead.
2751  *
2752  * It is important that your #GValue holds a reference to @v_object (either its
2753  * own, or one it has taken) to ensure that the object won't be destroyed while
2754  * the #GValue still exists).
2755  */
2756 void
2757 g_value_set_object (GValue   *value,
2758                     gpointer  v_object)
2759 {
2760   GObject *old;
2761         
2762   g_return_if_fail (G_VALUE_HOLDS_OBJECT (value));
2763
2764   old = value->data[0].v_pointer;
2765   
2766   if (v_object)
2767     {
2768       g_return_if_fail (G_IS_OBJECT (v_object));
2769       g_return_if_fail (g_value_type_compatible (G_OBJECT_TYPE (v_object), G_VALUE_TYPE (value)));
2770
2771       value->data[0].v_pointer = v_object;
2772       g_object_ref (value->data[0].v_pointer);
2773     }
2774   else
2775     value->data[0].v_pointer = NULL;
2776   
2777   if (old)
2778     g_object_unref (old);
2779 }
2780
2781 /**
2782  * g_value_set_object_take_ownership:
2783  * @value: a valid #GValue of %G_TYPE_OBJECT derived type
2784  * @v_object: object value to be set
2785  *
2786  * This is an internal function introduced mainly for C marshallers.
2787  *
2788  * Deprecated: 2.4: Use g_value_take_object() instead.
2789  */
2790 void
2791 g_value_set_object_take_ownership (GValue  *value,
2792                                    gpointer v_object)
2793 {
2794   g_value_take_object (value, v_object);
2795 }
2796
2797 /**
2798  * g_value_take_object:
2799  * @value: a valid #GValue of %G_TYPE_OBJECT derived type
2800  * @v_object: object value to be set
2801  *
2802  * Sets the contents of a %G_TYPE_OBJECT derived #GValue to @v_object
2803  * and takes over the ownership of the callers reference to @v_object;
2804  * the caller doesn't have to unref it any more (i.e. the reference
2805  * count of the object is not increased).
2806  *
2807  * If you want the #GValue to hold its own reference to @v_object, use
2808  * g_value_set_object() instead.
2809  *
2810  * Since: 2.4
2811  */
2812 void
2813 g_value_take_object (GValue  *value,
2814                      gpointer v_object)
2815 {
2816   g_return_if_fail (G_VALUE_HOLDS_OBJECT (value));
2817
2818   if (value->data[0].v_pointer)
2819     {
2820       g_object_unref (value->data[0].v_pointer);
2821       value->data[0].v_pointer = NULL;
2822     }
2823
2824   if (v_object)
2825     {
2826       g_return_if_fail (G_IS_OBJECT (v_object));
2827       g_return_if_fail (g_value_type_compatible (G_OBJECT_TYPE (v_object), G_VALUE_TYPE (value)));
2828
2829       value->data[0].v_pointer = v_object; /* we take over the reference count */
2830     }
2831 }
2832
2833 /**
2834  * g_value_get_object:
2835  * @value: a valid #GValue of %G_TYPE_OBJECT derived type
2836  * 
2837  * Get the contents of a %G_TYPE_OBJECT derived #GValue.
2838  * 
2839  * Returns: object contents of @value
2840  */
2841 gpointer
2842 g_value_get_object (const GValue *value)
2843 {
2844   g_return_val_if_fail (G_VALUE_HOLDS_OBJECT (value), NULL);
2845   
2846   return value->data[0].v_pointer;
2847 }
2848
2849 /**
2850  * g_value_dup_object:
2851  * @value: a valid #GValue whose type is derived from %G_TYPE_OBJECT
2852  *
2853  * Get the contents of a %G_TYPE_OBJECT derived #GValue, increasing
2854  * its reference count.
2855  *
2856  * Returns: object content of @value, should be unreferenced when no
2857  *          longer needed.
2858  */
2859 gpointer
2860 g_value_dup_object (const GValue *value)
2861 {
2862   g_return_val_if_fail (G_VALUE_HOLDS_OBJECT (value), NULL);
2863   
2864   return value->data[0].v_pointer ? g_object_ref (value->data[0].v_pointer) : NULL;
2865 }
2866
2867 /**
2868  * g_signal_connect_object:
2869  * @instance: the instance to connect to.
2870  * @detailed_signal: a string of the form "signal-name::detail".
2871  * @c_handler: the #GCallback to connect.
2872  * @gobject: the object to pass as data to @c_handler.
2873  * @connect_flags: a combination of #GConnnectFlags.
2874  *
2875  * This is similar to g_signal_connect_data(), but uses a closure which
2876  * ensures that the @gobject stays alive during the call to @c_handler
2877  * by temporarily adding a reference count to @gobject.
2878  *
2879  * Note that there is a bug in GObject that makes this function
2880  * much less useful than it might seem otherwise. Once @gobject is
2881  * disposed, the callback will no longer be called, but, the signal
2882  * handler is <emphasis>not</emphasis> currently disconnected. If the
2883  * @instance is itself being freed at the same time than this doesn't
2884  * matter, since the signal will automatically be removed, but
2885  * if @instance persists, then the signal handler will leak. You
2886  * should not remove the signal yourself because in a future versions of
2887  * GObject, the handler <emphasis>will</emphasis> automatically
2888  * be disconnected.
2889  *
2890  * It's possible to work around this problem in a way that will
2891  * continue to work with future versions of GObject by checking
2892  * that the signal handler is still connected before disconnected it:
2893  * <informalexample><programlisting>
2894  *  if (g_signal_handler_is_connected (instance, id))
2895  *    g_signal_handler_disconnect (instance, id);
2896  * </programlisting></informalexample>
2897  *
2898  * Returns: the handler id.
2899  */
2900 gulong
2901 g_signal_connect_object (gpointer      instance,
2902                          const gchar  *detailed_signal,
2903                          GCallback     c_handler,
2904                          gpointer      gobject,
2905                          GConnectFlags connect_flags)
2906 {
2907   g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), 0);
2908   g_return_val_if_fail (detailed_signal != NULL, 0);
2909   g_return_val_if_fail (c_handler != NULL, 0);
2910
2911   if (gobject)
2912     {
2913       GClosure *closure;
2914
2915       g_return_val_if_fail (G_IS_OBJECT (gobject), 0);
2916
2917       closure = ((connect_flags & G_CONNECT_SWAPPED) ? g_cclosure_new_object_swap : g_cclosure_new_object) (c_handler, gobject);
2918
2919       return g_signal_connect_closure (instance, detailed_signal, closure, connect_flags & G_CONNECT_AFTER);
2920     }
2921   else
2922     return g_signal_connect_data (instance, detailed_signal, c_handler, NULL, NULL, connect_flags);
2923 }
2924
2925 typedef struct {
2926   GObject  *object;
2927   guint     n_closures;
2928   GClosure *closures[1]; /* flexible array */
2929 } CArray;
2930 /* don't change this structure without supplying an accessor for
2931  * watched closures, e.g.:
2932  * GSList* g_object_list_watched_closures (GObject *object)
2933  * {
2934  *   CArray *carray;
2935  *   g_return_val_if_fail (G_IS_OBJECT (object), NULL);
2936  *   carray = g_object_get_data (object, "GObject-closure-array");
2937  *   if (carray)
2938  *     {
2939  *       GSList *slist = NULL;
2940  *       guint i;
2941  *       for (i = 0; i < carray->n_closures; i++)
2942  *         slist = g_slist_prepend (slist, carray->closures[i]);
2943  *       return slist;
2944  *     }
2945  *   return NULL;
2946  * }
2947  */
2948
2949 static void
2950 object_remove_closure (gpointer  data,
2951                        GClosure *closure)
2952 {
2953   GObject *object = data;
2954   CArray *carray = g_object_get_qdata (object, quark_closure_array);
2955   guint i;
2956   
2957   for (i = 0; i < carray->n_closures; i++)
2958     if (carray->closures[i] == closure)
2959       {
2960         carray->n_closures--;
2961         if (i < carray->n_closures)
2962           carray->closures[i] = carray->closures[carray->n_closures];
2963         return;
2964       }
2965   g_assert_not_reached ();
2966 }
2967
2968 static void
2969 destroy_closure_array (gpointer data)
2970 {
2971   CArray *carray = data;
2972   GObject *object = carray->object;
2973   guint i, n = carray->n_closures;
2974   
2975   for (i = 0; i < n; i++)
2976     {
2977       GClosure *closure = carray->closures[i];
2978       
2979       /* removing object_remove_closure() upfront is probably faster than
2980        * letting it fiddle with quark_closure_array which is empty anyways
2981        */
2982       g_closure_remove_invalidate_notifier (closure, object, object_remove_closure);
2983       g_closure_invalidate (closure);
2984     }
2985   g_free (carray);
2986 }
2987
2988 /**
2989  * g_object_watch_closure:
2990  * @object: GObject restricting lifetime of @closure
2991  * @closure: GClosure to watch
2992  *
2993  * This function essentially limits the life time of the @closure to
2994  * the life time of the object. That is, when the object is finalized,
2995  * the @closure is invalidated by calling g_closure_invalidate() on
2996  * it, in order to prevent invocations of the closure with a finalized
2997  * (nonexisting) object. Also, g_object_ref() and g_object_unref() are
2998  * added as marshal guards to the @closure, to ensure that an extra
2999  * reference count is held on @object during invocation of the
3000  * @closure.  Usually, this function will be called on closures that
3001  * use this @object as closure data.
3002  */
3003 void
3004 g_object_watch_closure (GObject  *object,
3005                         GClosure *closure)
3006 {
3007   CArray *carray;
3008   guint i;
3009   
3010   g_return_if_fail (G_IS_OBJECT (object));
3011   g_return_if_fail (closure != NULL);
3012   g_return_if_fail (closure->is_invalid == FALSE);
3013   g_return_if_fail (closure->in_marshal == FALSE);
3014   g_return_if_fail (object->ref_count > 0);     /* this doesn't work on finalizing objects */
3015   
3016   g_closure_add_invalidate_notifier (closure, object, object_remove_closure);
3017   g_closure_add_marshal_guards (closure,
3018                                 object, (GClosureNotify) g_object_ref,
3019                                 object, (GClosureNotify) g_object_unref);
3020   carray = g_datalist_id_remove_no_notify (&object->qdata, quark_closure_array);
3021   if (!carray)
3022     {
3023       carray = g_renew (CArray, NULL, 1);
3024       carray->object = object;
3025       carray->n_closures = 1;
3026       i = 0;
3027     }
3028   else
3029     {
3030       i = carray->n_closures++;
3031       carray = g_realloc (carray, sizeof (*carray) + sizeof (carray->closures[0]) * i);
3032     }
3033   carray->closures[i] = closure;
3034   g_datalist_id_set_data_full (&object->qdata, quark_closure_array, carray, destroy_closure_array);
3035 }
3036
3037 /**
3038  * g_closure_new_object:
3039  * @sizeof_closure: the size of the structure to allocate, must be at least
3040  *  <literal>sizeof (GClosure)</literal>
3041  * @object: a #GObject pointer to store in the @data field of the newly
3042  *  allocated #GClosure
3043  *
3044  * A variant of g_closure_new_simple() which stores @object in the
3045  * @data field of the closure and calls g_object_watch_closure() on
3046  * @object and the created closure. This function is mainly useful
3047  * when implementing new types of closures.
3048  *
3049  * Returns: a newly allocated #GClosure
3050  */
3051 GClosure*
3052 g_closure_new_object (guint    sizeof_closure,
3053                       GObject *object)
3054 {
3055   GClosure *closure;
3056
3057   g_return_val_if_fail (G_IS_OBJECT (object), NULL);
3058   g_return_val_if_fail (object->ref_count > 0, NULL);     /* this doesn't work on finalizing objects */
3059
3060   closure = g_closure_new_simple (sizeof_closure, object);
3061   g_object_watch_closure (object, closure);
3062
3063   return closure;
3064 }
3065
3066 /**
3067  * g_cclosure_new_object:
3068  * @callback_func: the function to invoke
3069  * @object: a #GObject pointer to pass to @callback_func
3070  *
3071  * A variant of g_cclosure_new() which uses @object as @user_data and
3072  * calls g_object_watch_closure() on @object and the created
3073  * closure. This function is useful when you have a callback closely
3074  * associated with a #GObject, and want the callback to no longer run
3075  * after the object is is freed.
3076  *
3077  * Returns: a new #GCClosure
3078  */
3079 GClosure*
3080 g_cclosure_new_object (GCallback callback_func,
3081                        GObject  *object)
3082 {
3083   GClosure *closure;
3084
3085   g_return_val_if_fail (G_IS_OBJECT (object), NULL);
3086   g_return_val_if_fail (object->ref_count > 0, NULL);     /* this doesn't work on finalizing objects */
3087   g_return_val_if_fail (callback_func != NULL, NULL);
3088
3089   closure = g_cclosure_new (callback_func, object, NULL);
3090   g_object_watch_closure (object, closure);
3091
3092   return closure;
3093 }
3094
3095 /**
3096  * g_cclosure_new_object_swap:
3097  * @callback_func: the function to invoke
3098  * @object: a #GObject pointer to pass to @callback_func
3099  *
3100  * A variant of g_cclosure_new_swap() which uses @object as @user_data
3101  * and calls g_object_watch_closure() on @object and the created
3102  * closure. This function is useful when you have a callback closely
3103  * associated with a #GObject, and want the callback to no longer run
3104  * after the object is is freed.
3105  *
3106  * Returns: a new #GCClosure
3107  */
3108 GClosure*
3109 g_cclosure_new_object_swap (GCallback callback_func,
3110                             GObject  *object)
3111 {
3112   GClosure *closure;
3113
3114   g_return_val_if_fail (G_IS_OBJECT (object), NULL);
3115   g_return_val_if_fail (object->ref_count > 0, NULL);     /* this doesn't work on finalizing objects */
3116   g_return_val_if_fail (callback_func != NULL, NULL);
3117
3118   closure = g_cclosure_new_swap (callback_func, object, NULL);
3119   g_object_watch_closure (object, closure);
3120
3121   return closure;
3122 }
3123
3124 gsize
3125 g_object_compat_control (gsize           what,
3126                          gpointer        data)
3127 {
3128   switch (what)
3129     {
3130       gpointer *pp;
3131     case 1:     /* floating base type */
3132       return G_TYPE_INITIALLY_UNOWNED;
3133     case 2:     /* FIXME: remove this once GLib/Gtk+ break ABI again */
3134       floating_flag_handler = (guint(*)(GObject*,gint)) data;
3135       return 1;
3136     case 3:     /* FIXME: remove this once GLib/Gtk+ break ABI again */
3137       pp = data;
3138       *pp = floating_flag_handler;
3139       return 1;
3140     default:
3141       return 0;
3142     }
3143 }
3144
3145 G_DEFINE_TYPE (GInitiallyUnowned, g_initially_unowned, G_TYPE_OBJECT);
3146
3147 static void
3148 g_initially_unowned_init (GInitiallyUnowned *object)
3149 {
3150   g_object_force_floating (object);
3151 }
3152
3153 static void
3154 g_initially_unowned_class_init (GInitiallyUnownedClass *klass)
3155 {
3156 }
3157
3158 #define __G_OBJECT_C__
3159 #include "gobjectaliasdef.c"