monitor-unit-tests: Check orientation changes with transformed panels
Ensure that orientation changes still work as expected when using a panel that has some native transformation. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2090>
This commit is contained in:
parent
54b36d77ab
commit
65df817096
@ -178,6 +178,12 @@ monitor_tests_alarm_filter (MetaX11Display *x11_display,
|
||||
x11_display, event);
|
||||
}
|
||||
|
||||
static void
|
||||
on_monitors_changed (gboolean *monitors_changed)
|
||||
{
|
||||
*monitors_changed = TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
create_monitor_test_clients (MetaContext *context)
|
||||
{
|
||||
@ -4377,6 +4383,7 @@ meta_test_monitor_orientation_changes (void)
|
||||
g_autoptr (MetaSensorsProxyAutoResetMock) orientation_mock = NULL;
|
||||
g_autoptr (MetaMonitorsConfig) initial_config = NULL;
|
||||
g_autoptr (MetaMonitorsConfig) previous_config = NULL;
|
||||
gboolean got_monitors_changed = FALSE;
|
||||
MetaOrientation i;
|
||||
unsigned int times_signalled = 0;
|
||||
|
||||
@ -4391,6 +4398,9 @@ meta_test_monitor_orientation_changes (void)
|
||||
meta_monitor_config_manager_get_previous (config_manager));
|
||||
g_set_object (&initial_config,
|
||||
meta_monitor_config_manager_get_current (config_manager));
|
||||
g_signal_connect_swapped (monitor_manager, "monitors-changed",
|
||||
G_CALLBACK (on_monitors_changed),
|
||||
&got_monitors_changed);
|
||||
|
||||
g_assert_cmpuint (
|
||||
meta_orientation_manager_get_orientation (orientation_manager),
|
||||
@ -4402,6 +4412,7 @@ meta_test_monitor_orientation_changes (void)
|
||||
MetaMonitorsConfig *current;
|
||||
MetaMonitorsConfig *previous;
|
||||
|
||||
got_monitors_changed = FALSE;
|
||||
meta_sensors_proxy_mock_set_orientation (orientation_mock, i);
|
||||
wait_for_orientation (orientation_manager, i, ×_signalled);
|
||||
g_assert_cmpuint (times_signalled, <=, 1);
|
||||
@ -4413,6 +4424,7 @@ meta_test_monitor_orientation_changes (void)
|
||||
current = meta_monitor_config_manager_get_current (config_manager);
|
||||
previous = meta_monitor_config_manager_get_previous (config_manager);
|
||||
|
||||
g_assert_true (got_monitors_changed);
|
||||
g_assert (previous == previous_config);
|
||||
g_assert (current != initial_config);
|
||||
g_assert_true (meta_monitors_config_key_equal (current->key,
|
||||
@ -4428,6 +4440,7 @@ meta_test_monitor_orientation_changes (void)
|
||||
g_set_object (&initial_config,
|
||||
meta_monitor_config_manager_get_current (config_manager));
|
||||
|
||||
got_monitors_changed = FALSE;
|
||||
meta_sensors_proxy_mock_set_orientation (orientation_mock,
|
||||
META_ORIENTATION_NORMAL);
|
||||
wait_for_orientation (orientation_manager, META_ORIENTATION_NORMAL,
|
||||
@ -4438,6 +4451,7 @@ meta_test_monitor_orientation_changes (void)
|
||||
&test_case, 0, META_ORIENTATION_NORMAL,
|
||||
1024, 768));
|
||||
|
||||
g_assert_false (got_monitors_changed);
|
||||
g_assert (meta_monitor_config_manager_get_current (config_manager) ==
|
||||
initial_config);
|
||||
|
||||
@ -4450,6 +4464,7 @@ meta_test_monitor_orientation_changes (void)
|
||||
MetaMonitorsConfig *current;
|
||||
MetaMonitorsConfig *previous;
|
||||
|
||||
got_monitors_changed = FALSE;
|
||||
meta_sensors_proxy_mock_set_orientation (orientation_mock, i);
|
||||
wait_for_orientation (orientation_manager, i, ×_signalled);
|
||||
g_assert_cmpuint (times_signalled, <=, 1);
|
||||
@ -4464,9 +4479,225 @@ meta_test_monitor_orientation_changes (void)
|
||||
|
||||
g_assert (previous == previous_config);
|
||||
g_assert (current == initial_config);
|
||||
g_assert_false (got_monitors_changed);
|
||||
}
|
||||
|
||||
g_signal_handlers_disconnect_by_data (monitor_manager, &got_monitors_changed);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_test_monitor_orientation_changes_for_transformed_panel (void)
|
||||
{
|
||||
MonitorTestCase test_case = {
|
||||
.setup = {
|
||||
.modes = {
|
||||
{
|
||||
.width = 1024,
|
||||
.height = 768,
|
||||
.refresh_rate = 60.000495910644531
|
||||
}
|
||||
},
|
||||
.n_modes = 1,
|
||||
.outputs = {
|
||||
{
|
||||
.crtc = 0,
|
||||
.modes = { 0 },
|
||||
.n_modes = 1,
|
||||
.preferred_mode = 0,
|
||||
.possible_crtcs = { 0 },
|
||||
.n_possible_crtcs = 1,
|
||||
.width_mm = 222,
|
||||
.height_mm = 125,
|
||||
.is_laptop_panel = TRUE,
|
||||
.panel_orientation_transform = META_MONITOR_TRANSFORM_90,
|
||||
},
|
||||
},
|
||||
.n_outputs = 1,
|
||||
.crtcs = {
|
||||
{
|
||||
.current_mode = 0
|
||||
},
|
||||
},
|
||||
.n_crtcs = 1
|
||||
},
|
||||
|
||||
.expect = {
|
||||
.monitors = {
|
||||
{
|
||||
.outputs = { 0 },
|
||||
.n_outputs = 1,
|
||||
.modes = {
|
||||
{
|
||||
.width = 768,
|
||||
.height = 1024,
|
||||
.refresh_rate = 60.000495910644531,
|
||||
.crtc_modes = {
|
||||
{
|
||||
.output = 0,
|
||||
.crtc_mode = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
.n_modes = 1,
|
||||
.current_mode = 0,
|
||||
.width_mm = 222,
|
||||
.height_mm = 125,
|
||||
}
|
||||
},
|
||||
.n_monitors = 1,
|
||||
.logical_monitors = {
|
||||
{
|
||||
.monitors = { 0 },
|
||||
.n_monitors = 1,
|
||||
.layout = { .x = 0, .y = 0, .width = 1024, .height = 768 },
|
||||
.scale = 1
|
||||
}
|
||||
},
|
||||
.n_logical_monitors = 1,
|
||||
.primary_logical_monitor = 0,
|
||||
.n_outputs = 1,
|
||||
.crtcs = {
|
||||
{
|
||||
.current_mode = 0,
|
||||
}
|
||||
},
|
||||
.n_crtcs = 1,
|
||||
.n_tiled_monitors = 0,
|
||||
.screen_width = 1024,
|
||||
.screen_height = 768
|
||||
}
|
||||
};
|
||||
MetaMonitorTestSetup *test_setup;
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaMonitorManager *monitor_manager =
|
||||
meta_backend_get_monitor_manager (backend);
|
||||
MetaMonitorConfigManager *config_manager = monitor_manager->config_manager;
|
||||
MetaOrientationManager *orientation_manager =
|
||||
meta_backend_get_orientation_manager (backend);
|
||||
g_autoptr (ClutterAutoRemoveInputDevice) touch_device = NULL;
|
||||
g_autoptr (MetaSensorsProxyAutoResetMock) orientation_mock = NULL;
|
||||
g_autoptr (MetaMonitorsConfig) initial_config = NULL;
|
||||
g_autoptr (MetaMonitorsConfig) previous_config = NULL;
|
||||
gboolean got_monitors_changed = FALSE;
|
||||
MetaOrientation i;
|
||||
unsigned int times_signalled = 0;
|
||||
|
||||
g_test_message ("%s", G_STRFUNC);
|
||||
orientation_mock = meta_sensors_proxy_mock_get ();
|
||||
touch_device = meta_test_add_touch_device (backend);
|
||||
test_setup = create_monitor_test_setup (&test_case.setup,
|
||||
MONITOR_TEST_FLAG_NO_STORED);
|
||||
emulate_hotplug (test_setup);
|
||||
|
||||
g_set_object (&previous_config,
|
||||
meta_monitor_config_manager_get_previous (config_manager));
|
||||
g_set_object (&initial_config,
|
||||
meta_monitor_config_manager_get_current (config_manager));
|
||||
g_signal_connect_swapped (monitor_manager, "monitors-changed",
|
||||
G_CALLBACK (on_monitors_changed),
|
||||
&got_monitors_changed);
|
||||
|
||||
g_assert_cmpuint (
|
||||
meta_orientation_manager_get_orientation (orientation_manager),
|
||||
==,
|
||||
META_ORIENTATION_UNDEFINED);
|
||||
|
||||
for (i = META_N_ORIENTATIONS - 1; i > META_ORIENTATION_UNDEFINED; i--)
|
||||
{
|
||||
MetaMonitorsConfig *current;
|
||||
MetaMonitorsConfig *previous;
|
||||
|
||||
got_monitors_changed = FALSE;
|
||||
meta_sensors_proxy_mock_set_orientation (orientation_mock, i);
|
||||
wait_for_orientation (orientation_manager, i, ×_signalled);
|
||||
g_assert_cmpuint (times_signalled, <=, 1);
|
||||
|
||||
META_TEST_LOG_CALL ("Checking configuration per orientation",
|
||||
check_monitor_configuration_per_orientation (
|
||||
&test_case, 0, i, 1024, 768));
|
||||
|
||||
current = meta_monitor_config_manager_get_current (config_manager);
|
||||
previous = meta_monitor_config_manager_get_previous (config_manager);
|
||||
|
||||
g_assert_true (got_monitors_changed);
|
||||
g_assert (previous == previous_config);
|
||||
g_assert (current != initial_config);
|
||||
g_assert_true (meta_monitors_config_key_equal (current->key,
|
||||
initial_config->key));
|
||||
}
|
||||
|
||||
/* Ensure applying the current orientation doesn't change the config */
|
||||
g_assert_cmpuint (
|
||||
meta_orientation_manager_get_orientation (orientation_manager),
|
||||
==,
|
||||
META_ORIENTATION_NORMAL);
|
||||
|
||||
g_set_object (&initial_config,
|
||||
meta_monitor_config_manager_get_current (config_manager));
|
||||
|
||||
got_monitors_changed = FALSE;
|
||||
meta_sensors_proxy_mock_set_orientation (orientation_mock,
|
||||
META_ORIENTATION_NORMAL);
|
||||
wait_for_orientation (orientation_manager, META_ORIENTATION_NORMAL,
|
||||
×_signalled);
|
||||
g_assert_cmpuint (times_signalled, ==, 0);
|
||||
META_TEST_LOG_CALL ("Checking configuration per orientation",
|
||||
check_monitor_configuration_per_orientation (
|
||||
&test_case, 0, META_ORIENTATION_NORMAL,
|
||||
1024, 768));
|
||||
|
||||
g_assert_false (got_monitors_changed);
|
||||
g_assert (meta_monitor_config_manager_get_current (config_manager) ==
|
||||
initial_config);
|
||||
|
||||
/* When no touch device is available, the orientation changes are ignored */
|
||||
g_test_message ("Removing touch device");
|
||||
meta_backend_test_remove_device (META_BACKEND_TEST (backend), touch_device);
|
||||
|
||||
for (i = META_N_ORIENTATIONS - 1; i > META_ORIENTATION_UNDEFINED; i--)
|
||||
{
|
||||
MetaMonitorsConfig *current;
|
||||
MetaMonitorsConfig *previous;
|
||||
|
||||
got_monitors_changed = FALSE;
|
||||
meta_sensors_proxy_mock_set_orientation (orientation_mock, i);
|
||||
wait_for_orientation (orientation_manager, i, ×_signalled);
|
||||
g_assert_cmpuint (times_signalled, <=, 1);
|
||||
|
||||
META_TEST_LOG_CALL ("Checking configuration per orientation",
|
||||
check_monitor_configuration_per_orientation (
|
||||
&test_case, 0, META_ORIENTATION_NORMAL,
|
||||
1024, 768));
|
||||
|
||||
current = meta_monitor_config_manager_get_current (config_manager);
|
||||
previous = meta_monitor_config_manager_get_previous (config_manager);
|
||||
|
||||
g_assert (previous == previous_config);
|
||||
g_assert (current == initial_config);
|
||||
g_assert_false (got_monitors_changed);
|
||||
}
|
||||
|
||||
g_assert_cmpuint (
|
||||
meta_orientation_manager_get_orientation (orientation_manager),
|
||||
==,
|
||||
META_ORIENTATION_NORMAL);
|
||||
|
||||
meta_test_add_touch_device (backend);
|
||||
got_monitors_changed = FALSE;
|
||||
meta_sensors_proxy_mock_set_orientation (orientation_mock,
|
||||
META_ORIENTATION_RIGHT_UP);
|
||||
wait_for_orientation (orientation_manager,
|
||||
META_ORIENTATION_RIGHT_UP,
|
||||
×_signalled);
|
||||
g_assert_cmpuint (times_signalled, <=, 1);
|
||||
META_TEST_LOG_CALL ("Checking configuration per orientation",
|
||||
check_monitor_configuration_per_orientation (
|
||||
&test_case, 0, META_ORIENTATION_RIGHT_UP,
|
||||
1024, 768));
|
||||
g_assert_true (got_monitors_changed);
|
||||
|
||||
g_signal_handlers_disconnect_by_data (monitor_manager, &got_monitors_changed);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -8613,6 +8844,8 @@ init_monitor_tests (void)
|
||||
meta_test_monitor_orientation_initial_stored_rotated_no_touch);
|
||||
add_monitor_test ("/backends/monitor/orientation/changes",
|
||||
meta_test_monitor_orientation_changes);
|
||||
add_monitor_test ("/backends/monitor/orientation/changes-transformed-panel",
|
||||
meta_test_monitor_orientation_changes_for_transformed_panel);
|
||||
add_monitor_test ("/backends/monitor/orientation/changes-with-hotplugging",
|
||||
meta_test_monitor_orientation_changes_with_hotplugging);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user