mirror of
https://github.com/brl/mutter.git
synced 2024-11-21 23:50:41 -05:00
clutter/actor: Reset allocation when unrealizing actor
Since commit eb9cd3857d
we initialize the allocation of ClutterActors to
an UNINITIALIZED ClutterActorBox. We do that to ensure the actor even
emits notify::allocation in case it got a new valid allocation of
0,0,0,0.
Now there's still the case where an actor gets removed from the
scenegraph and added again to a different parent, in this case we still
don't emit notify::allocation right now in case the new allocation
equals the old one. There's two good reasons to do so though:
1) To Clutter, there's no difference between a newly created actor and
an actor which got removed from the scenegraph, it's not consistent to
always notify the allocation property in the former situation, but not
always notify it in the latter situation.
2) When an allocation changes, Clutter notifies the subtree of that
actor about an absolute geometry change (see the call to
transform_changed() in clutter_actor_set_allocation_internal()). Now
when an actor gets reparented, obviously the absolute geometry might
change, so to make sure transform_changed() is always called in that
case we need to make sure an allocation change happens.
So simply reset the allocation property of the actor to an UNINITIALIZED
ClutterActorBox as soon as it gets unrealized.
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1498
This commit is contained in:
parent
76578e5aa0
commit
de610a13f1
@ -2201,6 +2201,7 @@ unrealize_actor_after_children_cb (ClutterActor *self,
|
||||
int depth,
|
||||
void *user_data)
|
||||
{
|
||||
ClutterActorPrivate *priv = self->priv;
|
||||
ClutterActor *stage = user_data;
|
||||
|
||||
/* We want to unset the realized flag only _after_
|
||||
@ -2210,10 +2211,13 @@ unrealize_actor_after_children_cb (ClutterActor *self,
|
||||
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_REALIZED]);
|
||||
|
||||
if (stage != NULL &&
|
||||
self->priv->parent != NULL &&
|
||||
self->priv->parent->flags & CLUTTER_ACTOR_NO_LAYOUT)
|
||||
priv->parent != NULL &&
|
||||
priv->parent->flags & CLUTTER_ACTOR_NO_LAYOUT)
|
||||
clutter_stage_dequeue_actor_relayout (CLUTTER_STAGE (stage), self);
|
||||
|
||||
if (priv->unmapped_paint_branch_counter == 0)
|
||||
priv->allocation = (ClutterActorBox) CLUTTER_ACTOR_BOX_UNINITIALIZED;
|
||||
|
||||
return CLUTTER_ACTOR_TRAVERSE_VISIT_CONTINUE;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user