<!-- ##### SECTION Title ##### -->
GObject

<!-- ##### SECTION Short_Description ##### -->
The base object type

<!-- ##### SECTION Long_Description ##### -->
<para>
GObject is the fundamental type providing the common attributes and methods 
for all object types in GTK+, Pango and other libraries based on GObject. 
The GObject class provides methods for object construction and destruction, 
property access methods, and signal support. 
Signals are described in detail in <xref linkend="gobject-Signals"/>.
</para>
<para id="floating-ref">
The initial reference to a #GObject which is returned by g_object_new() can
optionally be "floating", which means that it is not specifically owned
by the creator of the object. The floating reference can be converted into 
an ordinary reference by anyone at any time, by calling g_object_ref_sink(). 
If the object is already sunk (has no floating reference), g_object_ref_sink() 
returns a new reference.
</para>
<para>
To create #GObject<!-- -->s with a floating reference, call 
g_object_force_floating() from the object's init function.
</para>

<!-- ##### SECTION See_Also ##### -->
<para>
#GParamSpecObject, g_param_spec_object()
</para>

<!-- ##### SECTION Stability_Level ##### -->


<!-- ##### STRUCT GObject ##### -->
<para>
All the fields in the <structname>GObject</structname> structure are private 
to the #GObject implementation and should never be accessed directly.
</para>


<!-- ##### SIGNAL GObject::notify ##### -->
<para>
The notify signal is emitted on an object when one of its properties 
has been changed. Note that getting this signal doesn't guarantee that the
value of the property has actually changed, it may also be emitted when
the setter for the property is called to reinstate the previous value.
</para>

@gobject: the object which received the signal.
@pspec: the #GParamSpec of the property which changed

<!-- ##### STRUCT GObjectClass ##### -->
<para>
The class structure for the <structname>GObject</structname> type.
</para>
<example>
<title>Implementing singletons using a constructor</title>
<programlisting>
static MySingleton *the_singleton = NULL;

static GObject*
my_singleton_constructor (GType                  type,
                          guint                  n_construct_params,
                          GObjectConstructParam *construct_params)
{
  GObject *object;
  
  if (!the_singleton)
    {
      object = G_OBJECT_CLASS (parent_class)->constructor (type,
                                                           n_construct_params,
                                                           construct_params);
      the_singleton = MY_SINGLETON (object);
    }
  else
    object = g_object_ref (G_OBJECT (the_singleton));

  return object;
}
</programlisting></example>

@g_type_class: the parent class
@constructor:  the @constructor function is called by g_object_new () to 
  complete the object initialization after all the construction properties are
  set. The first thing a @constructor implementation must do is chain up to the
  @constructor of the parent class. Overriding @constructor should be rarely 
  needed, e.g. to handle construct properties, or to implement singletons.
@set_property: the generic setter for all properties of this type. Should be
  overridden for every type with properties. Implementations of @set_property
  don't need to emit property change notification explicitly, this is handled
  by the type system.
@get_property: the generic getter for all properties of this type. Should be
  overridden for every type with properties.
@dispose: the @dispose function is supposed to drop all references to other 
  objects, but keep the instance otherwise intact, so that client method 
  invocations still work. It may be run multiple times (due to reference 
  loops). Before returning, @dispose should chain up to the @dispose method 
  of the parent class.
@finalize: instance finalization function, should finish the finalization of 
  the instance begun in @dispose and chain up to the @finalize method of the 
  parent class.
@dispatch_properties_changed: emits property change notification for a bunch
  of properties. Overriding @dispatch_properties_changed should be rarely 
  needed.
@notify: the class closure for the notify signal

<!-- ##### STRUCT GObjectConstructParam ##### -->
<para>
The <structname>GObjectConstructParam</structname> struct is an auxiliary 
structure used to hand #GParamSpec/#GValue pairs to the @constructor of
a #GObjectClass.
</para>

@pspec: the #GParamSpec of the construct parameter
@value: the value to set the parameter to

<!-- ##### USER_FUNCTION GObjectGetPropertyFunc ##### -->
<para>
The type of the @get_property function of #GObjectClass. 
</para>

@object: a #GObject
@property_id: the numeric id under which the property was registered with
   g_object_class_install_property().
@value: a #GValue to return the property value in
@pspec: the #GParamSpec describing the property


<!-- ##### USER_FUNCTION GObjectSetPropertyFunc ##### -->
<para>
The type of the @set_property function of #GObjectClass. 
</para>

@object: a #GObject
@property_id: the numeric id under which the property was registered with
   g_object_class_install_property().
@value: the new value for the property
@pspec: the #GParamSpec describing the property


<!-- ##### USER_FUNCTION GObjectFinalizeFunc ##### -->
<para>
The type of the @finalize function of #GObjectClass.
</para>

@object: the #GObject being finalized


<!-- ##### MACRO G_TYPE_IS_OBJECT ##### -->
<para>
Returns a boolean value of %FALSE or %TRUE indicating whether
the passed in type id is a %G_TYPE_OBJECT or derived from it.
</para>

@type: Type id to check for is a %G_TYPE_OBJECT relationship.
@Returns: %FALSE or %TRUE, indicating whether @type is a %G_TYPE_OBJECT.


<!-- ##### MACRO G_OBJECT ##### -->
<para>
Casts a #GObject or derived pointer into a (GObject*) pointer.
Depending on the current debugging level, this function may invoke
certain runtime checks to identify invalid casts.
</para>

@object: Object which is subject to casting.


<!-- ##### MACRO G_IS_OBJECT ##### -->
<para>
Checks whether a valid #GTypeInstance pointer is of type %G_TYPE_OBJECT.
</para>

@object: Instance to check for being a %G_TYPE_OBJECT.


<!-- ##### MACRO G_OBJECT_CLASS ##### -->
<para>
Casts a derived #GObjectClass structure into a #GObjectClass structure.
</para>

@class: a valid #GObjectClass


<!-- ##### MACRO G_IS_OBJECT_CLASS ##### -->
<para>
Checks whether @class "is a" valid #GObjectClass structure of type
%G_TYPE_OBJECT or derived.
</para>

@class: a #GObjectClass


<!-- ##### MACRO G_OBJECT_GET_CLASS ##### -->
<para>
Returns the class structure associated to a #GObject instance.
</para>

@object: a #GObject instance.


<!-- ##### MACRO G_OBJECT_TYPE ##### -->
<para>
Return the type id of an object.
</para>

@object: Object to return the type id for.
@Returns: Type id of @object.


<!-- ##### MACRO G_OBJECT_TYPE_NAME ##### -->
<para>
Returns the name of an object's type.
</para>

@object: Object to return the type name for.
@Returns: Type name of @object. The string is owned by the type system and 
should not be freed.


<!-- ##### MACRO G_OBJECT_CLASS_TYPE ##### -->
<para>
Return the type id of a class structure.
</para>

@class: a valid #GObjectClass
@Returns: Type id of @class.


<!-- ##### MACRO G_OBJECT_CLASS_NAME ##### -->
<para>
Return the name of a class structure's type.
</para>

@class: a valid #GObjectClass
@Returns: Type name of @class. The string is owned by the type system and 
should not be freed.


<!-- ##### FUNCTION g_object_class_install_property ##### -->
<para>
Installs a new property. This is usually done in the class initializer.
</para>

@oclass: a #GObjectClass
@property_id: the id for the new property
@pspec: the #GParamSpec for the new property


<!-- ##### FUNCTION g_object_class_find_property ##### -->
<para>
Looks up the #GParamSpec for a property of a class.
</para>

@oclass: a #GObjectClass
@property_name: the name of the property to look up
@Returns: the #GParamSpec for the property, or %NULL if the class doesn't have
a property of that name


<!-- ##### FUNCTION g_object_class_list_properties ##### -->
<para>
Returns an array of #GParamSpec* for all properties of a class.
</para>

@oclass: a #GObjectClass
@n_properties: return location for the length of the returned array
@Returns: an array of #GParamSpec* which should be freed after use


<!-- ##### FUNCTION g_object_class_override_property ##### -->
<para>
Registers @property_id as referring to a property with the
name @name in a parent class or in an interface implemented
by @oclass. This allows this class to <firstterm>override</firstterm>
a property implementation in a parent class or to provide
the implementation of a property from an interface.
</para>
<note>
<para>
Internally, overriding is implemented by creating a property of type
#GParamSpecOverride; generally operations that query the properties of
the object class, such as g_object_class_find_property() or
g_object_class_list_properties() will return the overridden
property. However, in one case, the @construct_properties argument of
the @constructor virtual function, the #GParamSpecOverride is passed
instead, so that the @param_id field of the #GParamSpec will be
correct.  For virtually all uses, this makes no difference. If you
need to get the overridden property, you can call
g_param_spec_get_redirect_target().
</para>
</note>

@oclass: a #GObjectClass
@property_id: the new property ID
@name: the name of a property registered in a parent class or
       in an interface of this class.


<!-- ##### FUNCTION g_object_interface_install_property ##### -->
<para>
Add a property to an interface; this is only useful for interfaces
that are added to GObject-derived types. Adding a property to an
interface forces all objects classes with that interface to have a
compatible property. The compatible property could be a newly
created #GParamSpec, but normally
g_object_class_override_property() will be used so that the object
class only needs to provide an implementation and inherits the
property description, default value, bounds, and so forth from the
interface property.
</para>
<para>
This function is meant to be called from the interface's default
vtable initialization function (the @class_init member of
#GTypeInfo.) It must not be called after after @class_init has
been called for any object types implementing this interface.
</para>

@g_iface: any interface vtable for the interface, or the default
 vtable for the interface.
@pspec: the #GParamSpec for the new property
@Since: 2.4


<!-- ##### FUNCTION g_object_interface_find_property ##### -->
<para>
Find the #GParamSpec with the given name for an
interface. Generally, the interface vtable passed in as @g_iface
will be the default vtable from g_type_default_interface_ref(), or,
if you know the interface has already been loaded,
g_type_default_interface_peek().
</para>

@g_iface: any interface vtable for the interface, or the default
  vtable for the interface
@property_name: name of a property to lookup.
@Returns: the #GParamSpec for the property of the
  interface with the name @property_name, or %NULL
  if no such property exists.
@Since: 2.4


<!-- ##### FUNCTION g_object_interface_list_properties ##### -->
<para>
Lists the properties of an interface.Generally, the interface
vtable passed in as @g_iface will be the default vtable from
g_type_default_interface_ref(), or, if you know the interface has
already been loaded, g_type_default_interface_peek().
</para>

@g_iface: any interface vtable for the interface, or the default
 vtable for the interface
@n_properties_p: location to store number of properties returned.
@Returns: a pointer to an array of pointers to #GParamSpec structures.
  The paramspecs are owned by GLib, but the array should
  be freed with g_free() when you are done with it.
@Since: 2.4


<!-- ##### FUNCTION g_object_new ##### -->
<para>
Creates a new instance of a #GObject subtype and sets its properties.
</para>
<para>
Construction parameters (see #G_PARAM_CONSTRUCT, #G_PARAM_CONSTRUCT_ONLY) 
which are not explicitly specified are set to their default values.
</para>

@object_type: the type id of the #GObject subtype to instantiate
@first_property_name: the name of the first property
@Varargs: the value of the first property, followed optionally by more
     name/value pairs, followed by %NULL
@Returns: a new instance of @object_type


<!-- ##### FUNCTION g_object_newv ##### -->
<para>
Creates a new instance of a #GObject subtype and sets its properties.
</para>
<para>
Construction parameters (see #G_PARAM_CONSTRUCT, #G_PARAM_CONSTRUCT_ONLY) 
which are not explicitly specified are set to their default values.
</para>

@object_type: the type id of the #GObject subtype to instantiate
@n_parameters: the length of the @parameters array
@parameters: an array of #GParameter
@Returns: a new instance of @object_type


<!-- ##### STRUCT GParameter ##### -->
<para>
The <structname>GParameter</structname> struct is an auxiliary structure used
to hand parameter name/value pairs to g_object_newv().
</para>

@name: the parameter name
@value: the parameter value

<!-- ##### FUNCTION g_object_ref ##### -->
<para>
Increases the reference count of @object.
</para>

@object: a #GObject
@Returns: @object


<!-- ##### FUNCTION g_object_unref ##### -->
<para>
Decreases the reference count if @object.
When its reference count drops to 0, the object is finalized (i.e. its memory is freed).
</para>

@object: a #GObject


<!-- ##### FUNCTION g_object_ref_sink ##### -->
<para>
Increase the reference count of @object, and remove the 
<link linkend="floating-ref">floating</link> reference, if @object
has a floating reference.
</para>

@object: a #GObject
@Returns: @object
@Since: 2.10


<!-- ##### FUNCTION g_object_is_floating ##### -->
<para>
Checks wether @object has a <link linkend="floating-ref">floating</link>
reference.
</para>

@object: a #GObject
@Returns: %TRUE if @object has a floating reference
@Since: 2.10


<!-- ##### FUNCTION g_object_force_floating ##### -->
<para>
This function is intended for #GObject implementations to mark the
initial reference to the object as 
<link linkend="floating-ref">floating</link>. It must only be called  
from an object's init function.
</para>

@object: a #GObject
@Since: 2.10


<!-- ##### USER_FUNCTION GWeakNotify ##### -->
<para>
A #GWeakNotify function can be added to an object as a callback that gets
triggered when the object is finalized. Since the object is already being
finalized when the #GWeakNotify is called, there's not much you could do 
with the object, apart from e.g. using its adress as hash-index or the like. 
</para>

@data: data that was provided when the weak reference was established
@where_the_object_was: the object being finalized


<!-- ##### FUNCTION g_object_weak_ref ##### -->
<para>
Adds a weak reference callback to an object. Weak references are used for
notification when an object is finalized. They are called "weak references" 
because they allow you to safely hold a pointer to an object without calling 
g_object_ref() (g_object_ref() adds a strong reference, that is, forces the 
object to stay alive).
</para>

@object: #GObject to reference weakly
@notify: callback to invoke before the object is freed
@data: extra data to pass to notify


<!-- ##### FUNCTION g_object_weak_unref ##### -->
<para>
Removes a weak reference callback to an object.
</para>

@object: #GObject to remove a weak reference from
@notify: callback to search for
@data: data to search for


<!-- ##### FUNCTION g_object_add_weak_pointer ##### -->
<para>
Adds a weak reference from weak_pointer to @object to indicate that
the pointer located at @weak_pointer_location is only valid during the 
lifetime of @object. When the @object is finalized, @weak_pointer will 
be set to %NULL.
</para>

@object: The object that should be weak referenced.
@weak_pointer_location: The memory address of a pointer.


<!-- ##### FUNCTION g_object_remove_weak_pointer ##### -->
<para>
Removes a weak reference from @object that was previously added
using g_object_add_weak_pointer(). The @weak_pointer_location has
to match the one used with g_object_add_weak_pointer().
</para>

@object: The object that is weak referenced.
@weak_pointer_location: The memory address of a pointer.


<!-- ##### USER_FUNCTION GToggleNotify ##### -->
<para>
A callback function used for notification when the state
of a toggle reference changes. See g_object_add_toggle_ref().
</para>

@data: Callback data passed to g_object_add_toggle_ref()
@object: The object on which g_object_add_toggle_ref() was called.
@is_last_ref: %TRUE if the toggle reference is now the
  last reference to the object. %FALSE if the toggle
  reference was the last reference and there are now other
  references.


<!-- ##### FUNCTION g_object_add_toggle_ref ##### -->
<para>
Increases the reference count of the object by one and sets a
callback to be called when all other references to the object are
dropped, or when this is already the last reference to the object
and another reference is established.
</para>
<para>
This functionality is intended for binding @object to a proxy
object managed by another memory manager. This is done with two
paired references: the strong reference added by
g_object_add_toggle_ref() and a reverse reference to the proxy
object which is either a strong reference or weak reference.
</para>
<para>
The setup is that when there are no other references to @object,
only a weak reference is held in the reverse direction from @object
to the proxy object, but when there are other references held to
@object, a strong reference is held. The @notify callback is called
when the reference from @object to the proxy object should be
<firstterm>toggled</firstterm> from strong to weak (@is_last_ref
true) or weak to strong (@is_last_ref false).
</para>
<para>
Since a (normal) reference must be held to the object before
calling g_object_toggle_ref(), the initial state of the reverse
link is always strong.
</para>
<para>
Multiple toggle references may be added to the same gobject,
however if there are multiple toggle references to an object, none
of them will ever be notified until all but one are removed.  For
this reason, you should only ever use a toggle reference if there
is important state in the proxy object.
</para>

@object: a #GObject
@notify: a function to call when this reference is the
  last reference to the object, or is no longer
  the last reference.
@data: data to pass to @notify


<!-- ##### FUNCTION g_object_remove_toggle_ref ##### -->
<para>
Removes a reference added with g_object_add_toggle_ref(). The
reference count of the object is decreased by one.
</para>

@object: a #GObject
@notify: a function to call when this reference is the
  last reference to the object, or is no longer
  the last reference.
@data: data to pass to @notify


<!-- ##### FUNCTION g_object_connect ##### -->
<para>
A convenience function to connect multiple signals at once.
</para>
<para>
The signal specs expected by this function have the form
"modifier::signal_name", where modifier can be one of the following:
<variablelist>
<varlistentry>
<term>signal</term>
<listitem><para>
equivalent to <literal>g_signal_connect_data (...)</literal>
</para></listitem>
</varlistentry>
<varlistentry>
<term>object_signal</term>
<term>object-signal</term>
<listitem><para>
equivalent to <literal>g_signal_connect_object (...)</literal>
</para></listitem>
</varlistentry>
<varlistentry>
<term>swapped_signal</term>
<term>swapped-signal</term>
<listitem><para>
equivalent to <literal>g_signal_connect_data (..., G_CONNECT_SWAPPED)</literal>
</para></listitem>
</varlistentry>
<varlistentry>
<term>swapped_object_signal</term>
<term>swapped-object-signal</term>
<listitem><para>
equivalent to <literal>g_signal_connect_object (..., G_CONNECT_SWAPPED)</literal>
</para></listitem>
</varlistentry>
<varlistentry>
<term>signal_after</term>
<term>signal-after</term>
<listitem><para>
equivalent to <literal>g_signal_connect_data (..., G_CONNECT_AFTER)</literal>
</para></listitem>
</varlistentry>
<varlistentry>
<term>object_signal_after</term>
<term>object-signal-after</term>
<listitem><para>
equivalent to <literal>g_signal_connect_object (..., G_CONNECT_AFTER)</literal>
</para></listitem>
</varlistentry>
<varlistentry>
<term>swapped_signal_after</term>
<term>swapped-signal-after</term>
<listitem><para>
equivalent to <literal>g_signal_connect_data (..., G_CONNECT_SWAPPED | G_CONNECT_AFTER)</literal>
</para></listitem>
</varlistentry>
<varlistentry>
<term>swapped_object_signal_after</term>
<term>swapped-object-signal-after</term>
<listitem><para>
equivalent to <literal>g_signal_connect_object (..., G_CONNECT_SWAPPED | G_CONNECT_AFTER)</literal>
</para></listitem>
</varlistentry>
</variablelist>
</para>
<informalexample>
<programlisting>
  menu->toplevel = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
						   "type", GTK_WINDOW_POPUP,
						   "child", menu,
						   NULL),
				     "signal::event", gtk_menu_window_event, menu,
				     "signal::size_request", gtk_menu_window_size_request, menu,
				     "signal::destroy", gtk_widget_destroyed, &amp;menu-&gt;toplevel,
				     NULL);
</programlisting>
</informalexample>

@object: a #GObject
@signal_spec: the spec for the first signal
@Varargs: #GCallback for the first signal, followed by data for the first signal, 
          followed optionally by more signal spec/callback/data triples, 
          followed by %NULL
@Returns: @object


<!-- ##### FUNCTION g_object_disconnect ##### -->
<para>
A convenience function to disconnect multiple signals at once.
</para>
<para>
The signal specs expected by this function have the form "any_signal", which
means to disconnect any signal with matching callback and data, or 
"any_signal::signal_name", which only disconnects the signal named "signal_name". 
</para>

@object: a #GObject
@signal_spec: the spec for the first signal
@Varargs: #GCallback for the first signal, followed by data for the first signal, 
          followed optionally by more signal spec/callback/data triples, 
          followed by %NULL


<!-- ##### FUNCTION g_object_set ##### -->
<para>
Sets properties on an object.
</para>

@object: a #GObject
@first_property_name: name of the first property to set
@Varargs: value for the first property, followed optionally by more
          name/value pairs, followed by %NULL


<!-- ##### FUNCTION g_object_get ##### -->
<para>
Gets properties of an object.
</para>
<para>
In general, a copy is made of the property contents and the caller is
responsible for freeing the memory in the appropriate manner for the type, 
for instance by calling g_free() or g_object_unref().
</para>
<example>
<title>Using g_object_get(<!-- -->)</title>
<para>
An example of using g_object_get() to get the contents
of three properties - one of type #G_TYPE_INT,
one of type #G_TYPE_STRING, and one of type #G_TYPE_OBJECT:
</para>
<programlisting>
 gint intval;
 gchar *strval;
 GObject *objval; 
 
 g_object_get (my_object,
               "intproperty", &amp;intval,
               "strproperty", &amp;strval,
               "objproperty", &amp;objval,
               NULL);

 /* Do something with intval, strval, objval */
 
 g_free (strval);
 g_object_unref (objval);
</programlisting>
</example>

@object: a #GObject
@first_property_name: name of the first property to get
@Varargs: return location for the first property, followed optionally by more
          name/return location pairs, followed by %NULL


<!-- ##### FUNCTION g_object_notify ##### -->
<para>
Emits a "notify" signal for the property @property_name on @object. 
</para>

@object: a #GObject
@property_name: the name of a property installed on the class of @object.


<!-- ##### FUNCTION g_object_freeze_notify ##### -->
<para>
Stops emission of "notify" signals on @object. The signals are
queued until g_object_thaw_notify() is called on @object. 
</para>
<para>
This is necessary for accessors that modify multiple properties to prevent
premature notification while the object is still being modified.
</para>

@object: a #GObject


<!-- ##### FUNCTION g_object_thaw_notify ##### -->
<para>
Reverts the effect of a previous call to g_object_freeze_notify().
This causes all queued "notify" signals on @object to be emitted.
</para>

@object: a #GObject


<!-- ##### FUNCTION g_object_get_data ##### -->
<para>
Gets a named field from the objects table of associations (see g_object_set_data()).
</para>

@object: #GObject containing the associations
@key: name of the key for that association
@Returns: the data if found, or %NULL if no such data exists.


<!-- ##### FUNCTION g_object_set_data ##### -->
<para>
Each object carries around a table of associations from
strings to pointers.  This function lets you set an association.
</para>
<para>
If the object already had an association with that name,
the old association will be destroyed.
</para>

@object: #GObject containing the associations.
@key: name of the key
@data: data to associate with that key


<!-- ##### FUNCTION g_object_set_data_full ##### -->
<para>
Like g_object_set_data() except it adds notification
for when the association is destroyed, either by setting it 
to a different value or when the object is destroyed.
</para>

@object: #GObject containing the associations
@key: name of the key
@data: data to associate with that key
@destroy: function to call when the association is destroyed


<!-- ##### FUNCTION g_object_steal_data ##### -->
<para>
Remove a specified datum from the object's data associations,
without invoking the association's destroy handler.
</para>

@object: #GObject containing the associations
@key: name of the key
@Returns: the data if found, or %NULL if no such data exists.


<!-- ##### FUNCTION g_object_get_qdata ##### -->
<para>
This function gets back user data pointers stored via
g_object_set_qdata().
</para>

@object:  The GObject to get a stored user data pointer from
@quark:   A #GQuark, naming the user data pointer
@Returns: The user data pointer set, or %NULL


<!-- ##### FUNCTION g_object_set_qdata ##### -->
<para>
This sets an opaque, named pointer on an object.
The name is specified through a #GQuark (retrived e.g. via
g_quark_from_static_string()), and the pointer
can be gotten back from the @object with g_object_get_qdata()
until the @object is finalized.
Setting a previously set user data pointer, overrides (frees)
the old pointer set, using #NULL as pointer essentially
removes the data stored.
</para>

@object: The GObject to set store a user data pointer
@quark:  A #GQuark, naming the user data pointer
@data:   An opaque user data pointer


<!-- ##### FUNCTION g_object_set_qdata_full ##### -->
<para>
This function works like g_object_set_qdata(), but in addition,
a void (*destroy) (gpointer) function may be specified which is
called with @data as argument when the @object is finalized, or
the data is being overwritten by a call to g_object_set_qdata()
with the same @quark.
</para>

@object:  The GObject to set store a user data pointer
@quark:   A #GQuark, naming the user data pointer
@data:    An opaque user data pointer
@destroy: Function to invoke with @data as argument, when @data needs to be freed


<!-- ##### FUNCTION g_object_steal_qdata ##### -->
<para>
This function gets back user data pointers stored via
g_object_set_qdata() and removes the @data from object
without invoking it's destroy() function (if any was
set).
Usually, calling this function is only required to update
user data pointers with a destroy notifier, for example:
<programlisting>
void
object_add_to_user_list (GObject     *object,
                         const gchar *new_string)
{
  /* the quark, naming the object data */
  GQuark quark_string_list = g_quark_from_static_string ("my-string-list");
  /* retrive the old string list */
  GList *list = g_object_steal_qdata (object, quark_string_list);
  
  /* prepend new string */
  list = g_list_prepend (list, g_strdup (new_string));
  /* this changed 'list', so we need to set it again */
  g_object_set_qdata_full (object, quark_string_list, list, free_string_list);
}
static void
free_string_list (gpointer data)
{
  GList *node, *list = data;
  
  for (node = list; node; node = node->next)
    g_free (node->data);
  g_list_free (list);
}
</programlisting>
Using g_object_get_qdata() in the above example, instead of g_object_steal_qdata()
would have left the destroy function set, and thus the partial string list would
have been freed upon g_object_set_qdata_full().
</para>

@object:  The GObject to get a stored user data pointer from
@quark:   A #GQuark, naming the user data pointer
@Returns: The user data pointer set, or %NULL


<!-- ##### FUNCTION g_object_set_property ##### -->
<para>
Sets a property on an object.
</para>

@object: a #GObject
@property_name: the name of the property to set
@value: the value


<!-- ##### FUNCTION g_object_get_property ##### -->
<para>
Gets a property of an object.
</para>
<para>
In general, a copy is made of the property contents and the caller is
responsible for freeing the memory by calling g_value_unset().
</para>
<para>
Note that g_object_get_property() is really intended for language
bindings, g_object_get() is much more convenient for C programming.
</para>

@object: a #GObject
@property_name: the name of the property to get
@value: return location for the property value


<!-- ##### FUNCTION g_object_new_valist ##### -->
<para>
Creates a new instance of a #GObject subtype and sets its properties.
</para>
<para>
Construction parameters (see #G_PARAM_CONSTRUCT, #G_PARAM_CONSTRUCT_ONLY) 
which are not explicitly specified are set to their default values.
</para>

@object_type: the type id of the #GObject subtype to instantiate
@first_property_name: the name of the first property
@var_args: the value of the first property, followed optionally by more
     name/value pairs, followed by %NULL
@Returns: a new instance of @object_type


<!-- ##### FUNCTION g_object_set_valist ##### -->
<para>
Sets properties on an object.
</para>

@object: a #GObject
@first_property_name: name of the first property to set
@var_args: value for the first property, followed optionally by more
           name/value pairs, followed by %NULL


<!-- ##### FUNCTION g_object_get_valist ##### -->
<para>
Gets properties of an object. 
</para>
<para>
In general, a copy is made of the property contents and the caller is
responsible for freeing the memory in the appropriate manner for the type, 
for instance by calling g_free() or g_object_unref().
</para>
<para>
See g_object_get().
</para>

@object: a #GObject
@first_property_name: name of the first property to get
@var_args: return location for the first property, followed optionally by more
           name/return location pairs, followed by %NULL


<!-- ##### FUNCTION g_object_watch_closure ##### -->
<para>
This function essentially limits the life time of the @closure
to the life time of the object. That is, when the object is finalized,
the @closure is invalidated by calling g_closure_invalidate() on it,
in order to prevent invocations of the closure with a finalized 
(nonexisting) object. Also, g_object_ref() and g_object_unref() are added
as marshal guards to the @closure, to ensure that an extra reference
count is held on @object during invocation of the @closure.
Usually, this function will be called on closures that use this @object
as closure data.
</para>

@object:  GObject restricting lifetime of @closure
@closure: GClosure to watch


<!-- ##### FUNCTION g_object_run_dispose ##### -->
<para>
Releases all references to other objects. This can be used to break 
reference cycles.
</para>
<note><para>
This functions should only be called from object system implementations.
</para></note>

@object: a #GObject


<!-- ##### MACRO G_OBJECT_WARN_INVALID_PROPERTY_ID ##### -->
<para>
This macros should be used to emit a standard warning about unexpected 
properties in set_property() and get_property() implementations.
</para>

@object: the #GObject on which set_property() or get_property() was called
@property_id: the numeric id of the property
@pspec: the #GParamSpec of the property


