diff --git a/src/daemon.c b/src/daemon.c index 86cda62..3fb13c4 100644 --- a/src/daemon.c +++ b/src/daemon.c @@ -77,7 +77,7 @@ static void add_listener(int con) listeners[nr_listeners++] = con; } -static void layer_observer(struct keyboard *kbd, const char *name, int state) +static void on_layer_change(const struct keyboard *kbd, const char *name, uint8_t state) { size_t i; char buf[MAX_LAYER_NAME_LEN+2]; @@ -138,12 +138,17 @@ static void load_configs() keyd_log("CONFIG: parsing b{%s}\n", path); if (!config_parse(&ent->config, path)) { - ent->kbd = new_keyboard(&ent->config, send_key, layer_observer); + struct output output = { + .send_key = send_key, + .on_layer_change = on_layer_change, + }; + ent->kbd = new_keyboard(&ent->config, &output); + ent->next = configs; configs = ent; } else { free(ent); - keyd_log("DEVICE: y{WARNING} failed to parse %s", path); + keyd_log("DEVICE: y{WARNING} failed to parse %s\n", path); } } diff --git a/src/keyboard.c b/src/keyboard.c index d7db44c..a4cdb4b 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -62,7 +62,7 @@ static void reset_keystate(struct keyboard *kbd) for (i = 0; i < 256; i++) { if (kbd->keystate[i]) { - kbd->output(i, 0); + kbd->output.send_key(i, 0); kbd->keystate[i] = 0; } } @@ -79,7 +79,7 @@ static void send_key(struct keyboard *kbd, uint8_t code, uint8_t pressed) if (kbd->keystate[code] != pressed) { kbd->keystate[code] = pressed; - kbd->output(code, pressed); + kbd->output.send_key(code, pressed); } } @@ -169,7 +169,7 @@ static void execute_macro(struct keyboard *kbd, int dl, const struct macro *macr send_key(kbd, code, 0); } else { update_mods(kbd, dl, 0); - macro_execute(kbd->output, macro, kbd->config.macro_sequence_timeout); + macro_execute(kbd->output.send_key, macro, kbd->config.macro_sequence_timeout); } } @@ -247,8 +247,7 @@ static void deactivate_layer(struct keyboard *kbd, int idx) assert(kbd->layer_state[idx].active > 0); kbd->layer_state[idx].active--; - if (kbd->layer_observer) - kbd->layer_observer(kbd, kbd->config.layers[idx].name, 0); + kbd->output.on_layer_change(kbd, kbd->config.layers[idx].name, 0); } /* @@ -267,8 +266,7 @@ static void activate_layer(struct keyboard *kbd, uint8_t code, int idx) if ((ce = cache_get(kbd, code))) ce->layer = idx; - if (kbd->layer_observer) - kbd->layer_observer(kbd, kbd->config.layers[idx].name, 1); + kbd->output.on_layer_change(kbd, kbd->config.layers[idx].name, 1); } /* Returns: @@ -771,9 +769,7 @@ static long process_descriptor(struct keyboard *kbd, uint8_t code, return timeout; } -struct keyboard *new_keyboard(struct config *config, - void (*sink) (uint8_t code, uint8_t pressed), - void (*layer_observer)(struct keyboard *kbd, const char *name, int state)) +struct keyboard *new_keyboard(struct config *config, const struct output *output) { size_t i; struct keyboard *kbd; @@ -783,6 +779,7 @@ struct keyboard *new_keyboard(struct config *config, kbd->original_config = config; memcpy(&kbd->config, kbd->original_config, sizeof(struct config)); + kbd->output = *output; kbd->layer_state[0].active = 1; kbd->layer_state[0].activation_time = 0; @@ -808,8 +805,6 @@ struct keyboard *new_keyboard(struct config *config, kbd->chord.queue_sz = 0; kbd->chord.state = CHORD_INACTIVE; - kbd->output = sink; - kbd->layer_observer = layer_observer; return kbd; } diff --git a/src/keyboard.h b/src/keyboard.h index 9811535..81742a5 100644 --- a/src/keyboard.h +++ b/src/keyboard.h @@ -15,6 +15,8 @@ #define MAX_ACTIVE_KEYS 32 #define CACHE_SIZE 16 //Effectively nkro +struct keyboard; + struct cache_entry { uint8_t code; struct descriptor d; @@ -28,10 +30,16 @@ struct key_event { int timestamp; }; +struct output { + void (*send_key) (uint8_t code, uint8_t state); + void (*on_layer_change) (const struct keyboard *kbd, const char *name, uint8_t active); +}; + /* May correspond to more than one physical input device. */ struct keyboard { const struct config *original_config; struct config config; + struct output output; /* * Cache descriptors to preserve code->descriptor @@ -113,8 +121,6 @@ struct keyboard { } layer_state[MAX_LAYERS]; uint8_t keystate[256]; - void (*output) (uint8_t code, uint8_t state); - void (*layer_observer) (struct keyboard *kbd, const char *layer, int state); struct { int x; @@ -125,9 +131,7 @@ struct keyboard { } scroll; }; -struct keyboard *new_keyboard(struct config *config, - void (*sink) (uint8_t code, uint8_t pressed), - void (*layer_observer)(struct keyboard *kbd, const char *name, int state)); +struct keyboard *new_keyboard(struct config *config, const struct output *output); long kbd_process_events(struct keyboard *kbd, const struct key_event *events, size_t n); int kbd_eval(struct keyboard *kbd, const char *exp); diff --git a/t/test-io.c b/t/test-io.c index 22a3bc7..29e57ab 100644 --- a/t/test-io.c +++ b/t/test-io.c @@ -26,7 +26,7 @@ static uint8_t lookup_code(const char *name) return 0; } -static void test_sink(uint8_t code, uint8_t pressed) +static void send_key(uint8_t code, uint8_t pressed) { output[noutput].code = code; output[noutput].pressed = pressed; @@ -218,12 +218,20 @@ void run_test(struct keyboard *kbd, const char *path) } } +static void on_layer_change(const struct keyboard *kbd, const char *name, uint8_t active) +{ +} + int main(int argc, char *argv[]) { size_t i; struct config config; struct keyboard *kbd; + struct output output = { + .send_key = send_key, + .on_layer_change = on_layer_change, + }; if (argc < 2) { printf @@ -237,7 +245,7 @@ int main(int argc, char *argv[]) return -1; } - kbd = new_keyboard(&config, test_sink, NULL); + kbd = new_keyboard(&config, &output); for (i = 2; i < argc; i++) run_test(kbd, argv[i]);