From f93e85f69b9d63d4bedeaf778d5f620ad64ddab4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Date: Mon, 28 Oct 2024 08:44:35 +0100 Subject: [PATCH 2/5] monitor: Keep track of the for lease status Add a flag to MetaMonitor indicating if the monitor is available for lease and store/update it from the monitor configuration. Also, add unit tests validating that the configuration is applied and that invalid configurations fail. Part-of: --- src/backends/meta-monitor-config-manager.c | 10 +- src/backends/meta-monitor-manager-private.h | 3 + src/backends/meta-monitor-manager.c | 41 +++++ src/backends/meta-monitor.c | 19 ++ src/backends/meta-monitor.h | 6 + .../native/meta-monitor-manager-native.c | 1 + .../monitor-configs/forlease-invalid.xml | 32 ++++ src/tests/monitor-configs/forlease.xml | 40 +++++ src/tests/monitor-unit-tests.c | 165 ++++++++++++++++++ 9 files changed, 316 insertions(+), 1 deletion(-) create mode 100644 src/tests/monitor-configs/forlease-invalid.xml create mode 100644 src/tests/monitor-configs/forlease.xml diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c index ecf4ee8202..0df193f0a4 100644 --- a/src/backends/meta-monitor-config-manager.c +++ b/src/backends/meta-monitor-config-manager.c @@ -1628,6 +1628,7 @@ meta_monitors_config_new (MetaMonitorManager *monitor_manager, MetaMonitorsConfigFlag flags) { GList *disabled_monitor_specs = NULL; + GList *for_lease_monitor_specs = NULL; GList *monitors; GList *l; @@ -1649,11 +1650,18 @@ meta_monitors_config_new (MetaMonitorManager *monitor_manager, disabled_monitor_specs = g_list_prepend (disabled_monitor_specs, meta_monitor_spec_clone (monitor_spec)); + + if (meta_monitor_is_for_lease (monitor)) + { + for_lease_monitor_specs = + g_list_prepend (for_lease_monitor_specs, + meta_monitor_spec_clone (monitor_spec)); + } } return meta_monitors_config_new_full (logical_monitor_configs, disabled_monitor_specs, - NULL, + for_lease_monitor_specs, layout_mode, flags); } diff --git a/src/backends/meta-monitor-manager-private.h b/src/backends/meta-monitor-manager-private.h index 977ce417cc..66492c2a5f 100644 --- a/src/backends/meta-monitor-manager-private.h +++ b/src/backends/meta-monitor-manager-private.h @@ -345,6 +345,9 @@ META_EXPORT_TEST void meta_monitor_manager_update_logical_state (MetaMonitorManager *manager, MetaMonitorsConfig *config); +void meta_monitor_manager_update_for_lease_state (MetaMonitorManager *manager, + MetaMonitorsConfig *config); + META_EXPORT_TEST void meta_monitor_manager_update_logical_state_derived (MetaMonitorManager *manager, MetaMonitorsConfig *config); diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c index 4fcc8a696c..55816ed7bb 100644 --- a/src/backends/meta-monitor-manager.c +++ b/src/backends/meta-monitor-manager.c @@ -3824,6 +3824,46 @@ meta_monitor_manager_update_logical_state (MetaMonitorManager *manager, meta_monitor_manager_rebuild_logical_monitors (manager, config); } +static gboolean +is_monitor_configured_for_lease (MetaMonitor *monitor, + MetaMonitorsConfig *config) +{ + MetaMonitorSpec *monitor_spec; + GList *l; + + monitor_spec = meta_monitor_get_spec (monitor); + + for (l = config->for_lease_monitor_specs; l; l = l->next) + { + MetaMonitorSpec *spec = l->data; + + if (meta_monitor_spec_equals (monitor_spec, spec)) + return TRUE; + } + + return FALSE; +} + +void +meta_monitor_manager_update_for_lease_state (MetaMonitorManager *manager, + MetaMonitorsConfig *config) +{ + GList *l; + + for (l = manager->monitors; l; l = l->next) + { + MetaMonitor *monitor = l->data; + gboolean is_for_lease; + + if (config) + is_for_lease = is_monitor_configured_for_lease (monitor, config); + else + is_for_lease = FALSE; + + meta_monitor_set_for_lease (monitor, is_for_lease); + } +} + void meta_monitor_manager_rebuild (MetaMonitorManager *manager, MetaMonitorsConfig *config) @@ -3838,6 +3878,7 @@ meta_monitor_manager_rebuild (MetaMonitorManager *manager, old_logical_monitors = manager->logical_monitors; meta_monitor_manager_update_logical_state (manager, config); + meta_monitor_manager_update_for_lease_state (manager, config); ensure_privacy_screen_settings (manager); diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c index b7efabda2c..badde7cea2 100644 --- a/src/backends/meta-monitor.c +++ b/src/backends/meta-monitor.c @@ -67,6 +67,8 @@ typedef struct _MetaMonitorPrivate MetaLogicalMonitor *logical_monitor; char *display_name; + + gboolean is_for_lease; } MetaMonitorPrivate; G_DEFINE_TYPE_WITH_PRIVATE (MetaMonitor, meta_monitor, G_TYPE_OBJECT) @@ -2459,3 +2461,20 @@ meta_monitor_get_backlight (MetaMonitor *monitor, return FALSE; } } + +void +meta_monitor_set_for_lease (MetaMonitor *monitor, + gboolean for_lease) +{ + MetaMonitorPrivate *priv = meta_monitor_get_instance_private (monitor); + + priv->is_for_lease = for_lease; +} + +gboolean +meta_monitor_is_for_lease (MetaMonitor *monitor) +{ + MetaMonitorPrivate *priv = meta_monitor_get_instance_private (monitor); + + return priv->is_for_lease; +} diff --git a/src/backends/meta-monitor.h b/src/backends/meta-monitor.h index 01836dc0e7..cc11348b35 100644 --- a/src/backends/meta-monitor.h +++ b/src/backends/meta-monitor.h @@ -349,4 +349,10 @@ META_EXPORT_TEST gboolean meta_monitor_get_backlight (MetaMonitor *monitor, int *value); +void meta_monitor_set_for_lease (MetaMonitor *monitor, + gboolean for_lease); + +META_EXPORT_TEST +gboolean meta_monitor_is_for_lease (MetaMonitor *monitor); + G_DEFINE_AUTOPTR_CLEANUP_FUNC (MetaMonitorSpec, meta_monitor_spec_free) diff --git a/src/backends/native/meta-monitor-manager-native.c b/src/backends/native/meta-monitor-manager-native.c index 668f4e0eb4..21cc1b95be 100644 --- a/src/backends/native/meta-monitor-manager-native.c +++ b/src/backends/native/meta-monitor-manager-native.c @@ -156,6 +156,7 @@ meta_monitor_manager_native_ensure_initial_config (MetaMonitorManager *manager) config = meta_monitor_manager_ensure_configured (manager); meta_monitor_manager_update_logical_state (manager, config); + meta_monitor_manager_update_for_lease_state (manager, config); } static void diff --git a/src/tests/monitor-configs/forlease-invalid.xml b/src/tests/monitor-configs/forlease-invalid.xml new file mode 100644 index 0000000000..4a7ff9d5da --- /dev/null +++ b/src/tests/monitor-configs/forlease-invalid.xml @@ -0,0 +1,32 @@ + + + logical + + 0 + 0 + 1 + yes + + + DP-1 + MetaProduct's Inc. + MetaMonitor + 0x123456 + + + 800 + 600 + 60 + + + + + + DP-1 + MetaProduct's Inc. + MetaMonitor + 0x123456 + + + + diff --git a/src/tests/monitor-configs/forlease.xml b/src/tests/monitor-configs/forlease.xml new file mode 100644 index 0000000000..482f095a6d --- /dev/null +++ b/src/tests/monitor-configs/forlease.xml @@ -0,0 +1,40 @@ + + + logical + + 0 + 0 + 1 + yes + + + DP-1 + MetaProduct's Inc. + MetaMonitor + 0x123456 + + + 800 + 600 + 60 + + + + + + DP-2 + MetaProduct's Inc. + MetaMonitor + 0x654321 + + + + + DP-2 + MetaProduct's Inc. + MetaMonitor + 0x654321 + + + + diff --git a/src/tests/monitor-unit-tests.c b/src/tests/monitor-unit-tests.c index 2414789bab..326dd83855 100644 --- a/src/tests/monitor-unit-tests.c +++ b/src/tests/monitor-unit-tests.c @@ -9176,6 +9176,167 @@ meta_test_monitor_custom_detached_groups (void) g_assert_cmpstr (error->message, ==, "Logical monitors not adjacent"); } +static void +meta_test_monitor_custom_for_lease_config (void) +{ + MonitorTestCase test_case = { + .setup = { + .modes = { + { + .width = 800, + .height = 600, + .refresh_rate = 60.0 + } + }, + .n_modes = 1, + .outputs = { + { + .crtc = -1, + .modes = { 0 }, + .n_modes = 1, + .preferred_mode = 0, + .possible_crtcs = { 0, 1 }, + .n_possible_crtcs = 2, + .width_mm = 222, + .height_mm = 125, + .serial = "0x123456", + }, + { + .crtc = -1, + .modes = { 0 }, + .n_modes = 1, + .preferred_mode = 0, + .possible_crtcs = { 0, 1 }, + .n_possible_crtcs = 2, + .width_mm = 222, + .height_mm = 125, + .serial = "0x654321" + } + }, + .n_outputs = 2, + .crtcs = { + { + .current_mode = -1 + }, + { + .current_mode = -1 + } + }, + .n_crtcs = 2 + }, + + .expect = { + .monitors = { + { + .outputs = { 0 }, + .n_outputs = 1, + .modes = { + { + .width = 800, + .height = 600, + .refresh_rate = 60.0, + .crtc_modes = { + { + .output = 0, + .crtc_mode = 0 + } + } + } + }, + .n_modes = 1, + .current_mode = 0, + .width_mm = 222, + .height_mm = 125 + }, + { + .outputs = { 1 }, + .n_outputs = 1, + .modes = { + { + .width = 800, + .height = 600, + .refresh_rate = 60.0, + .crtc_modes = { + { + .output = 1, + .crtc_mode = 0 + } + } + } + }, + .n_modes = 1, + .current_mode = -1, + .width_mm = 222, + .height_mm = 125 + } + }, + .n_monitors = 2, + .logical_monitors = { + { + .monitors = { 0 }, + .n_monitors = 1, + .layout = { .x = 0, .y = 0, .width = 800, .height = 600 }, + .scale = 1, + .transform = MTK_MONITOR_TRANSFORM_NORMAL + }, + }, + .n_logical_monitors = 1, + .primary_logical_monitor = 0, + .n_outputs = 2, + .crtcs = { + { + .current_mode = 0, + }, + { + .current_mode = -1, + } + }, + .n_crtcs = 2, + .screen_width = 800, + .screen_height = 600, + } + }; + MetaMonitorTestSetup *test_setup; + MetaBackend *backend = meta_context_get_backend (test_context); + MetaMonitorManager *monitor_manager = + meta_backend_get_monitor_manager (backend); + GList *monitors; + MetaMonitor *first_monitor; + MetaMonitor *second_monitor; + + test_setup = meta_create_monitor_test_setup (test_backend, + &test_case.setup, + MONITOR_TEST_FLAG_NONE); + meta_set_custom_monitor_config (test_context, "forlease.xml"); + emulate_hotplug (test_setup); + + META_TEST_LOG_CALL ("Checking monitor configuration", + meta_check_monitor_configuration (test_context, + &test_case.expect)); + check_monitor_test_clients_state (); + + monitors = meta_monitor_manager_get_monitors (monitor_manager); + g_assert_cmpuint (g_list_length (monitors), ==, 2); + + first_monitor = g_list_nth_data (monitors, 0); + second_monitor = g_list_nth_data (monitors, 1); + + g_assert_true (meta_monitor_is_active (first_monitor)); + g_assert_false (meta_monitor_is_for_lease (first_monitor)); + + g_assert_false (meta_monitor_is_active (second_monitor)); + g_assert_true (meta_monitor_is_for_lease (second_monitor)); +} + +static void +meta_test_monitor_custom_for_lease_invalid_config (void) +{ + g_test_expect_message ("libmutter-test", G_LOG_LEVEL_WARNING, + "*For lease monitor must be explicitly disabled"); + meta_set_custom_monitor_config (test_context, "forlease-invalid.xml"); + g_test_assert_expected_messages (); +} + static gboolean quit_main_loop (gpointer data) { @@ -10400,6 +10561,10 @@ init_monitor_tests (void) meta_test_monitor_custom_lid_switch_config); add_monitor_test ("/backends/monitor/custom/detached-groups", meta_test_monitor_custom_detached_groups); + add_monitor_test ("/backends/monitor/custom/for-lease-config", + meta_test_monitor_custom_for_lease_config); + add_monitor_test ("/backends/monitor/custom/for-lease-invalid-config", + meta_test_monitor_custom_for_lease_invalid_config); add_monitor_test ("/backends/monitor/migrated/rotated", meta_test_monitor_migrated_rotated); -- 2.48.1