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 <pekka.paalanen@collabora.co.uk>
Reviewed-by: Ian Ray <ian.ray@ge.com>
diff --git a/compositor/main.c b/compositor/main.c
index 3891134..147485e 100644
--- a/compositor/main.c
+++ b/compositor/main.c
@@ -1594,6 +1594,22 @@
 	}
 }
 
+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 @@
 	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 @@
 		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 c9e6915..6988eb6 100644
--- a/man/weston-drm.man
+++ b/man/weston-drm.man
@@ -95,6 +95,14 @@
 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