From 9581e9e31bdec1b1f816a16ef23398baedf2183b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Wed, 12 Aug 2020 19:32:54 +0200 Subject: [PATCH] tests/stage-view: Test timeline updates clock when parent moves Test that if a timeline got its frame clock from a parent of the associated actor, if that actor moves across the stage so that the stage views changes and thus the would be picked frame clock too, this is noticed by the timeline so that it also changes to the correct frame clock. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1404 --- src/tests/stage-view-tests.c | 77 ++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/src/tests/stage-view-tests.c b/src/tests/stage-view-tests.c index cff212d4f..163d677ac 100644 --- a/src/tests/stage-view-tests.c +++ b/src/tests/stage-view-tests.c @@ -898,6 +898,81 @@ meta_test_actor_stage_views_parent_views_rebuilt (void) clutter_actor_destroy (container); } +static void +meta_test_actor_stage_views_parent_views_changed (void) +{ + MetaBackend *backend = meta_get_backend (); + MetaMonitorManager *monitor_manager = + meta_backend_get_monitor_manager (backend); + MetaMonitorManagerTest *monitor_manager_test = + META_MONITOR_MANAGER_TEST (monitor_manager); + MonitorTestCaseSetup frame_clock_test_setup; + MetaMonitorTestSetup *test_setup; + ClutterActor *stage, *container, *test_actor; + GList *stage_views; + ClutterTimeline *timeline; + ClutterFrameClock *timeline_frame_clock; + ClutterFrameClock *first_view_frame_clock; + ClutterFrameClock *second_view_frame_clock; + + stage = meta_backend_get_stage (backend); + + frame_clock_test_setup = initial_test_case_setup; + test_setup = create_monitor_test_setup (&frame_clock_test_setup, + MONITOR_TEST_FLAG_NO_STORED); + meta_monitor_manager_test_emulate_hotplug (monitor_manager_test, test_setup); + + stage_views = clutter_stage_peek_stage_views (CLUTTER_STAGE (stage)); + g_assert_cmpint (g_list_length (stage_views), ==, 2); + + container = clutter_actor_new (); + clutter_actor_set_size (container, 100, 100); + clutter_actor_set_position (container, 0, 0); + clutter_actor_add_child (stage, container); + + test_actor = clutter_actor_new (); + clutter_actor_set_size (test_actor, 0, 0); + clutter_actor_add_child (container, test_actor); + + stage_views = clutter_stage_peek_stage_views (CLUTTER_STAGE (stage)); + g_assert_cmpint (g_list_length (stage_views), ==, 2); + clutter_actor_show (stage); + wait_for_paint (stage); + stage_views = clutter_stage_peek_stage_views (CLUTTER_STAGE (stage)); + g_assert_cmpint (g_list_length (stage_views), ==, 2); + + is_on_stage_views (test_actor, 0); + is_on_stage_views (container, 1, stage_views->data); + is_on_stage_views (stage, 2, + stage_views->data, + stage_views->next->data); + + timeline = clutter_timeline_new_for_actor (test_actor, 100); + clutter_timeline_start (timeline); + + first_view_frame_clock = + clutter_stage_view_get_frame_clock (stage_views->data); + second_view_frame_clock = + clutter_stage_view_get_frame_clock (stage_views->next->data); + g_assert_nonnull (first_view_frame_clock); + g_assert_nonnull (second_view_frame_clock); + + timeline_frame_clock = clutter_timeline_get_frame_clock (timeline); + + g_assert_nonnull (timeline_frame_clock); + g_assert (timeline_frame_clock == first_view_frame_clock); + + clutter_actor_set_x (container, 1200); + wait_for_paint (stage); + + timeline_frame_clock = clutter_timeline_get_frame_clock (timeline); + g_assert_nonnull (timeline_frame_clock); + g_assert (timeline_frame_clock == second_view_frame_clock); + + clutter_actor_destroy (test_actor); + clutter_actor_destroy (container); +} + static void init_tests (int argc, char **argv) { @@ -921,6 +996,8 @@ init_tests (int argc, char **argv) meta_test_actor_stage_views_timeline); g_test_add_func ("/stage-views/actor-stage-views-parent-rebuilt", meta_test_actor_stage_views_parent_views_rebuilt); + g_test_add_func ("/stage-views/actor-stage-views-parent-changed", + meta_test_actor_stage_views_parent_views_changed); } int