1From d36d3b116cf2b166f01bfd37f3ce84e3954c035b Mon Sep 17 00:00:00 2001
2From: Jeffy Chen <jeffy.chen@rock-chips.com>
3Date: Fri, 3 Jul 2020 12:37:37 +0800
4Subject: [PATCH 29/93] backend-drm: Support controlling compositor dynamically
5
6Use config file to control compositor's state.
7
8Default config file is "/tmp/.weston_drm.conf", can override with
9"WESTON_DRM_CONFIG" environment.
10
11Supported configs format is "compositor:<key>:<value>", for
12example:
13echo "compositor:state:sleep" > /tmp/.weston_drm.conf
14echo "compositor:state:block" > /tmp/.weston_drm.conf
15echo "compositor:state:freeze" > /tmp/.weston_drm.conf
16echo "compositor:state:off" > /tmp/.weston_drm.conf
17echo "compositor:state:on" > /tmp/.weston_drm.conf
18echo "compositor:hotplug:off" > /tmp/.weston_drm.conf
19echo "compositor:hotplug:on" > /tmp/.weston_drm.conf
20echo "compositor:hotplug:force" > /tmp/.weston_drm.conf
21
22Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
23---
24 libweston/backend-drm/drm.c | 39 ++++++++++++++++++++++++++++++++++++-
25 1 file changed, 38 insertions(+), 1 deletion(-)
26
27diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c
28index 23dbe38..a7c57f7 100644
29--- a/libweston/backend-drm/drm.c
30+++ b/libweston/backend-drm/drm.c
31@@ -3818,6 +3818,39 @@ config_handle_output(struct drm_backend *b, const char *name,
32 	}
33 }
34
35+static void
36+config_handle_compositor(struct drm_backend *b, const char *key,
37+			 const char *value)
38+{
39+	if (!strncmp(key, "state", strlen("state"))) {
40+		if (!strncmp(value, "sleep", strlen("sleep"))) {
41+			weston_compositor_sleep(b->compositor);
42+		} else if (!strncmp(value, "block", strlen("block"))) {
43+			udev_input_disable(&b->input);
44+		} else if (!strncmp(value, "freeze", strlen("freeze"))) {
45+			udev_input_disable(&b->input);
46+			weston_compositor_offscreen(b->compositor);
47+		} else if (!strncmp(value, "off", strlen("off"))) {
48+			udev_input_disable(&b->input);
49+			weston_compositor_sleep(b->compositor);
50+		} else {
51+			weston_compositor_wake(b->compositor);
52+			weston_compositor_damage_all(b->compositor);
53+
54+			if (b->input.suspended)
55+				udev_input_enable(&b->input);
56+		}
57+	} else if (!strncmp(key, "hotplug", strlen("hotplug"))) {
58+		if (!strncmp(value, "off", strlen("off")))
59+			wl_event_source_fd_update(b->udev_drm_source, 0);
60+		else if (!strncmp(value, "on", strlen("on")))
61+			wl_event_source_fd_update(b->udev_drm_source,
62+						  WL_EVENT_READABLE);
63+		else if (!strncmp(value, "force", strlen("force")))
64+			hotplug_timer_handler(b);
65+	}
66+}
67+
68 static int
69 config_timer_handler(void *data)
70 {
71@@ -3849,7 +3882,9 @@ config_timer_handler(void *data)
72
73 	/**
74 	 * Parse configs, formated with <type>:<key>:<value>
75-	 * For example: "output:all:rotate90"
76+	 * For example:
77+	 *	output:all:rotate90
78+	 *	compositor:state:off
79 	 */
80 	while (3 == fscanf(conf_fp,
81 			   "%" STR(MAX_CONF_LEN) "[^:]:"
82@@ -3857,6 +3892,8 @@ config_timer_handler(void *data)
83 			   "%" STR(MAX_CONF_LEN) "[^\n]%*c", type, key, value)) {
84 		if (!strcmp(type, "output"))
85 			config_handle_output(b, key, value);
86+		else if (!strcmp(type, "compositor"))
87+			config_handle_compositor(b, key, value);
88 	}
89
90 	fclose(conf_fp);
91--
922.20.1
93
94