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