[mutter] clutter/actor: Reset allocation when unrealizing actor
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] clutter/actor: Reset allocation when unrealizing actor
- Date: Tue, 20 Oct 2020 16:30:51 +0000 (UTC)
commit de610a13f1ad1e7e34d4b9a81df58d4da3693059
Author: Jonas Dreßler <verdre v0yd nl>
Date: Thu Jul 2 22:23:30 2020 +0200
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
clutter/clutter/clutter-actor.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
---
diff --git a/clutter/clutter/clutter-actor.c b/clutter/clutter/clutter-actor.c
index 67fa5a2705..e3f698b253 100644
--- a/clutter/clutter/clutter-actor.c
+++ b/clutter/clutter/clutter-actor.c
@@ -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;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]