[actor] Add ActorFlags accessor methods

The flags field of ClutterActor should have accessor methods for,
language bindings.

Also, the set_flags() and unset_flags() methods should actively
emit notifications for the changed properties.
This commit is contained in:
Emmanuele Bassi 2009-05-05 15:37:41 +01:00
parent fc991e9b67
commit 72562cda58
2 changed files with 156 additions and 9 deletions

View File

@ -132,7 +132,7 @@
/** /**
* CLUTTER_ACTOR_IS_MAPPED: * CLUTTER_ACTOR_IS_MAPPED:
* @e: a #ClutterActor * @a: a #ClutterActor
* *
* Evaluates to %TRUE if the %CLUTTER_ACTOR_MAPPED flag is set. * Evaluates to %TRUE if the %CLUTTER_ACTOR_MAPPED flag is set.
* *
@ -149,7 +149,7 @@
/** /**
* CLUTTER_ACTOR_IS_REALIZED: * CLUTTER_ACTOR_IS_REALIZED:
* @e: a #ClutterActor * @a: a #ClutterActor
* *
* Evaluates to %TRUE if the %CLUTTER_ACTOR_REALIZED flag is set. * Evaluates to %TRUE if the %CLUTTER_ACTOR_REALIZED flag is set.
* *
@ -167,7 +167,7 @@
/** /**
* CLUTTER_ACTOR_IS_VISIBLE: * CLUTTER_ACTOR_IS_VISIBLE:
* @e: a #ClutterActor * @a: a #ClutterActor
* *
* Evaluates to %TRUE if the actor has been shown, %FALSE if it's hidden. * Evaluates to %TRUE if the actor has been shown, %FALSE if it's hidden.
* Equivalent to the ClutterActor::visible object property. * Equivalent to the ClutterActor::visible object property.
@ -181,10 +181,12 @@
/** /**
* CLUTTER_ACTOR_IS_REACTIVE: * CLUTTER_ACTOR_IS_REACTIVE:
* @e: a #ClutterActor * @a: a #ClutterActor
* *
* Evaluates to %TRUE if the %CLUTTER_ACTOR_REACTIVE flag is set. * Evaluates to %TRUE if the %CLUTTER_ACTOR_REACTIVE flag is set.
* *
* Only reactive actors will receive event-related signals.
*
* Since: 0.6 * Since: 0.6
*/ */
@ -901,6 +903,7 @@ clutter_actor_real_unmap (ClutterActor *self)
NULL); NULL);
CLUTTER_ACTOR_UNSET_FLAGS (self, CLUTTER_ACTOR_MAPPED); CLUTTER_ACTOR_UNSET_FLAGS (self, CLUTTER_ACTOR_MAPPED);
/* notify on parent mapped after potentially unmapping /* notify on parent mapped after potentially unmapping
* children, so apps see a bottom-up notification. * children, so apps see a bottom-up notification.
*/ */
@ -1038,6 +1041,7 @@ clutter_actor_real_hide (ClutterActor *self)
if (CLUTTER_ACTOR_IS_VISIBLE (self)) if (CLUTTER_ACTOR_IS_VISIBLE (self))
{ {
CLUTTER_ACTOR_UNSET_FLAGS (self, CLUTTER_ACTOR_VISIBLE); CLUTTER_ACTOR_UNSET_FLAGS (self, CLUTTER_ACTOR_VISIBLE);
/* we notify on the "visible" flag in the clutter_actor_hide() /* we notify on the "visible" flag in the clutter_actor_hide()
* wrapper so the entire hide signal emission completes first * wrapper so the entire hide signal emission completes first
* (?) * (?)
@ -9180,3 +9184,139 @@ clutter_anchor_coord_is_zero (const AnchorCoord *coord)
&& coord->v.units.y == 0.0 && coord->v.units.y == 0.0
&& coord->v.units.z == 0.0); && coord->v.units.z == 0.0);
} }
/**
* clutter_actor_get_flags:
* @self: a #ClutterActor
*
* Retrieves the flags set on @self
*
* Return value: a bitwise or of #ClutterActorFlags or 0
*
* Since: 1.0
*/
ClutterActorFlags
clutter_actor_get_flags (ClutterActor *self)
{
g_return_val_if_fail (CLUTTER_IS_ACTOR (self), 0);
return self->flags;
}
/**
* clutter_actor_set_flags:
* @self: a #ClutterActor
* @flags: the flags to set
*
* Sets @flags on @self
*
* This function will emit notifications for the changed properties
*
* Since: 1.0
*/
void
clutter_actor_set_flags (ClutterActor *self,
ClutterActorFlags flags)
{
ClutterActorFlags old_flags;
GObject *obj;
gboolean was_reactive_set, reactive_set;
gboolean was_realized_set, realized_set;
gboolean was_mapped_set, mapped_set;
gboolean was_visible_set, visible_set;
g_return_if_fail (CLUTTER_IS_ACTOR (self));
if (self->flags == flags)
return;
obj = G_OBJECT (self);
g_object_freeze_notify (obj);
old_flags = self->flags;
was_reactive_set = ((old_flags & CLUTTER_ACTOR_REACTIVE) != 0);
was_realized_set = ((old_flags & CLUTTER_ACTOR_REALIZED) != 0);
was_mapped_set = ((old_flags & CLUTTER_ACTOR_MAPPED) != 0);
was_visible_set = ((old_flags & CLUTTER_ACTOR_VISIBLE) != 0);
self->flags |= flags;
reactive_set = ((self->flags & CLUTTER_ACTOR_REACTIVE) != 0);
realized_set = ((self->flags & CLUTTER_ACTOR_REALIZED) != 0);
mapped_set = ((self->flags & CLUTTER_ACTOR_MAPPED) != 0);
visible_set = ((self->flags & CLUTTER_ACTOR_VISIBLE) != 0);
if (reactive_set != was_reactive_set)
g_object_notify (obj, "reactive");
if (realized_set != was_realized_set)
g_object_notify (obj, "realized");
if (mapped_set != was_mapped_set)
g_object_notify (obj, "mapped");
if (visible_set != was_visible_set)
g_object_notify (obj, "visible");
g_object_thaw_notify (obj);
}
/**
* clutter_actor_unset_flags:
* @self: a #ClutterActor
* @flags: the flags to unset
*
* Unsets @flags on @self
*
* This function will emit notifications for the changed properties
*
* Since: 1.0
*/
void
clutter_actor_unset_flags (ClutterActor *self,
ClutterActorFlags flags)
{
ClutterActorFlags old_flags;
GObject *obj;
gboolean was_reactive_set, reactive_set;
gboolean was_realized_set, realized_set;
gboolean was_mapped_set, mapped_set;
gboolean was_visible_set, visible_set;
g_return_if_fail (CLUTTER_IS_ACTOR (self));
obj = G_OBJECT (self);
g_object_freeze_notify (obj);
old_flags = self->flags;
was_reactive_set = ((old_flags & CLUTTER_ACTOR_REACTIVE) != 0);
was_realized_set = ((old_flags & CLUTTER_ACTOR_REALIZED) != 0);
was_mapped_set = ((old_flags & CLUTTER_ACTOR_MAPPED) != 0);
was_visible_set = ((old_flags & CLUTTER_ACTOR_VISIBLE) != 0);
self->flags &= ~flags;
if (self->flags == old_flags)
return;
reactive_set = ((self->flags & CLUTTER_ACTOR_REACTIVE) != 0);
realized_set = ((self->flags & CLUTTER_ACTOR_REALIZED) != 0);
mapped_set = ((self->flags & CLUTTER_ACTOR_MAPPED) != 0);
visible_set = ((self->flags & CLUTTER_ACTOR_VISIBLE) != 0);
if (reactive_set != was_reactive_set)
g_object_notify (obj, "reactive");
if (realized_set != was_realized_set)
g_object_notify (obj, "realized");
if (mapped_set != was_mapped_set)
g_object_notify (obj, "mapped");
if (visible_set != was_visible_set)
g_object_notify (obj, "visible");
g_object_thaw_notify (obj);
}

View File

@ -74,10 +74,10 @@ G_BEGIN_DECLS
*/ */
#define CLUTTER_ACTOR_UNSET_FLAGS(a,f) (((ClutterActor*)(a))->flags &= ~(f)) #define CLUTTER_ACTOR_UNSET_FLAGS(a,f) (((ClutterActor*)(a))->flags &= ~(f))
#define CLUTTER_ACTOR_IS_MAPPED(e) ((((ClutterActor*)(e))->flags & CLUTTER_ACTOR_MAPPED) != FALSE) #define CLUTTER_ACTOR_IS_MAPPED(a) ((((ClutterActor*)(a))->flags & CLUTTER_ACTOR_MAPPED) != FALSE)
#define CLUTTER_ACTOR_IS_REALIZED(e) ((((ClutterActor*)(e))->flags & CLUTTER_ACTOR_REALIZED) != FALSE) #define CLUTTER_ACTOR_IS_REALIZED(a) ((((ClutterActor*)(a))->flags & CLUTTER_ACTOR_REALIZED) != FALSE)
#define CLUTTER_ACTOR_IS_VISIBLE(e) ((((ClutterActor*)(e))->flags & CLUTTER_ACTOR_VISIBLE) != FALSE) #define CLUTTER_ACTOR_IS_VISIBLE(a) ((((ClutterActor*)(a))->flags & CLUTTER_ACTOR_VISIBLE) != FALSE)
#define CLUTTER_ACTOR_IS_REACTIVE(e) ((((ClutterActor*)(e))->flags & CLUTTER_ACTOR_REACTIVE) != FALSE) #define CLUTTER_ACTOR_IS_REACTIVE(a) ((((ClutterActor*)(a))->flags & CLUTTER_ACTOR_REACTIVE) != FALSE)
typedef struct _ClutterActorClass ClutterActorClass; typedef struct _ClutterActorClass ClutterActorClass;
typedef struct _ClutterActorBox ClutterActorBox; typedef struct _ClutterActorBox ClutterActorBox;
@ -90,7 +90,8 @@ typedef struct _ClutterActorPrivate ClutterActorPrivate;
* *
* Generic callback * Generic callback
*/ */
typedef void (*ClutterCallback) (ClutterActor *actor, gpointer data); typedef void (*ClutterCallback) (ClutterActor *actor,
gpointer data);
/** /**
* CLUTTER_CALLBACK * CLUTTER_CALLBACK
@ -278,6 +279,12 @@ struct _ClutterActorClass
GType clutter_actor_get_type (void) G_GNUC_CONST; GType clutter_actor_get_type (void) G_GNUC_CONST;
void clutter_actor_set_flags (ClutterActor *self,
ClutterActorFlags flags);
void clutter_actor_unset_flags (ClutterActor *self,
ClutterActorFlags flags);
ClutterActorFlags clutter_actor_get_flags (ClutterActor *self);
void clutter_actor_show (ClutterActor *self); void clutter_actor_show (ClutterActor *self);
void clutter_actor_show_all (ClutterActor *self); void clutter_actor_show_all (ClutterActor *self);
void clutter_actor_hide (ClutterActor *self); void clutter_actor_hide (ClutterActor *self);