display-config: Add HasExternalMonitor property
This aims to replace gnome-setting-daemon manually trying to figure this state out, currently via libgnome-rr. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3861>
This commit is contained in:
parent
cc0ec14712
commit
7c7e147fd2
4 changed files with 222 additions and 0 deletions
|
@ -521,5 +521,12 @@
|
||||||
<arg name="output" direction="in" type="u" />
|
<arg name="output" direction="in" type="u" />
|
||||||
<arg name="ctm" direction="in" type="(ttttttttt)" />
|
<arg name="ctm" direction="in" type="(ttttttttt)" />
|
||||||
</method>
|
</method>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
HasExternalmonitor:
|
||||||
|
|
||||||
|
True if there is an external monitor connected and activated.
|
||||||
|
-->
|
||||||
|
<property name="HasExternalMonitor" type="b" access="read" />
|
||||||
</interface>
|
</interface>
|
||||||
</node>
|
</node>
|
||||||
|
|
|
@ -1205,11 +1205,36 @@ update_night_light_supported (MetaMonitorManager *manager)
|
||||||
night_light_supported);
|
night_light_supported);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_has_external_monitor (MetaMonitorManager *monitor_manager)
|
||||||
|
{
|
||||||
|
GList *l;
|
||||||
|
gboolean has_external_monitor = FALSE;
|
||||||
|
|
||||||
|
for (l = meta_monitor_manager_get_monitors (monitor_manager); l; l = l->next)
|
||||||
|
{
|
||||||
|
MetaMonitor *monitor = l->data;
|
||||||
|
|
||||||
|
if (meta_monitor_is_laptop_panel (monitor))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!meta_monitor_is_active (monitor))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
has_external_monitor = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
meta_dbus_display_config_set_has_external_monitor (monitor_manager->display_config,
|
||||||
|
has_external_monitor);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_monitor_manager_notify_monitors_changed (MetaMonitorManager *manager)
|
meta_monitor_manager_notify_monitors_changed (MetaMonitorManager *manager)
|
||||||
{
|
{
|
||||||
meta_backend_monitors_changed (manager->backend);
|
meta_backend_monitors_changed (manager->backend);
|
||||||
|
|
||||||
|
update_has_external_monitor (manager);
|
||||||
update_backlight (manager, TRUE);
|
update_backlight (manager, TRUE);
|
||||||
|
|
||||||
g_signal_emit (manager, signals[MONITORS_CHANGED_INTERNAL], 0);
|
g_signal_emit (manager, signals[MONITORS_CHANGED_INTERNAL], 0);
|
||||||
|
@ -1247,6 +1272,7 @@ meta_monitor_manager_setup (MetaMonitorManager *manager)
|
||||||
|
|
||||||
meta_monitor_manager_notify_monitors_changed (manager);
|
meta_monitor_manager_notify_monitors_changed (manager);
|
||||||
|
|
||||||
|
update_has_external_monitor (manager);
|
||||||
update_backlight (manager, TRUE);
|
update_backlight (manager, TRUE);
|
||||||
|
|
||||||
manager->in_init = FALSE;
|
manager->in_init = FALSE;
|
||||||
|
|
|
@ -124,6 +124,7 @@ gboolean meta_monitor_get_max_bpc (MetaMonitor *monitor,
|
||||||
|
|
||||||
MetaOutputRGBRange meta_monitor_get_rgb_range (MetaMonitor *monitor);
|
MetaOutputRGBRange meta_monitor_get_rgb_range (MetaMonitor *monitor);
|
||||||
|
|
||||||
|
META_EXPORT_TEST
|
||||||
gboolean meta_monitor_is_laptop_panel (MetaMonitor *monitor);
|
gboolean meta_monitor_is_laptop_panel (MetaMonitor *monitor);
|
||||||
|
|
||||||
gboolean meta_monitor_is_virtual (MetaMonitor *monitor);
|
gboolean meta_monitor_is_virtual (MetaMonitor *monitor);
|
||||||
|
|
|
@ -4113,6 +4113,191 @@ meta_test_monitor_switch_config_remember_scale (void)
|
||||||
check_monitor_test_clients_state ();
|
check_monitor_test_clients_state ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
wait_for_boolean_property (GDBusProxy *proxy,
|
||||||
|
const char *property_name,
|
||||||
|
gboolean expected_value)
|
||||||
|
{
|
||||||
|
g_debug ("Waiting for property '%s' to become %s on '%s'",
|
||||||
|
property_name,
|
||||||
|
expected_value ? "TRUE" : "FALSE",
|
||||||
|
g_dbus_proxy_get_interface_name (proxy));
|
||||||
|
|
||||||
|
while (TRUE)
|
||||||
|
{
|
||||||
|
g_autoptr (GVariant) value_variant = NULL;
|
||||||
|
|
||||||
|
value_variant = g_dbus_proxy_get_cached_property (proxy, property_name);
|
||||||
|
g_assert_nonnull (value_variant);
|
||||||
|
|
||||||
|
if (g_variant_get_boolean (value_variant) == expected_value)
|
||||||
|
break;
|
||||||
|
|
||||||
|
g_main_context_iteration (NULL, TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
proxy_ready_cb (GObject *source_object,
|
||||||
|
GAsyncResult *res,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
GDBusProxy *proxy;
|
||||||
|
GDBusProxy **display_config_proxy_ptr = user_data;
|
||||||
|
g_autoptr (GError) error = NULL;
|
||||||
|
|
||||||
|
proxy = g_dbus_proxy_new_for_bus_finish (res, &error);
|
||||||
|
g_assert_nonnull (proxy);
|
||||||
|
g_assert_no_error (error);
|
||||||
|
|
||||||
|
*display_config_proxy_ptr = proxy;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_test_monitor_has_external_monitor (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 },
|
||||||
|
.n_possible_crtcs = 1,
|
||||||
|
.width_mm = 222,
|
||||||
|
.height_mm = 125,
|
||||||
|
.is_laptop_panel = TRUE,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.crtc = -1,
|
||||||
|
.modes = { 0 },
|
||||||
|
.n_modes = 1,
|
||||||
|
.preferred_mode = 0,
|
||||||
|
.possible_crtcs = { 1 },
|
||||||
|
.n_possible_crtcs = 1,
|
||||||
|
.width_mm = 222,
|
||||||
|
.height_mm = 125,
|
||||||
|
.is_laptop_panel = FALSE,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
.n_outputs = 2,
|
||||||
|
.crtcs = {
|
||||||
|
{
|
||||||
|
.current_mode = -1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
.n_crtcs = 2
|
||||||
|
};
|
||||||
|
MetaBackend *backend = meta_context_get_backend (test_context);
|
||||||
|
MetaMonitorManager *monitor_manager =
|
||||||
|
meta_backend_get_monitor_manager (backend);
|
||||||
|
MetaMonitorTestSetup *test_setup;
|
||||||
|
GList *monitors;
|
||||||
|
MetaMonitor *first_monitor;
|
||||||
|
MetaMonitor *second_monitor;
|
||||||
|
g_autoptr (GDBusProxy) display_config_proxy = NULL;
|
||||||
|
g_autoptr (GError) error = NULL;
|
||||||
|
|
||||||
|
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_debug ("Connecting one builtin and one external monitor");
|
||||||
|
|
||||||
|
test_setup = meta_create_monitor_test_setup (test_backend,
|
||||||
|
&test_case_setup,
|
||||||
|
MONITOR_TEST_FLAG_NO_STORED);
|
||||||
|
emulate_hotplug (test_setup);
|
||||||
|
|
||||||
|
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_laptop_panel (first_monitor));
|
||||||
|
g_assert_true (meta_monitor_is_active (first_monitor));
|
||||||
|
g_assert_false (meta_monitor_is_laptop_panel (second_monitor));
|
||||||
|
g_assert_true (meta_monitor_is_active (second_monitor));
|
||||||
|
|
||||||
|
wait_for_boolean_property (G_DBUS_PROXY (display_config_proxy),
|
||||||
|
"HasExternalMonitor",
|
||||||
|
TRUE);
|
||||||
|
|
||||||
|
g_debug ("Disconnecting external monitor");
|
||||||
|
|
||||||
|
test_case_setup.n_outputs = 1;
|
||||||
|
test_setup = meta_create_monitor_test_setup (test_backend,
|
||||||
|
&test_case_setup,
|
||||||
|
MONITOR_TEST_FLAG_NO_STORED);
|
||||||
|
emulate_hotplug (test_setup);
|
||||||
|
|
||||||
|
monitors = meta_monitor_manager_get_monitors (monitor_manager);
|
||||||
|
g_assert_cmpuint (g_list_length (monitors), ==, 1);
|
||||||
|
first_monitor = g_list_nth_data (monitors, 0);
|
||||||
|
g_assert_true (meta_monitor_is_laptop_panel (first_monitor));
|
||||||
|
g_assert_true (meta_monitor_is_active (first_monitor));
|
||||||
|
|
||||||
|
wait_for_boolean_property (G_DBUS_PROXY (display_config_proxy),
|
||||||
|
"HasExternalMonitor",
|
||||||
|
FALSE);
|
||||||
|
|
||||||
|
g_debug ("Reconnect external monitor.");
|
||||||
|
|
||||||
|
test_case_setup.n_outputs = 2;
|
||||||
|
test_setup = meta_create_monitor_test_setup (test_backend,
|
||||||
|
&test_case_setup,
|
||||||
|
MONITOR_TEST_FLAG_NO_STORED);
|
||||||
|
emulate_hotplug (test_setup);
|
||||||
|
|
||||||
|
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_laptop_panel (first_monitor));
|
||||||
|
g_assert_true (meta_monitor_is_active (first_monitor));
|
||||||
|
g_assert_false (meta_monitor_is_laptop_panel (second_monitor));
|
||||||
|
g_assert_true (meta_monitor_is_active (second_monitor));
|
||||||
|
|
||||||
|
wait_for_boolean_property (G_DBUS_PROXY (display_config_proxy),
|
||||||
|
"HasExternalMonitor",
|
||||||
|
TRUE);
|
||||||
|
|
||||||
|
g_debug ("Disable external monitor.");
|
||||||
|
|
||||||
|
meta_monitor_manager_switch_config (monitor_manager,
|
||||||
|
META_MONITOR_SWITCH_CONFIG_BUILTIN);
|
||||||
|
while (g_main_context_iteration (NULL, FALSE));
|
||||||
|
|
||||||
|
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_laptop_panel (first_monitor));
|
||||||
|
g_assert_true (meta_monitor_is_active (first_monitor));
|
||||||
|
g_assert_false (meta_monitor_is_laptop_panel (second_monitor));
|
||||||
|
g_assert_false (meta_monitor_is_active (second_monitor));
|
||||||
|
|
||||||
|
wait_for_boolean_property (G_DBUS_PROXY (display_config_proxy),
|
||||||
|
"HasExternalMonitor",
|
||||||
|
FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
check_monitor_configuration_per_orientation (MonitorTestCase *test_case,
|
check_monitor_configuration_per_orientation (MonitorTestCase *test_case,
|
||||||
unsigned int monitor_index,
|
unsigned int monitor_index,
|
||||||
|
@ -10153,6 +10338,9 @@ init_monitor_tests (void)
|
||||||
add_monitor_test ("/backends/monitor/switch-config-remember-scale",
|
add_monitor_test ("/backends/monitor/switch-config-remember-scale",
|
||||||
meta_test_monitor_switch_config_remember_scale);
|
meta_test_monitor_switch_config_remember_scale);
|
||||||
|
|
||||||
|
add_monitor_test ("/backends/monitor/has-external-monitor",
|
||||||
|
meta_test_monitor_has_external_monitor);
|
||||||
|
|
||||||
add_monitor_test ("/backends/monitor/orientation/is-managed",
|
add_monitor_test ("/backends/monitor/orientation/is-managed",
|
||||||
meta_test_monitor_orientation_is_managed);
|
meta_test_monitor_orientation_is_managed);
|
||||||
add_monitor_test ("/backends/monitor/orientation/initial-rotated",
|
add_monitor_test ("/backends/monitor/orientation/initial-rotated",
|
||||||
|
|
Loading…
Reference in a new issue