hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
From cba3de4125c7e91d8e9171199aa79da1a1dbd41a Mon Sep 17 00:00:00 2001
From: Jeffy Chen <jeffy.chen@rock-chips.com>
Date: Tue, 21 Apr 2020 17:53:45 +0800
Subject: [PATCH] Support key press and release events
 
For example:
[Keys]
POWER:1        = /usr/bin/power-key.sh press
POWER:0        = /usr/bin/power-key.sh release
 
NOTE: Modifier events are only triggerred on release.
 
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---
 input-event-daemon.c | 30 +++++++++++++++++++++---------
 input-event-daemon.h |  1 +
 2 files changed, 22 insertions(+), 9 deletions(-)
 
diff --git a/input-event-daemon.c b/input-event-daemon.c
index b5651a6..4bf2a33 100644
--- a/input-event-daemon.c
+++ b/input-event-daemon.c
@@ -36,7 +36,7 @@ static int key_event_compare(const key_event_t *a, const key_event_t *b) {
             }
         }
     }
-    return 0;
+    return a->value - b->value;
 }
 
 static const char *key_event_name(unsigned int code) {
@@ -77,6 +77,8 @@ static key_event_t
         .modifier_n = 0
     };
 
+    current_key_event.value = pressed;
+
     if(pressed) {
 
         /* ignore if repeated */
@@ -148,7 +150,9 @@ static key_event_t
                 sizeof(const char*),
                 (int (*)(const void *, const void *)) strcmp
             );
+        }
 
+        if (current_key_event.code != NULL) {
             fired_key_event = bsearch(
                 &current_key_event,
                 key_events,
@@ -156,15 +160,9 @@ static key_event_t
                 sizeof(key_event_t),
                 (int (*)(const void *, const void *)) key_event_compare
             );
-
         }
 
-        if(
-            current_key_event.code != NULL &&
-            strcmp(current_key_event.code, key_event_name(code)) == 0
-        ) {
-            current_key_event.code = NULL;
-        }
+        current_key_event.code = NULL;
 
         /* remove released key from modifiers */
         modifier_code = key_event_modifier_name(key_event_name(code));
@@ -533,7 +531,7 @@ void config_parse_dir(const char *path) {
 
 static const char *config_key_event(char *shortcut, char *exec) {
     int i;
-    char *code, *modifier;
+    char *code, *value, *modifier;
     key_event_t *new_key_event;
 
     if(key_event_n >= MAX_EVENTS) {
@@ -547,6 +545,10 @@ static const char *config_key_event(char *shortcut, char *exec) {
         new_key_event->modifiers[i] = NULL;
     }
 
+    value = shortcut;
+    strsep(&value, ":");
+    shortcut = config_trim_string(shortcut);
+
     if((code = strrchr(shortcut, '+')) != NULL) {
         *code = '\0';
         code = config_trim_string(code+1);
@@ -570,6 +572,16 @@ static const char *config_key_event(char *shortcut, char *exec) {
     qsort(new_key_event->modifiers, new_key_event->modifier_n,
         sizeof(const char*), (int (*)(const void *, const void *)) strcmp);
 
+    new_key_event->value = 1;
+    if(value != NULL) {
+        value = config_trim_string(value);
+        new_key_event->value = atoi(value);
+    }
+
+    /* only trigger modifiers on release */
+    if (new_key_event->modifier_n)
+        new_key_event->value = 0;
+
     return NULL;
 }
 
diff --git a/input-event-daemon.h b/input-event-daemon.h
index 17ac906..7cab13d 100644
--- a/input-event-daemon.h
+++ b/input-event-daemon.h
@@ -37,6 +37,7 @@ struct {
 
 typedef struct key_event {
     const char *code;
+    int value;
     const char *modifiers[MAX_MODIFIERS];
     size_t     modifier_n;
     const char *exec;
-- 
2.20.1