Backport DRM lease configuration via monitors.xml and D-Bus: - https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4112 - https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4121 Resolves: RHEL-62220
202 lines
7.2 KiB
Diff
202 lines
7.2 KiB
Diff
From c93e06696fea37303e4d9143ed62a31a97532c51 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= <jexposit@redhat.com>
|
|
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: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4121>
|
|
---
|
|
.../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
|
|
|