diff --git a/clutter/clutter/clutter-actor.c b/clutter/clutter/clutter-actor.c index d35dffb02..2841be091 100644 --- a/clutter/clutter/clutter-actor.c +++ b/clutter/clutter/clutter-actor.c @@ -17715,10 +17715,42 @@ _clutter_actor_compute_resource_scale (ClutterActor *self, resource_scale)) { if (priv->parent) - return _clutter_actor_compute_resource_scale (priv->parent, - resource_scale); + { + gboolean in_clone_paint; + gboolean was_parent_in_clone_paint; + gboolean was_parent_unmapped; + gboolean was_parent_paint_unmapped; + gboolean ret; + + in_clone_paint = clutter_actor_is_in_clone_paint (self); + was_parent_unmapped = !clutter_actor_is_mapped (priv->parent); + was_parent_in_clone_paint = + clutter_actor_is_in_clone_paint (priv->parent); + was_parent_paint_unmapped = priv->parent->priv->enable_paint_unmapped; + + if (in_clone_paint && was_parent_unmapped) + { + _clutter_actor_set_in_clone_paint (priv->parent, TRUE); + _clutter_actor_set_enable_paint_unmapped (priv->parent, TRUE); + } + + ret = _clutter_actor_compute_resource_scale (priv->parent, + resource_scale); + + if (in_clone_paint && was_parent_unmapped) + { + _clutter_actor_set_in_clone_paint (priv->parent, + was_parent_in_clone_paint); + _clutter_actor_set_enable_paint_unmapped (priv->parent, + was_parent_paint_unmapped); + } + + return ret; + } else - return FALSE; + { + return FALSE; + } } return TRUE; diff --git a/src/tests/clutter/conform/actor-clone.c b/src/tests/clutter/conform/actor-clone.c new file mode 100644 index 000000000..e78bf9baf --- /dev/null +++ b/src/tests/clutter/conform/actor-clone.c @@ -0,0 +1,68 @@ +#include +#include + +#include + +#include "tests/clutter-test-utils.h" + +static void +on_presented (ClutterStage *stage, + CoglFrameEvent *frame_event, + ClutterFrameInfo *frame_info, + gboolean *was_presented) +{ + *was_presented = TRUE; +} + +static void +actor_clone_unmapped (void) +{ + ClutterActor *container; + ClutterActor *actor; + ClutterActor *clone; + ClutterActor *stage; + gboolean was_presented; + + stage = clutter_test_get_stage (); + + container = clutter_actor_new (); + g_object_ref_sink (container); + g_object_add_weak_pointer (G_OBJECT (container), (gpointer *) &container); + + actor = clutter_actor_new (); + g_object_ref_sink (actor); + g_object_add_weak_pointer (G_OBJECT (actor), (gpointer *) &actor); + + clone = clutter_clone_new (actor); + g_object_ref_sink (clone); + g_object_add_weak_pointer (G_OBJECT (clone), (gpointer *) &clone); + + clutter_actor_hide (container); + clutter_actor_hide (actor); + + clutter_actor_add_child (stage, container); + clutter_actor_add_child (container, actor); + clutter_actor_add_child (stage, clone); + + clutter_actor_set_offscreen_redirect (actor, CLUTTER_OFFSCREEN_REDIRECT_ALWAYS); + + g_signal_connect (stage, "presented", G_CALLBACK (on_presented), + &was_presented); + + clutter_actor_show (stage); + + was_presented = FALSE; + while (!was_presented) + g_main_context_iteration (NULL, FALSE); + + clutter_actor_destroy (clone); + clutter_actor_destroy (actor); + clutter_actor_destroy (container); + g_assert_null (clone); + g_assert_null (actor); + g_assert_null (container); +} + +CLUTTER_TEST_SUITE ( + CLUTTER_TEST_UNIT ("/actor/clone/unmapped", actor_clone_unmapped) +) diff --git a/src/tests/clutter/conform/meson.build b/src/tests/clutter/conform/meson.build index d565934d4..320b00cf4 100644 --- a/src/tests/clutter/conform/meson.build +++ b/src/tests/clutter/conform/meson.build @@ -10,6 +10,7 @@ clutter_tests_conform_link_args = [ clutter_conform_tests_actor_tests = [ 'actor-anchors', + 'actor-clone', 'actor-destroy', 'actor-graph', 'actor-invariants',