mirror of
https://github.com/brl/mutter.git
synced 2024-11-23 00:20:42 -05:00
2008-05-28 Emmanuele Bassi <ebassi@openedhand.com>
* clutter/clutter-script.c: (clutter_script_construct_object): Mark top-level objects, that is objects that don't have their ownership transferred when building up a ClutterScript. (object_info_free): Merge a fix from the stable branch, but do not check the type - check whether the object is a top level (we still need the ClutterActor type check in order to call clutter_actor_destroy()).
This commit is contained in:
parent
d27ea0b4ac
commit
cb279f999a
12
ChangeLog
12
ChangeLog
@ -1,3 +1,15 @@
|
||||
2008-05-28 Emmanuele Bassi <ebassi@openedhand.com>
|
||||
|
||||
* clutter/clutter-script.c:
|
||||
(clutter_script_construct_object): Mark top-level objects,
|
||||
that is objects that don't have their ownership transferred
|
||||
when building up a ClutterScript.
|
||||
|
||||
(object_info_free): Merge a fix from the stable branch, but
|
||||
do not check the type - check whether the object is a top
|
||||
level (we still need the ClutterActor type check in order to
|
||||
call clutter_actor_destroy()).
|
||||
|
||||
2008-05-28 Emmanuele Bassi <ebassi@openedhand.com>
|
||||
|
||||
* clutter/clutter-rectangle.c:
|
||||
|
@ -1225,6 +1225,22 @@ add_children (ClutterScript *script,
|
||||
oinfo->children = unresolved;
|
||||
}
|
||||
|
||||
static const struct
|
||||
{
|
||||
const gchar *type_name;
|
||||
guint is_toplevel : 1;
|
||||
} clutter_toplevels[] = {
|
||||
{ "ClutterActor", FALSE },
|
||||
{ "ClutterAlpha", FALSE },
|
||||
{ "ClutterBehaviour", TRUE },
|
||||
{ "ClutterEffectTemplate", TRUE },
|
||||
{ "ClutterModel", TRUE },
|
||||
{ "ClutterScore", TRUE },
|
||||
{ "ClutterTimeline", TRUE }
|
||||
};
|
||||
|
||||
static guint n_clutter_toplevels = G_N_ELEMENTS (clutter_toplevels);
|
||||
|
||||
GObject *
|
||||
clutter_script_construct_object (ClutterScript *script,
|
||||
ObjectInfo *oinfo)
|
||||
@ -1353,6 +1369,19 @@ clutter_script_construct_object (ClutterScript *script,
|
||||
}
|
||||
g_array_free (params, TRUE);
|
||||
|
||||
for (i = 0; i < n_clutter_toplevels; i++)
|
||||
{
|
||||
const gchar *t_name = clutter_toplevels[i].type_name;
|
||||
GType t_type;
|
||||
|
||||
t_type = clutter_script_get_type_from_name (script, t_name);
|
||||
if (g_type_is_a (oinfo->gtype, t_name))
|
||||
{
|
||||
oinfo->is_toplevel = clutter_toplevels[i].is_toplevel;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (oinfo->children && CLUTTER_IS_CONTAINER (object))
|
||||
add_children (script, CLUTTER_CONTAINER (object), oinfo);
|
||||
|
||||
@ -1464,15 +1493,30 @@ object_info_free (gpointer data)
|
||||
g_list_foreach (oinfo->behaviours, (GFunc) g_free, NULL);
|
||||
g_list_free (oinfo->behaviours);
|
||||
|
||||
if (oinfo->is_toplevel && oinfo->object)
|
||||
/* we unref top-level objects and leave the actors alone,
|
||||
* unless we are unmerging in which case we have to destroy
|
||||
* the actor to unparent them
|
||||
*/
|
||||
if (oinfo->object)
|
||||
{
|
||||
if (oinfo->is_unmerged)
|
||||
{
|
||||
if (oinfo->is_toplevel)
|
||||
g_object_unref (oinfo->object);
|
||||
else
|
||||
{
|
||||
/* destroy every actor, unless it's the default stage */
|
||||
if (oinfo->is_stage_default != TRUE &&
|
||||
CLUTTER_IS_ACTOR (oinfo->object))
|
||||
clutter_actor_destroy (CLUTTER_ACTOR (oinfo->object));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (oinfo->is_toplevel)
|
||||
g_object_unref (oinfo->object);
|
||||
oinfo->object = NULL;
|
||||
}
|
||||
|
||||
if (oinfo->is_unmerged && oinfo->object && !oinfo->is_stage_default)
|
||||
{
|
||||
clutter_actor_destroy (CLUTTER_ACTOR (oinfo->object));
|
||||
oinfo->object = NULL;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user