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 ¤t_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