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