refactor: Move output logic into a single struct

master
Raheman Vaiya 3 years ago
parent b822f066f6
commit d5aaa5992d
  1. 11
      src/daemon.c
  2. 19
      src/keyboard.c
  3. 14
      src/keyboard.h
  4. 12
      t/test-io.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);
}
}

@ -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;
}

@ -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);

@ -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]);

Loading…
Cancel
Save