diff --git a/data/keyd.1.gz b/data/keyd.1.gz index 346cbe4..e38a7ea 100644 Binary files a/data/keyd.1.gz and b/data/keyd.1.gz differ 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,