[mutter] clutter/actor: Reset allocation when unrealizing actor



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]