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