From de610a13f1ad1e7e34d4b9a81df58d4da3693059 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= Date: Thu, 2 Jul 2020 22:23:30 +0200 Subject: [PATCH] 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 67fa5a270..e3f698b25 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; }