1From 6527d1d6c7809bb50213778cac81228523a9d9e1 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 26/79] 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 1d6f7db..53a3d49 100644 29--- a/libweston/backend-drm/drm.c 30+++ b/libweston/backend-drm/drm.c 31@@ -3691,6 +3691,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@@ -3722,7 +3755,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@@ -3730,6 +3765,8 @@ config_timer_handler(void *data) 83 "%" STR(MAX_CONF_LEN) "s ", 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