Allow mapping to modifier keycodes

master
Raheman Vaiya 4 years ago
parent 3e5aaacd45
commit c5f77c5951
  1. 7
      src/descriptor.c
  2. 25
      src/keyd.c
  3. 13
      t/layer4.t
  4. 2
      t/run.sh
  5. 1
      t/test.conf

@ -236,10 +236,9 @@ int parse_descriptor(char *s,
if (!parse_key_sequence(s, &seq)) {
desc->op = OP_KEYSEQ;
if (keycode_to_mod(seq.code)) {
err("modifier keycodes are not directly mappable, you probably want layer(<modifier name>) (e.g layer(alt))");
return -1;
}
if (keycode_to_mod(seq.code))
fprintf(stderr,
"WARNING: mapping modifier keycodes directly may produce unintended results, you probably want layer(<modifier name>) instead\n");
desc->args[0].sequence = seq;
} else if (!parse_macro_fn(&config->macros[macro_idx], s)) {

@ -226,22 +226,23 @@ static void send_repetitions()
void set_mods(uint16_t mods)
{
static uint16_t state = 0;
size_t i;
for (i = 0; i < sizeof modifier_table / sizeof modifier_table[0]; i++) {
struct modifier_table_ent *m = &modifier_table[i];
uint16_t diff = mods ^ state;
if (m->mask & mods) {
if (!keystate[m->code1] && !keystate[m->code2])
send_key(m->code1, 1);
} else {
if (keystate[m->code1])
send_key(m->code1, 0);
if (MOD_CTRL & diff)
send_key(KEY_LEFTCTRL, !!(MOD_CTRL & mods));
if (MOD_ALT_GR & diff)
send_key(KEY_RIGHTALT, !!(MOD_ALT_GR & mods));
if (MOD_SHIFT & diff)
send_key(KEY_LEFTSHIFT, !!(MOD_SHIFT & mods));
if (MOD_SUPER & diff)
send_key(KEY_LEFTMETA, !!(MOD_SUPER & mods));
if (MOD_ALT & diff)
send_key(KEY_LEFTALT, !!(MOD_ALT & mods));
if (keystate[m->code2])
send_key(m->code2, 0);
}
}
state = mods;
}
/* Block on the given keyboard nodes until no keys are depressed. */

@ -0,0 +1,13 @@
s down
meta down
c down
c up
meta up
s up
shift down
meta down
c down
c up
meta up
shift up

@ -4,7 +4,7 @@
cleanup() {
sudo pkill keyd
sleep .5s
sleep 1s
sudo systemctl restart keyd
trap - EXIT

@ -23,6 +23,7 @@ l = layer(test)
t = overload(o, esc, 2)
m = macro(C-h one)
- = layout(layout2)
s = leftshift
[layout2:layout]

Loading…
Cancel
Save