From c93e06696fea37303e4d9143ed62a31a97532c51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Date: Mon, 4 Nov 2024 19:12:19 +0100 Subject: [PATCH 1/3] monitor-manager: Return for lease status in GetCurrentState Add a new property to the list of monitors returned by the GetCurrentState D-Bus API indicating whether the monitor is available for lease or not. Part-of: --- .../org.gnome.Mutter.DisplayConfig.xml | 1 + src/backends/meta-monitor-manager.c | 6 + src/tests/monitor-unit-tests.c | 127 ++++++++++++++++++ 3 files changed, 134 insertions(+) diff --git a/data/dbus-interfaces/org.gnome.Mutter.DisplayConfig.xml b/data/dbus-interfaces/org.gnome.Mutter.DisplayConfig.xml index 3c28814b16..192c08a796 100644 --- a/data/dbus-interfaces/org.gnome.Mutter.DisplayConfig.xml +++ b/data/dbus-interfaces/org.gnome.Mutter.DisplayConfig.xml @@ -392,6 +392,7 @@ - "min-refresh-rate" (i): minimum refresh rate of monitor when Variable Refresh Rate is active (absence of this means unknown) + - "is-for-lease" (b): whether the monitor is for lease or not Possible mode flags: 1 : preferred mode diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c index 55816ed7bb..127181df60 100644 --- a/src/backends/meta-monitor-manager.c +++ b/src/backends/meta-monitor-manager.c @@ -2032,6 +2032,7 @@ meta_monitor_manager_handle_get_current_state (MetaDBusDisplayConfig *skeleton, GVariantBuilder monitor_properties_builder; GList *k; gboolean is_builtin; + gboolean is_for_lease; const char *display_name; current_mode = meta_monitor_get_current_mode (monitor); @@ -2153,6 +2154,11 @@ meta_monitor_manager_handle_get_current_state (MetaDBusDisplayConfig *skeleton, g_variant_new_int32 (min_refresh_rate)); } + is_for_lease = meta_monitor_is_for_lease (monitor); + g_variant_builder_add (&monitor_properties_builder, "{sv}", + "is-for-lease", + g_variant_new_boolean (is_for_lease)); + g_variant_builder_add (&monitors_builder, MONITOR_FORMAT, monitor_spec->connector, monitor_spec->vendor, diff --git a/src/tests/monitor-unit-tests.c b/src/tests/monitor-unit-tests.c index 0d5d1511ea..1f87c36528 100644 --- a/src/tests/monitor-unit-tests.c +++ b/src/tests/monitor-unit-tests.c @@ -9474,6 +9474,131 @@ meta_test_monitor_custom_for_lease_invalid_config (void) g_test_assert_expected_messages (); } +static void +on_proxy_call_cb (GObject *object, + GAsyncResult *res, + gpointer user_data) +{ + g_autoptr (GError) error = NULL; + GVariant **ret = user_data; + + *ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (object), res, &error); + g_assert_no_error (error); + g_assert_nonnull (ret); +} + +static void +assert_monitor_state (GVariant *state, + guint monitor_index, + const char *connector, + gboolean is_for_lease) +{ + g_autoptr (GVariant) monitors = NULL; + g_autoptr (GVariant) monitor = NULL; + g_autoptr (GVariant) monitor_spec = NULL; + g_autoptr (GVariant) spec_connector = NULL; + g_autoptr (GVariant) monitor_properties = NULL; + g_autoptr (GVariant) for_lease_property = NULL; + + monitors = g_variant_get_child_value (state, 1); + monitor = g_variant_get_child_value (monitors, monitor_index); + + monitor_spec = g_variant_get_child_value (monitor, 0); + spec_connector = g_variant_get_child_value (monitor_spec, 0); + g_assert_cmpstr (g_variant_get_string (spec_connector, NULL), ==, connector); + + monitor_properties = g_variant_get_child_value (monitor, 2); + for_lease_property = g_variant_lookup_value (monitor_properties, + "is-for-lease", + G_VARIANT_TYPE_BOOLEAN); + g_assert (g_variant_get_boolean (for_lease_property) == is_for_lease); +} + +static void +meta_test_monitor_custom_for_lease_config_dbus (void) +{ + MonitorTestCaseSetup 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 + }; + MetaMonitorTestSetup *test_setup; + g_autoptr (GDBusProxy) display_config_proxy = NULL; + g_autoptr (GVariant) state = NULL; + + 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); + check_monitor_test_clients_state (); + + g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, + NULL, + "org.gnome.Mutter.DisplayConfig", + "/org/gnome/Mutter/DisplayConfig", + "org.gnome.Mutter.DisplayConfig", + NULL, + proxy_ready_cb, + &display_config_proxy); + while (!display_config_proxy) + g_main_context_iteration (NULL, TRUE); + + g_dbus_proxy_call (display_config_proxy, + "GetCurrentState", + NULL, + G_DBUS_CALL_FLAGS_NO_AUTO_START, + -1, + NULL, + on_proxy_call_cb, + &state); + while (!state) + g_main_context_iteration (NULL, TRUE); + + assert_monitor_state (state, 0, "DP-1", FALSE); + assert_monitor_state (state, 1, "DP-2", TRUE); +} + static gboolean quit_main_loop (gpointer data) { @@ -10704,6 +10829,8 @@ init_monitor_tests (void) 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/custom/for-lease-config-dbus", + meta_test_monitor_custom_for_lease_config_dbus); add_monitor_test ("/backends/monitor/migrated/rotated", meta_test_monitor_migrated_rotated); -- 2.48.1