From 9071817089a0b22acbddf183817201036bf04157 Mon Sep 17 00:00:00 2001 From: Pekka Paalanen Date: Wed, 23 May 2018 14:34:36 +0300 Subject: [PATCH] weston: add force-on option for DRM Add a new boolean output section key "force-on". When set to true, the output will be enabled regardless of connector status. This is the opposite of the mode=off setting. Forcing connectors on is useful in special circumstances: avoid output configuration changes due to hotplug e.g. with KVM switches, or hardware with unreliable connector status readout for example. Signed-off-by: Pekka Paalanen Reviewed-by: Ian Ray --- compositor/main.c | 22 ++++++++++++++++++++-- man/weston-drm.man | 8 ++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/compositor/main.c b/compositor/main.c index 38911341..147485e5 100644 --- a/compositor/main.c +++ b/compositor/main.c @@ -1594,6 +1594,22 @@ drm_head_prepare_enable(struct wet_compositor *wet, } } +static bool +drm_head_should_force_enable(struct wet_compositor *wet, + struct weston_head *head) +{ + const char *name = weston_head_get_name(head); + struct weston_config_section *section; + int force = 0; + + section = drm_config_find_controlling_output_section(wet->config, name); + if (!section) + return false; + + weston_config_section_get_bool(section, "force-on", &force, 0); + return !!force; +} + static void drm_try_attach(struct weston_output *output, struct wet_head_array *add, @@ -1783,6 +1799,7 @@ drm_heads_changed(struct wl_listener *listener, void *arg) bool connected; bool enabled; bool changed; + bool forced; /* We need to collect all cloned heads into outputs before enabling the * output. @@ -1791,10 +1808,11 @@ drm_heads_changed(struct wl_listener *listener, void *arg) connected = weston_head_is_connected(head); enabled = weston_head_is_enabled(head); changed = weston_head_is_device_changed(head); + forced = drm_head_should_force_enable(wet, head); - if (connected && !enabled) { + if ((connected || forced) && !enabled) { drm_head_prepare_enable(wet, head); - } else if (!connected && enabled) { + } else if (!(connected || forced) && enabled) { drm_head_disable(head); } else if (enabled && changed) { weston_log("Detected a monitor change on head '%s', " diff --git a/man/weston-drm.man b/man/weston-drm.man index c9e69151..6988eb6a 100644 --- a/man/weston-drm.man +++ b/man/weston-drm.man @@ -95,6 +95,14 @@ NOTE: cms-colord plugin does not work correctly with this option. The plugin chooses an arbitrary monitor to load the color profile for, but the profile is applied equally to all cloned monitors regardless of their properties. +.TP +\fBforce-on\fR=\fItrue\fR +Force the output to be enabled even if the connector is disconnected. +Defaults to false. Note that +.BR mode=off " will override " force-on=true . +When a connector is disconnected, there is no EDID information to provide +a list of video modes. Therefore a forced output should also have a +detailed mode line specified. . .\" *************************************************************** .SH OPTIONS