From cba3de4125c7e91d8e9171199aa79da1a1dbd41a Mon Sep 17 00:00:00 2001 From: Jeffy Chen 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 --- 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( ¤t_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