From 312ab6efc00b4e79f575666cc31d0bca01d235e4 Mon Sep 17 00:00:00 2001 From: Raheman Vaiya Date: Sun, 28 Aug 2022 06:24:03 -0400 Subject: [PATCH] Fix layout_indicator --- data/keyd.1.gz | Bin 7430 -> 7417 bytes docs/keyd.scdoc | 3 +-- src/daemon.c | 19 +++++++++++++------ src/keyboard.c | 32 +++++++++----------------------- src/keyboard.h | 7 ++++--- src/keyd.c | 10 ---------- src/keyd.h | 2 -- 7 files changed, 27 insertions(+), 46 deletions(-) diff --git a/data/keyd.1.gz b/data/keyd.1.gz index 346cbe49ec042fd1ccb0eee4e0f7f851662aae2a..e38a7ea0edc458b8b562b1549ce1082689720448 100644 GIT binary patch delta 2622 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 delta 2635 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 diff --git a/docs/keyd.scdoc b/docs/keyd.scdoc index 7f86564..02f0353 100644 --- a/docs/keyd.scdoc +++ b/docs/keyd.scdoc @@ -449,8 +449,7 @@ and can contain any of the following options: *macro_repeat_timeout:* The time separating successive executions of a macro. (default: 50) - *layer_indicator:* If set, this will turn the capslock light on whenever a layer with a non-empty modifier set - is active. + *layer_indicator:* If set, this will turn the capslock light on whenever a layer is active. (default: 0) *Note:* Unicode characters and key sequences are treated as macros, and diff --git a/src/daemon.c b/src/daemon.c index 80a196b..765ba26 100644 --- a/src/daemon.c +++ b/src/daemon.c @@ -80,18 +80,25 @@ static void add_listener(int con) listeners[nr_listeners++] = con; } -static void layer_observer(const char *name, int state) +static void layer_observer(struct keyboard *kbd, const char *name, int state) { - if (!nr_listeners) - return; - - char buf[MAX_LAYER_NAME_LEN+2]; - ssize_t bufsz = snprintf(buf, sizeof(buf), "%c%s\n", state ? '+' : '-', name); size_t i; + char buf[MAX_LAYER_NAME_LEN+2]; + ssize_t bufsz; int keep[ARRAY_SIZE(listeners)]; size_t n = 0; + if (kbd->config.layer_indicator) { + for (i = 0; i < nr_devices; i++) + if (devices[i]->data == kbd) + device_set_led(devices[i], 1, state); + } + + if (!nr_listeners) + return; + + bufsz = snprintf(buf, sizeof(buf), "%c%s\n", state ? '+' : '-', name); for (i = 0; i < nr_listeners; i++) { ssize_t nw = write(listeners[i], buf, bufsz); diff --git a/src/keyboard.c b/src/keyboard.c index de13252..04cfb24 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -302,22 +302,6 @@ static void lookup_descriptor(struct keyboard *kbd, uint8_t code, } } -static void update_leds(struct keyboard *kbd) -{ - size_t i; - int active = 0; - - if (!kbd->config.layer_indicator) - return; - - for (i = 0; i < kbd->config.nr_layers; i++) { - if (kbd->layer_state[i].active && kbd->config.layers[i].mods) - active = 1; - } - - set_led(1, active); -} - static void deactivate_layer(struct keyboard *kbd, int idx) { dbg("Deactivating layer %s", kbd->config.layers[idx].name); @@ -326,7 +310,7 @@ static void deactivate_layer(struct keyboard *kbd, int idx) kbd->layer_state[idx].active--; if (kbd->layer_observer) - kbd->layer_observer(kbd->config.layers[idx].name, 0); + kbd->layer_observer(kbd, kbd->config.layers[idx].name, 0); } /* @@ -343,7 +327,7 @@ static void activate_layer(struct keyboard *kbd, uint8_t code, int idx) kbd->last_layer_code = code; if (kbd->layer_observer) - kbd->layer_observer(kbd->config.layers[idx].name, 1); + kbd->layer_observer(kbd, kbd->config.layers[idx].name, 1); } static void execute_command(const char *cmd) @@ -394,8 +378,12 @@ static void clear(struct keyboard *kbd) for (i = 1; i < kbd->config.nr_layers; i++) { struct layer *layer = &kbd->config.layers[i]; - if (layer->type != LT_LAYOUT) + if (layer->type != LT_LAYOUT) { + if (kbd->layer_state[i].active && kbd->layer_observer) + kbd->layer_observer(kbd, kbd->config.layers[i].name, 0); + memset(&kbd->layer_state[i], 0, sizeof kbd->layer_state[0]); + } } /* Neutralize upstroke for active keys. */ @@ -647,8 +635,6 @@ static long process_descriptor(struct keyboard *kbd, uint8_t code, break; } - update_leds(kbd); - if (pressed) kbd->last_pressed_code = code; @@ -656,8 +642,8 @@ static long process_descriptor(struct keyboard *kbd, uint8_t code, } struct keyboard *new_keyboard(struct config *config, - void (*sink) (uint8_t, uint8_t), - void (*layer_observer)(const char *name, int state)) + void (*sink) (uint8_t code, uint8_t pressed), + void (*layer_observer)(struct keyboard *kbd, const char *name, int state)) { size_t i; struct keyboard *kbd; diff --git a/src/keyboard.h b/src/keyboard.h index a98344d..94d3388 100644 --- a/src/keyboard.h +++ b/src/keyboard.h @@ -8,6 +8,7 @@ #include "keyd.h" #include "config.h" +#include "device.h" #define MAX_ACTIVE_KEYS 32 #define CACHE_SIZE 16 //Effectively nkro @@ -63,12 +64,12 @@ struct keyboard { uint8_t keystate[256]; void (*output) (uint8_t code, uint8_t state); - void (*layer_observer) (const char *layer, int state); + void (*layer_observer) (struct keyboard *kbd, const char *layer, int state); }; struct keyboard *new_keyboard(struct config *config, - void (*sink) (uint8_t, uint8_t), - void (*layer_observer)(const char *name, int state)); + void (*sink) (uint8_t code, uint8_t pressed), + void (*layer_observer)(struct keyboard *kbd, const char *name, int state)); long kbd_process_key_event(struct keyboard *kbd, uint8_t code, int pressed); int kbd_eval(struct keyboard *kbd, const char *exp); diff --git a/src/keyd.c b/src/keyd.c index c362f8e..dab9dc8 100644 --- a/src/keyd.c +++ b/src/keyd.c @@ -175,13 +175,3 @@ int main(int argc, char *argv[]) run_daemon(argc, argv); } - -/* TODO: find a better place for this. */ -void set_led(int led, int state) -{ -//TODO: fixme -// size_t i; -// -// for (i = 0; i < nr_devices; i++) -// device_set_led(&devices[i], led, state); -} diff --git a/src/keyd.h b/src/keyd.h index efe443a..cdad0f8 100644 --- a/src/keyd.h +++ b/src/keyd.h @@ -47,8 +47,6 @@ #define warn(fmt, ...) fprintf(stderr, "\033[31;1mERROR:\033[0m "fmt"\n", ##__VA_ARGS__) -void set_led(int led, int state); - enum event_type { EV_DEV_ADD, EV_DEV_REMOVE,