1From cba3de4125c7e91d8e9171199aa79da1a1dbd41a Mon Sep 17 00:00:00 2001
2From: Jeffy Chen <jeffy.chen@rock-chips.com>
3Date: Tue, 21 Apr 2020 17:53:45 +0800
4Subject: [PATCH] Support key press and release events
5
6For example:
7[Keys]
8POWER:1        = /usr/bin/power-key.sh press
9POWER:0        = /usr/bin/power-key.sh release
10
11NOTE: Modifier events are only triggerred on release.
12
13Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
14---
15 input-event-daemon.c | 30 +++++++++++++++++++++---------
16 input-event-daemon.h |  1 +
17 2 files changed, 22 insertions(+), 9 deletions(-)
18
19diff --git a/input-event-daemon.c b/input-event-daemon.c
20index b5651a6..4bf2a33 100644
21--- a/input-event-daemon.c
22+++ b/input-event-daemon.c
23@@ -36,7 +36,7 @@ static int key_event_compare(const key_event_t *a, const key_event_t *b) {
24             }
25         }
26     }
27-    return 0;
28+    return a->value - b->value;
29 }
30
31 static const char *key_event_name(unsigned int code) {
32@@ -77,6 +77,8 @@ static key_event_t
33         .modifier_n = 0
34     };
35
36+    current_key_event.value = pressed;
37+
38     if(pressed) {
39
40         /* ignore if repeated */
41@@ -148,7 +150,9 @@ static key_event_t
42                 sizeof(const char*),
43                 (int (*)(const void *, const void *)) strcmp
44             );
45+        }
46
47+        if (current_key_event.code != NULL) {
48             fired_key_event = bsearch(
49                 &current_key_event,
50                 key_events,
51@@ -156,15 +160,9 @@ static key_event_t
52                 sizeof(key_event_t),
53                 (int (*)(const void *, const void *)) key_event_compare
54             );
55-
56         }
57
58-        if(
59-            current_key_event.code != NULL &&
60-            strcmp(current_key_event.code, key_event_name(code)) == 0
61-        ) {
62-            current_key_event.code = NULL;
63-        }
64+        current_key_event.code = NULL;
65
66         /* remove released key from modifiers */
67         modifier_code = key_event_modifier_name(key_event_name(code));
68@@ -533,7 +531,7 @@ void config_parse_dir(const char *path) {
69
70 static const char *config_key_event(char *shortcut, char *exec) {
71     int i;
72-    char *code, *modifier;
73+    char *code, *value, *modifier;
74     key_event_t *new_key_event;
75
76     if(key_event_n >= MAX_EVENTS) {
77@@ -547,6 +545,10 @@ static const char *config_key_event(char *shortcut, char *exec) {
78         new_key_event->modifiers[i] = NULL;
79     }
80
81+    value = shortcut;
82+    strsep(&value, ":");
83+    shortcut = config_trim_string(shortcut);
84+
85     if((code = strrchr(shortcut, '+')) != NULL) {
86         *code = '\0';
87         code = config_trim_string(code+1);
88@@ -570,6 +572,16 @@ static const char *config_key_event(char *shortcut, char *exec) {
89     qsort(new_key_event->modifiers, new_key_event->modifier_n,
90         sizeof(const char*), (int (*)(const void *, const void *)) strcmp);
91
92+    new_key_event->value = 1;
93+    if(value != NULL) {
94+        value = config_trim_string(value);
95+        new_key_event->value = atoi(value);
96+    }
97+
98+    /* only trigger modifiers on release */
99+    if (new_key_event->modifier_n)
100+        new_key_event->value = 0;
101+
102     return NULL;
103 }
104
105diff --git a/input-event-daemon.h b/input-event-daemon.h
106index 17ac906..7cab13d 100644
107--- a/input-event-daemon.h
108+++ b/input-event-daemon.h
109@@ -37,6 +37,7 @@ struct {
110
111 typedef struct key_event {
112     const char *code;
113+    int value;
114     const char *modifiers[MAX_MODIFIERS];
115     size_t     modifier_n;
116     const char *exec;
117--
1182.20.1
119
120