2006-11-16 Emmanuele Bassi <ebassi@openedhand.com>

* clutter/clutter-private.h:
	* clutter/clutter-actor.c: Implement the defined
	clutter_actor_reparent() method; call unrealize
	when unparenting an actor.
This commit is contained in:
Emmanuele Bassi 2006-11-16 00:24:23 +00:00
parent 734f808fbc
commit 252368901f
4 changed files with 70 additions and 1 deletions

View File

@ -1,3 +1,10 @@
2006-11-16 Emmanuele Bassi <ebassi@openedhand.com>
* clutter/clutter-private.h:
* clutter/clutter-actor.c: Implement the defined
clutter_actor_reparent() method; call unrealize
when unparenting an actor.
2006-11-15 Emmanuele Bassi <ebassi@openedhand.com> 2006-11-15 Emmanuele Bassi <ebassi@openedhand.com>
* clutter/clutter-alpha.h: * clutter/clutter-alpha.h:

View File

@ -33,6 +33,7 @@
#include "config.h" #include "config.h"
#include "clutter-actor.h" #include "clutter-actor.h"
#include "clutter-group.h"
#include "clutter-main.h" #include "clutter-main.h"
#include "clutter-enum-types.h" #include "clutter-enum-types.h"
#include "clutter-marshal.h" #include "clutter-marshal.h"
@ -1575,10 +1576,69 @@ clutter_actor_unparent (ClutterActor *self)
if (self->priv->parent_actor == NULL) if (self->priv->parent_actor == NULL)
return; return;
/* just hide the actor if we are reparenting it */
if (CLUTTER_ACTOR_IS_REALIZED (self))
{
if (CLUTTER_PRIVATE_FLAGS (self) & CLUTTER_ACTOR_IN_REPARENT)
clutter_actor_hide (self);
else
clutter_actor_unrealize (self);
}
self->priv->parent_actor = NULL; self->priv->parent_actor = NULL;
g_object_unref (self); g_object_unref (self);
} }
/**
* clutter_actor_reparent:
* @self: a #ClutterActor
* @new_parent: the new #ClutterActor parent
*
* This function resets the parent actor of @self. It is
* logically equivalent to calling clutter_actory_unparent()
* and clutter_actor_set_parent().
*
* Since: 0.1.1
*/
void
clutter_actor_reparent (ClutterActor *self,
ClutterActor *new_parent)
{
g_return_if_fail (CLUTTER_IS_ACTOR (self));
g_return_if_fail (CLUTTER_IS_ACTOR (new_parent));
g_return_if_fail (self != new_parent);
if (CLUTTER_PRIVATE_FLAGS (self) & CLUTTER_ACTOR_IS_TOPLEVEL)
{
g_warning ("Cannot set a parent on a toplevel actor\n");
return;
}
if (self->priv->parent_actor != new_parent)
{
/* if the actor and the parent have already been realized,
* mark the actor as reparenting, so that clutter_actor_unparent()
* just hides the actor instead of unrealize it.
*/
if (CLUTTER_ACTOR_IS_REALIZED (self) &&
CLUTTER_ACTOR_IS_REALIZED (new_parent))
{
CLUTTER_SET_PRIVATE_FLAGS (self, CLUTTER_ACTOR_IN_REPARENT);
}
g_object_ref (self);
clutter_group_remove (CLUTTER_GROUP (self->priv->parent_actor), self);
clutter_group_add (CLUTTER_GROUP (new_parent), self);
g_object_unref (self);
if (CLUTTER_PRIVATE_FLAGS (self) & CLUTTER_ACTOR_IN_REPARENT)
{
CLUTTER_UNSET_PRIVATE_FLAGS (self, CLUTTER_ACTOR_IN_REPARENT);
clutter_actor_queue_redraw (self);
}
}
}
/** /**
* clutter_actor_raise: * clutter_actor_raise:
* @self: A #ClutterActor * @self: A #ClutterActor

View File

@ -76,7 +76,8 @@ typedef enum {
CLUTTER_ACTOR_UNUSED_FLAG = 0, CLUTTER_ACTOR_UNUSED_FLAG = 0,
CLUTTER_ACTOR_IN_DESTRUCTION = 1 << 0, CLUTTER_ACTOR_IN_DESTRUCTION = 1 << 0,
CLUTTER_ACTOR_IS_TOPLEVEL = 1 << 1 CLUTTER_ACTOR_IS_TOPLEVEL = 1 << 1,
CLUTTER_ACTOR_IN_REPARENT = 1 << 2
} ClutterPrivateFlags; } ClutterPrivateFlags;
#define CLUTTER_PRIVATE_FLAGS(a) (CLUTTER_ACTOR ((a))->private_flags) #define CLUTTER_PRIVATE_FLAGS(a) (CLUTTER_ACTOR ((a))->private_flags)

View File

@ -38,6 +38,7 @@ clutter-main
@a...: @a...:
@a...: @a...:
@a...: @a...:
@a...:
<!-- ##### MACRO CLUTTER_GLERR ##### --> <!-- ##### MACRO CLUTTER_GLERR ##### -->