mutter/cogl/cogl-gtype.c
Lionel Landwerlin 1b2dd815b4 Registers gtypes for all public objects and structs
This adds much more comprehensive support for gobject-introspection
based bindings by registering all objects as fundamental types that
inherit from CoglObject, and all structs as boxed types.

Co-Author: Robert Bragg <robert@linux.intel.com>

Reviewed-by: Neil Roberts <neil@linux.intel.com>
2014-03-20 18:27:12 +00:00

154 lines
3.4 KiB
C

#include "cogl-gtype-private.h"
#include <gobject/gvaluecollector.h>
void
_cogl_gtype_object_init_value (GValue *value)
{
value->data[0].v_pointer = NULL;
}
void
_cogl_gtype_object_free_value (GValue *value)
{
if (value->data[0].v_pointer != NULL)
cogl_object_unref (value->data[0].v_pointer);
}
void
_cogl_gtype_object_copy_value (const GValue *src,
GValue *dst)
{
if (src->data[0].v_pointer != NULL)
dst->data[0].v_pointer = cogl_object_ref (src->data[0].v_pointer);
else
dst->data[0].v_pointer = NULL;
}
gpointer
_cogl_gtype_object_peek_pointer (const GValue *value)
{
return value->data[0].v_pointer;
}
gchar *
_cogl_gtype_object_collect_value (GValue *value,
guint n_collect_values,
GTypeCValue *collect_values,
guint collect_flags)
{
CoglObject *object;
object = collect_values[0].v_pointer;
if (object == NULL)
{
value->data[0].v_pointer = NULL;
return NULL;
}
if (object->klass == NULL)
return g_strconcat ("invalid unclassed CoglObject pointer for "
"value type '",
G_VALUE_TYPE_NAME (value),
"'",
NULL);
value->data[0].v_pointer = cogl_object_ref (object);
return NULL;
}
gchar *
_cogl_gtype_object_lcopy_value (const GValue *value,
guint n_collect_values,
GTypeCValue *collect_values,
guint collect_flags)
{
CoglObject **object_p = collect_values[0].v_pointer;
if (object_p == NULL)
return g_strconcat ("value location for '",
G_VALUE_TYPE_NAME (value),
"' passed as NULL",
NULL);
if (value->data[0].v_pointer == NULL)
*object_p = NULL;
else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
*object_p = value->data[0].v_pointer;
else
*object_p = cogl_object_ref (value->data[0].v_pointer);
return NULL;
}
void
_cogl_gtype_object_class_base_init (CoglObjectClass *klass)
{
}
void
_cogl_gtype_object_class_base_finalize (CoglObjectClass *klass)
{
}
void
_cogl_gtype_object_class_init (CoglObjectClass *klass)
{
}
void
_cogl_gtype_object_init (CoglObject *object)
{
}
void
_cogl_gtype_dummy_iface_init (gpointer iface)
{
}
/**
* cogl_object_value_set_object:
* @value: a #GValue initialized with %COGL_GTYPE_TYPE_OBJECT
* @object: (type Cogl.GtypeObject) (allow-none): a #CoglGtypeObject, or %NULL
*
* Sets the contents of a #GValue initialized with %COGL_GTYPE_TYPE_OBJECT.
*
*/
void
cogl_object_value_set_object (GValue *value,
gpointer object)
{
CoglObject *old_object;
old_object = value->data[0].v_pointer;
if (object != NULL)
{
/* take over ownership */
value->data[0].v_pointer = object;
}
else
value->data[0].v_pointer = NULL;
if (old_object != NULL)
cogl_object_unref (old_object);
}
/**
* cogl_object_value_get_object:
* @value: a #GValue initialized with %COGL_GTYPE_TYPE_OBJECT
*
* Retrieves a pointer to the #CoglGtypeObject contained inside
* the passed #GValue.
*
* Return value: (transfer none) (type Cogl.GtypeObject): a pointer to
* a #CoglGtypeObject, or %NULL
*/
gpointer
cogl_object_value_get_object (const GValue *value)
{
return value->data[0].v_pointer;
}