mirror of
https://github.com/brl/mutter.git
synced 2024-11-23 00:20:42 -05:00
align: Check that source is not contained inside the actor
AlignConstraint won't work if the source is a child or a grandchild of the ClutterActorMeta:actor to which it has been attached to: the allocation flows from the parent to its children, not the other way around; in order to avoid weirdness, we better document and check that when we set the actor and when we set the source.
This commit is contained in:
parent
83060b30d1
commit
e6dbdb444d
@ -40,6 +40,8 @@
|
|||||||
|
|
||||||
#include "clutter-align-constraint.h"
|
#include "clutter-align-constraint.h"
|
||||||
|
|
||||||
|
#include "clutter-actor-meta-private.h"
|
||||||
|
#include "clutter-actor-private.h"
|
||||||
#include "clutter-constraint.h"
|
#include "clutter-constraint.h"
|
||||||
#include "clutter-debug.h"
|
#include "clutter-debug.h"
|
||||||
#include "clutter-enum-types.h"
|
#include "clutter-enum-types.h"
|
||||||
@ -107,6 +109,19 @@ clutter_align_constraint_set_actor (ClutterActorMeta *meta,
|
|||||||
ClutterAlignConstraint *align = CLUTTER_ALIGN_CONSTRAINT (meta);
|
ClutterAlignConstraint *align = CLUTTER_ALIGN_CONSTRAINT (meta);
|
||||||
ClutterActorMetaClass *parent;
|
ClutterActorMetaClass *parent;
|
||||||
|
|
||||||
|
if (new_actor != NULL &&
|
||||||
|
align->source != NULL &&
|
||||||
|
clutter_actor_contains (new_actor, align->source))
|
||||||
|
{
|
||||||
|
g_warning (G_STRLOC ": The source actor '%s' is contained "
|
||||||
|
"by the actor '%s' associated to the constraint "
|
||||||
|
"'%s'",
|
||||||
|
_clutter_actor_get_debug_name (align->source),
|
||||||
|
_clutter_actor_get_debug_name (new_actor),
|
||||||
|
_clutter_actor_meta_get_debug_name (meta));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* store the pointer to the actor, for later use */
|
/* store the pointer to the actor, for later use */
|
||||||
align->actor = new_actor;
|
align->actor = new_actor;
|
||||||
|
|
||||||
@ -243,7 +258,10 @@ clutter_align_constraint_class_init (ClutterAlignConstraintClass *klass)
|
|||||||
/**
|
/**
|
||||||
* ClutterAlignConstraint:source:
|
* ClutterAlignConstraint:source:
|
||||||
*
|
*
|
||||||
* The #ClutterActor used as the source for the alignment
|
* The #ClutterActor used as the source for the alignment.
|
||||||
|
*
|
||||||
|
* The #ClutterActor must not be a child or a grandchild of the actor
|
||||||
|
* using the constraint.
|
||||||
*
|
*
|
||||||
* Since: 1.4
|
* Since: 1.4
|
||||||
*/
|
*/
|
||||||
@ -346,7 +364,8 @@ void
|
|||||||
clutter_align_constraint_set_source (ClutterAlignConstraint *align,
|
clutter_align_constraint_set_source (ClutterAlignConstraint *align,
|
||||||
ClutterActor *source)
|
ClutterActor *source)
|
||||||
{
|
{
|
||||||
ClutterActor *old_source;
|
ClutterActor *old_source, *actor;
|
||||||
|
ClutterActorMeta *meta;
|
||||||
|
|
||||||
g_return_if_fail (CLUTTER_IS_ALIGN_CONSTRAINT (align));
|
g_return_if_fail (CLUTTER_IS_ALIGN_CONSTRAINT (align));
|
||||||
g_return_if_fail (source == NULL || CLUTTER_IS_ACTOR (source));
|
g_return_if_fail (source == NULL || CLUTTER_IS_ACTOR (source));
|
||||||
@ -354,6 +373,22 @@ clutter_align_constraint_set_source (ClutterAlignConstraint *align,
|
|||||||
if (align->source == source)
|
if (align->source == source)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
meta = CLUTTER_ACTOR_META (align);
|
||||||
|
actor = clutter_actor_meta_get_actor (meta);
|
||||||
|
if (actor != NULL && source != NULL)
|
||||||
|
{
|
||||||
|
if (clutter_actor_contains (actor, source))
|
||||||
|
{
|
||||||
|
g_warning (G_STRLOC ": The source actor '%s' is contained "
|
||||||
|
"by the actor '%s' associated to the constraint "
|
||||||
|
"'%s'",
|
||||||
|
_clutter_actor_get_debug_name (source),
|
||||||
|
_clutter_actor_get_debug_name (actor),
|
||||||
|
_clutter_actor_meta_get_debug_name (meta));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
old_source = align->source;
|
old_source = align->source;
|
||||||
if (old_source != NULL)
|
if (old_source != NULL)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user