diff --git a/src/main.c b/src/main.c index deebbea..89c861e 100644 --- a/src/main.c +++ b/src/main.c @@ -397,6 +397,7 @@ static void process_event(struct keyboard *kbd, struct input_event *ev) switch(d->action) { struct layer *layer; uint32_t keyseq; + uint16_t keycode; case ACTION_OVERLOAD: keyseq = d->arg.keyseq; @@ -409,7 +410,7 @@ static void process_event(struct keyboard *kbd, struct input_event *ev) layer->active = 0; if(lastd == d) { //If tapped - uint16_t key = keyseq & 0xFF; + uint16_t key = keyseq & 0xFFFF; mods |= keyseq >> 16; setmods(mods); @@ -471,13 +472,19 @@ static void process_event(struct keyboard *kbd, struct input_event *ev) break; case ACTION_KEYSEQ: mods |= d->arg.keyseq >> 16; + keycode = d->arg.keyseq & 0xFFFF; if(pressed) { setmods(mods); - send_key(d->arg.keyseq & 0xFF, 1); + //Account for the possibility that a version of the key + //with a different modifier set is already depressed (e.g [/{) + if(keystate[keycode]) + send_key(keycode, 0); + + send_key(keycode, 1); } else { reify_layer_mods(kbd); - send_key(d->arg.keyseq & 0xFF, 0); + send_key(keycode, 0); } goto keyseq_cleanup; @@ -490,7 +497,7 @@ static void process_event(struct keyboard *kbd, struct input_event *ev) for(i = 0; i < sz;i++) { uint32_t seq = macro[i]; uint16_t mods = macro[i] >> 16; - uint16_t key = macro[i] & 0xFF; + uint16_t key = macro[i] & 0xFFFF; if(mods & MOD_TIMEOUT) { usleep(GET_TIMEOUT(seq)*1000);