Fix layout_indicator

master
Raheman Vaiya 4 years ago
parent 2507ac7d7e
commit 312ab6efc0
  1. BIN
      data/keyd.1.gz
  2. 3
      docs/keyd.scdoc
  3. 19
      src/daemon.c
  4. 32
      src/keyboard.c
  5. 7
      src/keyboard.h
  6. 10
      src/keyd.c
  7. 2
      src/keyd.h

Binary file not shown.

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

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

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

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

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

@ -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,

Loading…
Cancel
Save