listen: seed initial state + add layout notification

master
Raheman Vaiya 2 years ago
parent f2c4015c2f
commit 44d0864ef1
  1. 32
      src/daemon.c
  2. 6
      src/keyboard.c
  3. 2
      src/keyboard.h
  4. 2
      t/overload-nested2.t
  5. 2
      t/test-io.c

@ -14,6 +14,7 @@ static uint8_t keystate[256];
static int listeners[32]; static int listeners[32];
static size_t nr_listeners = 0; static size_t nr_listeners = 0;
static struct keyboard *active_kbd = NULL;
static void free_configs() static void free_configs()
{ {
@ -72,10 +73,24 @@ static void add_listener(int con)
setsockopt(con, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof tv); setsockopt(con, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof tv);
if (active_kbd) {
size_t i;
struct config *config = &active_kbd->config;
for (i = 0; i < config->nr_layers; i++) {
if (active_kbd->layer_state[i].active) {
struct layer *layer = &config->layers[i];
write(con, layer->type == LT_LAYOUT ? "/" : "+", 1);
write(con, layer->name, strlen(layer->name));
write(con, "\n", 1);
}
}
}
listeners[nr_listeners++] = con; listeners[nr_listeners++] = con;
} }
static void on_layer_change(const struct keyboard *kbd, const char *name, uint8_t state) static void on_layer_change(const struct keyboard *kbd, const struct layer *layer, uint8_t state)
{ {
size_t i; size_t i;
char buf[MAX_LAYER_NAME_LEN+2]; char buf[MAX_LAYER_NAME_LEN+2];
@ -101,7 +116,11 @@ static void on_layer_change(const struct keyboard *kbd, const char *name, uint8_
if (!nr_listeners) if (!nr_listeners)
return; return;
bufsz = snprintf(buf, sizeof(buf), "%c%s\n", state ? '+' : '-', name); if (layer->type == LT_LAYOUT)
bufsz = snprintf(buf, sizeof(buf), "/%s\n", layer->name);
else
bufsz = snprintf(buf, sizeof(buf), "%c%s\n", state ? '+' : '-', layer->name);
for (i = 0; i < nr_listeners; i++) { for (i = 0; i < nr_listeners; i++) {
ssize_t nw = write(listeners[i], buf, bufsz); ssize_t nw = write(listeners[i], buf, bufsz);
@ -408,7 +427,6 @@ static int event_handler(struct event *ev)
{ {
static int last_time = 0; static int last_time = 0;
static int timeout = 0; static int timeout = 0;
static struct keyboard *timeout_kbd = NULL;
struct key_event kev = {0}; struct key_event kev = {0};
timeout -= ev->timestamp - last_time; timeout -= ev->timestamp - last_time;
@ -418,18 +436,18 @@ static int event_handler(struct event *ev)
switch (ev->type) { switch (ev->type) {
case EV_TIMEOUT: case EV_TIMEOUT:
if (!timeout_kbd) if (!active_kbd)
return 0; return 0;
kev.code = 0; kev.code = 0;
kev.timestamp = ev->timestamp; kev.timestamp = ev->timestamp;
timeout = kbd_process_events(timeout_kbd, &kev, 1); timeout = kbd_process_events(active_kbd, &kev, 1);
break; break;
case EV_DEV_EVENT: case EV_DEV_EVENT:
if (ev->dev->data) { if (ev->dev->data) {
struct keyboard *kbd = ev->dev->data; struct keyboard *kbd = ev->dev->data;
timeout_kbd = ev->dev->data; active_kbd = ev->dev->data;
switch (ev->devev->type) { switch (ev->devev->type) {
size_t i; size_t i;
case DEV_KEY: case DEV_KEY:
@ -472,7 +490,7 @@ static int event_handler(struct event *ev)
* Treat scroll events as mouse buttons so oneshot and the like get * Treat scroll events as mouse buttons so oneshot and the like get
* cleared. * cleared.
*/ */
if (timeout_kbd) { if (active_kbd) {
kev.code = KEYD_EXTERNAL_MOUSE_BUTTON; kev.code = KEYD_EXTERNAL_MOUSE_BUTTON;
kev.pressed = 1; kev.pressed = 1;
kev.timestamp = ev->timestamp; kev.timestamp = ev->timestamp;

@ -247,7 +247,7 @@ static void deactivate_layer(struct keyboard *kbd, int idx)
assert(kbd->layer_state[idx].active > 0); assert(kbd->layer_state[idx].active > 0);
kbd->layer_state[idx].active--; kbd->layer_state[idx].active--;
kbd->output.on_layer_change(kbd, kbd->config.layers[idx].name, 0); kbd->output.on_layer_change(kbd, &kbd->config.layers[idx], 0);
} }
/* /*
@ -266,7 +266,7 @@ static void activate_layer(struct keyboard *kbd, uint8_t code, int idx)
if ((ce = cache_get(kbd, code))) if ((ce = cache_get(kbd, code)))
ce->layer = idx; ce->layer = idx;
kbd->output.on_layer_change(kbd, kbd->config.layers[idx].name, 1); kbd->output.on_layer_change(kbd, &kbd->config.layers[idx], 1);
} }
/* Returns: /* Returns:
@ -443,6 +443,8 @@ static void setlayout(struct keyboard *kbd, uint8_t idx)
kbd->layer_state[idx].activation_time = 1; kbd->layer_state[idx].activation_time = 1;
kbd->layer_state[idx].active = 1; kbd->layer_state[idx].active = 1;
kbd->output.on_layer_change(kbd, &kbd->config.layers[idx], 1);
} }

@ -32,7 +32,7 @@ struct key_event {
struct output { struct output {
void (*send_key) (uint8_t code, uint8_t state); void (*send_key) (uint8_t code, uint8_t state);
void (*on_layer_change) (const struct keyboard *kbd, const char *name, uint8_t active); void (*on_layer_change) (const struct keyboard *kbd, const struct layer *layer, uint8_t active);
}; };
/* May correspond to more than one physical input device. */ /* May correspond to more than one physical input device. */

@ -9,5 +9,3 @@ meta up
control up control up
\ down \ down
\ up \ up
control down
control up

@ -218,7 +218,7 @@ void run_test(struct keyboard *kbd, const char *path)
} }
} }
static void on_layer_change(const struct keyboard *kbd, const char *name, uint8_t active) static void on_layer_change(const struct keyboard *kbd, const struct layer *layer, uint8_t active)
{ {
} }

Loading…
Cancel
Save