From 76ef5b73d8cdaaa1c8875efb73b9e4fed784800d Mon Sep 17 00:00:00 2001 From: Raheman Vaiya Date: Sun, 8 May 2022 02:03:24 -0400 Subject: [PATCH] Share state between keyboards (#202) --- data/keyd-application-mapper.1.gz | Bin 1490 -> 1490 bytes data/keyd.1.gz | Bin 5681 -> 5683 bytes src/keyboard.h | 4 ++- src/keyd.c | 58 +++++++++++++++++++++--------- src/keyd.h | 4 +++ 5 files changed, 49 insertions(+), 17 deletions(-) diff --git a/data/keyd-application-mapper.1.gz b/data/keyd-application-mapper.1.gz index 38f4e1ac5f9ae3e00a3edf526170e9b9d41d21bb..48f8a76137e137c6c5a30fbec490ad0ba5b8eb5f 100644 GIT binary patch delta 67 zcmV-J0KEUw3(^Z8ABzY8qg;1l00Wg)?{C{S5dB>J6}Jp%ejt{UU>$~$AH@Nek>%e3 ZQ?tbZlmP+fvswdi0tj1g`$Fjp004J6}Jp%ejt{UY~6>EAH@Nuk>%e3 ZbF;+(lmP*kvswdi0th}QZt3X@006+Z8&d!P diff --git a/data/keyd.1.gz b/data/keyd.1.gz index 12d359d58e7cff288a14be51561a00535f689f8d..075476df564f291a45e98e89638f6e33ceb5419a 100644 GIT binary patch delta 4429 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 RipCvh{|Eh_8IG4a005gXh*descriptor diff --git a/src/keyd.c b/src/keyd.c index 9e6a86b..ff7fa64 100644 --- a/src/keyd.c +++ b/src/keyd.c @@ -29,6 +29,8 @@ #include "keys.h" #include "ipc.h" +#define MAX_KEYBOARDS 64 + /* config variables */ static const char *virtual_keyboard_name; @@ -39,8 +41,13 @@ static const char *socket_file; static struct device devices[MAX_DEVICES]; static size_t nr_devices = 0; + static struct keyboard *active_kbd = NULL; +static struct keyboard *keyboards[MAX_KEYBOARDS]; +static size_t nr_keyboards; + + /* loop() callback functions */ static void (*device_add_cb) (struct device *dev); @@ -53,6 +60,37 @@ static int (*device_event_cb) (struct device *dev, uint8_t code, uint8_t process struct vkbd *vkbd; +struct keyboard *get_keyboard(const char *config_path) +{ + size_t i; + struct keyboard *kbd; + + for (i = 0; i < nr_keyboards; i++) + if (!strcmp(keyboards[i]->config_path, config_path)) + return keyboards[i]; + + + assert(nr_keyboards < MAX_KEYBOARDS); + kbd = calloc(1, sizeof(struct keyboard)); + + if (config_parse(&kbd->config, config_path)) { + printf("\tfailed to parse %s\n", config_path); + free(kbd); + return NULL; + } + + memcpy(&kbd->original_config, &kbd->config, sizeof kbd->config); + strcpy(kbd->config_path, config_path); + + kbd->layer_state[0].active = 1; + kbd->layer_state[0].activation_time = 1; + + keyboards[nr_keyboards++] = kbd; + + return kbd; +} + + static void daemon_remove_cb(struct device *dev) { struct keyboard *kbd = dev->data; @@ -99,26 +137,14 @@ static void daemon_add_cb(struct device *dev) printf("\tmatched %s\n", config_path); - kbd = calloc(1, sizeof(struct keyboard)); - if (config_parse(&kbd->config, config_path)) { - printf("\tfailed to parse %s\n", config_path); - free(kbd); + dev->data = get_keyboard(config_path); + if (!dev->data) return; - } - - memcpy(&kbd->original_config, &kbd->config, sizeof kbd->config); - - kbd->layer_state[0].active = 1; - kbd->layer_state[0].activation_time = 1; if (device_grab(dev) < 0) { printf("\tgrab failed\n"); - - free(kbd); return; } - - dev->data = kbd; } static void panic_check(uint8_t code, uint8_t pressed) @@ -405,8 +431,8 @@ static void cleanup() { size_t i; - for (i = 0; i < nr_devices; i++) - free(devices[i].data); + for (i = 0; i < nr_keyboards; i++) + free(keyboards[i]); free_vkbd(vkbd); diff --git a/src/keyd.h b/src/keyd.h index 7d7db46..7ef4df5 100644 --- a/src/keyd.h +++ b/src/keyd.h @@ -6,6 +6,10 @@ #ifndef KEYD_H_ #define KEYD_H_ +#ifndef PATH_MAX +#define PATH_MAX 1024 +#endif + void set_led(int led, int state); #endif