diff --git a/clutter/clutter/clutter-actor.c b/clutter/clutter/clutter-actor.c index d711f0607..ebbd5303e 100644 --- a/clutter/clutter/clutter-actor.c +++ b/clutter/clutter/clutter-actor.c @@ -1778,6 +1778,15 @@ clutter_actor_unmap (ClutterActor *self) clutter_actor_update_map_state (self, MAP_STATE_MAKE_UNMAPPED); } +static void +clutter_actor_queue_shallow_relayout (ClutterActor *self) +{ + ClutterActor *stage = _clutter_actor_get_stage_internal (self); + + if (stage != NULL) + clutter_stage_queue_actor_relayout (CLUTTER_STAGE (stage), self); +} + static void clutter_actor_real_show (ClutterActor *self) { @@ -1811,6 +1820,11 @@ clutter_actor_real_show (ClutterActor *self) clutter_actor_queue_relayout (self); } + else /* but still don't leave the actor un-allocated before showing it */ + { + clutter_actor_queue_shallow_relayout (self); + clutter_actor_queue_redraw (self); + } } static inline void @@ -2864,9 +2878,23 @@ clutter_actor_real_queue_relayout (ClutterActor *self) memset (priv->height_requests, 0, N_CACHED_SIZE_REQUESTS * sizeof (SizeRequest)); - /* We need to go all the way up the hierarchy */ + /* We may need to go all the way up the hierarchy */ if (priv->parent != NULL) - _clutter_actor_queue_only_relayout (priv->parent); + { + if (priv->parent->flags & CLUTTER_ACTOR_NO_LAYOUT) + { + clutter_actor_queue_shallow_relayout (self); + + /* The above might have invalidated the parent's paint volume if self + * has moved or resized. DnD seems to require this... + */ + priv->parent->priv->needs_paint_volume_update = TRUE; + } + else + { + _clutter_actor_queue_only_relayout (priv->parent); + } + } } /**