From 1135ec29c222dc6827ea352cf5c94d195a2c2a35 Mon Sep 17 00:00:00 2001 From: Raheman Vaiya Date: Wed, 27 Jul 2022 01:49:20 -0400 Subject: [PATCH] config: Add aliases --- data/keyd-application-mapper.1.gz | Bin 1485 -> 1485 bytes data/keyd.1.gz | Bin 6498 -> 6890 bytes docs/keyd.scdoc | 54 +++++++++- src/config.c | 160 +++++++++++++++++++++--------- src/config.h | 11 +- 5 files changed, 176 insertions(+), 49 deletions(-) diff --git a/data/keyd-application-mapper.1.gz b/data/keyd-application-mapper.1.gz index 5661b789c70a03101bf9add774cee21299d5d77f..8213c3f17549e8a0cce40714dcf5ae208bd47d6d 100644 GIT binary patch delta 668 zcmV;N0%QHn3(X6V8w3HhjTDg|#eZxk%im}D*=zcEHa|V#k4G%&Vp?8}hu?iV`S59R z@|nNqV8@#-(#^^gEAms93CUgbJ%dK;jL2m^M1_U-SV%7}p=Jr+-4VT#xpe zTt!*|UeJY9O6m}F#4L4XT2PNVAmN#g zMap!4o96)L9Hxm2stjbXQYq`oS?g{%7f7dhF8sDtmVY>-AG0SH$2c6de{q#%Pmc9% z=XD5-^6|b8y#cPW@X9A%PG87srWVM0#;W z5B_~mzi}0~IfmlM(FZ19kE4l5b}+wZlFqOMilJSC6i2-lZ6VQeWwpP|aHolgg zBUBtGr<(UCL35%nPwvbDmiGq!+2I!0s6SraLX=go6`~*X$9gU`%YS>RAEdd3POXCa zG9bYb5vDE=WV=xtavh6GS-X+;R1iwvnp=d}SoUbkLV2{yWS@c3uNWWtR`F;#V8|DB z3vGYhhsw(RE5-*Co5CQ*<{y2LprNWT70bIm8)zOdaH&(vEmN*+z%jOZJ;CqOZ{&Dw zV%)G6m5mVE75zf5rhic_$At@7IJ>_T$0b-@ggD*bnjaGO8dZ2VS+v2F0Mx01`QPKi z#mc+J^bH#@aPO=b{i}@}*5B>@e`xVRyD+_8W8yI-^XVZoh}tq+!dRkfcZ?l(WlDWB zp;9lzm5PuB#&k#I12^B#EK}DAN>r`6#oc zX-m`A0sfHN8j%&U$Q$>PrO@fZRHi_Xa2*DOW#$+M!>p}aDoeh%h*|2&w4fe!K*BQ} zi8Bm-$(eq{2@<2S$|#`c#vX#UTLox+~|p^=isi@ocgyILINQGE{+q!i1gx$ z9{l^Be&Z@|a}33iqYq5J9!C?A>|lP+B%NUi$cYs3B;y6C5(D0*C!h@%Y^|(;YB1~N#$abSP7h4N^Z$vy+6Uok%Pt>V#gz>qKM z7TW&050#bsSBwuPHibcq%|H4gK|@txDwcPBHqbm^;8LfSTc%vufMaa+dV=4l-^lUW z#JFKCDjOlREBb|AO@E_WjtdvEaCUzwj!Uq*2ywc8Vv=F>xF5Vd8tgt0`|?if4n%9Q$M zLZx1aD-|INjOmazc0s@{O*F`@VLUzh`B~wt^LwIh45l@2QL|qIW&#M9aH0R_3jhG# CkWx1Q diff --git a/data/keyd.1.gz b/data/keyd.1.gz index 52c75d7a3e97a88639c6ffc4ea6f233299a9f059..927d705ec18bc37dc68f5fc81db61988d2da9bbe 100644 GIT binary patch literal 6890 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 literal 6498 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 IY>q_$0BdsH{Qv*} diff --git a/docs/keyd.scdoc b/docs/keyd.scdoc index 50c4332..8446ce3 100644 --- a/docs/keyd.scdoc +++ b/docs/keyd.scdoc @@ -177,7 +177,7 @@ and each modifier is one of: Finally, each layer heading is followed by a set of bindings which take the form: - = || + | = || for a description of and see _ACTIONS_ and _MACROS_. @@ -277,6 +277,58 @@ E.G *Note:* You may have to restart your applications for this to take effect. +## Aliases + +A config file may include *aliases* which can be used as valid left hand values +in place of one or more keycodes. For example, the default alias *meta* is bound +to leftmeta and rightmeta. Thus the binding 'meta = a' is equivalent to the +bindings 'leftmeta = a' and 'rightmeta = a'. + +Aliases are defined in a special section called 'aliases' where each line takes the form: + + = + +and __ must be a valid key name. + +Note that may itself be a valid key, in which case all references to the +key will be replaced with the new key. When used judiciously, aliases can be +used in conjunction with the include directive to share bindings between +keyboards with different physical layouts. + +For example: + +``` +/etc/keyd/common: + meta = oneshot(meta) + alt = oneshot(alt) + + a = a + s = o + # etc.. + +/etc/keyd/default.conf: + [ids] + * + + [main] + include common + +/etc/keyd/magic_keyboard.conf: + [ids] + 004c:0267 + + [aliases] + meta = leftalt + meta = rightalt + alt = leftmeta + alt = rightmeta + + [main] + include common +``` + +Allows the user to define a set of universal bindings in /etc/keyd/common without having to explicitly account for the transposed meta and alt keys on an apple keyboard. + ## File Inclusion Config files may include other files located within the config directory using diff --git a/src/config.c b/src/config.c index 6338f00..a1e8ab6 100644 --- a/src/config.c +++ b/src/config.c @@ -120,39 +120,21 @@ fail: /* Return up to two keycodes associated with the given name. */ -static int lookup_keycodes(const char *name, uint8_t *code1, uint8_t *code2) +static uint8_t lookup_keycode(const char *name) { size_t i; - /* - * If the name is a modifier like 'control' we associate it with both - * corresponding key codes (e.g 'rightcontrol'/'leftcontrol') - */ - for (i = 0; i < MAX_MOD; i++) { - const struct modifier_table_ent *mod = &modifier_table[i]; - - if (!strcmp(mod->name, name)) { - *code1 = mod->code1; - *code2 = mod->code2; - - return 0; - } - } - for (i = 0; i < 256; i++) { const struct keycode_table_ent *ent = &keycode_table[i]; if (ent->name && (!strcmp(ent->name, name) || (ent->alt_name && !strcmp(ent->alt_name, name)))) { - *code1 = i; - *code2 = 0; - - return 0; + return i; } } - return -1; + return 0; } int config_get_layer_index(const struct config *config, const char *name) @@ -166,12 +148,41 @@ int config_get_layer_index(const struct config *config, const char *name) return -1; } - /* * Consumes a string of the form `[.] = ` and adds the * mapping to the corresponding layer in the config. */ +int set_layer_entry(const struct config *config, struct layer *layer, + const char *key, const struct descriptor *d) +{ + size_t i; + int found = 0; + + for (i = 0; i < config->nr_aliases; i++) { + const struct alias *alias = &config->aliases[i]; + + if (!strcmp(alias->name, key)) { + layer->keymap[alias->code] = *d; + found = 1; + } + } + + if (!found) { + uint8_t code; + + if (!(code = lookup_keycode(key))) { + err("%s is not a valid keycode or alias.", key); + return -1; + } + + layer->keymap[code] = *d; + + } + + return 0; +} + int config_add_entry(struct config *config, const char *exp) { uint8_t code1, code2; @@ -210,21 +221,10 @@ int config_add_entry(struct config *config, const char *exp) layer = &config->layers[idx]; - if (lookup_keycodes(keyname, &code1, &code2) < 0) { - err("%s is not a valid key.", keyname); - return -1; - } - if (parse_descriptor(descstr, &d, config) < 0) return -1; - if (code1) - layer->keymap[code1] = d; - - if (code2) - layer->keymap[code2] = d; - - return 0; + return set_layer_entry(config, layer, keyname, &d); } /* @@ -325,6 +325,71 @@ static void parse_globals(const char *path, struct config *config, struct ini_se } } +static void add_alias(struct config *config, const char *name, uint8_t code) +{ + if (config->nr_aliases >= MAX_ALIASES) { + fprintf(stderr, "\tERROR: Max aliases (%d) exceeded\n", + MAX_ALIASES); + return; + } + + struct alias *alias = &config->aliases[config->nr_aliases]; + + alias->name[sizeof(alias->name)-1] = 0; + strncpy(alias->name, name, sizeof(alias->name)-1); + alias->code = code; + + config->nr_aliases++; +} + +void create_modifier_aliases(struct config *config) +{ + uint8_t aliased_mods[MAX_MOD] = { 0 }; + size_t i; + + for (i = 0; i < config->nr_aliases; i++) { + size_t j; + + for (j = 0; j < MAX_MOD; j++) { + const struct modifier_table_ent *mod = &modifier_table[j]; + const struct alias *alias = &config->aliases[i]; + + if (!strcmp(alias->name, mod->name)) + aliased_mods[j] = 1; + } + } + + for (i = 0; i < MAX_MOD; i++) { + const struct modifier_table_ent *mod = &modifier_table[i]; + + // Don't create modifier aliases for modifier names which are explicitly + // redefined by the user. + if (!aliased_mods[i]) { + add_alias(config, mod->name, mod->code1); + add_alias(config, mod->name, mod->code2); + } + } +} + +static void parse_aliases(const char *path, struct config *config, struct ini_section *section) +{ + size_t i; + + for (i = 0; i < section->nr_entries;i++) { + uint8_t code; + struct ini_entry *ent = §ion->entries[i]; + + if ((code = lookup_keycode(ent->val))) { + add_alias(config, ent->key, code); + } else { + fprintf(stderr, + "\tERROR %s:%zd: Failed to define alias %s, %s is not a valid keycode\n", + path, ent->lnum, + ent->key, ent->val); + } + } +} + int config_parse(struct config *config, const char *path) { size_t i; @@ -345,28 +410,29 @@ int config_parse(struct config *config, const char *path) for (i = 0; i < ini->nr_sections; i++) { section = &ini->sections[i]; - if (!strcmp(section->name, "ids") || - !strcmp(section->name, "global")) - continue; - - - if (config_add_layer(config, section->name) < 0) - fprintf(stderr, "\tERROR %s:%zd: %s\n", path, section->lnum, errstr); + if (!strcmp(section->name, "ids")) { + ;; + } else if (!strcmp(section->name, "aliases")) { + parse_aliases(path, config, section); + } else if (!strcmp(section->name, "global")) { + parse_globals(path, config, section); + } else { + if (config_add_layer(config, section->name) < 0) + fprintf(stderr, "\tERROR %s:%zd: %s\n", path, section->lnum, errstr); + } } + create_modifier_aliases(config); /* Populate each layer. */ for (i = 0; i < ini->nr_sections; i++) { size_t j; char *layername; section = &ini->sections[i]; - if (!strcmp(section->name, "ids")) - continue; - - if (!strcmp(section->name, "global")) { - parse_globals(path, config, section); + if (!strcmp(section->name, "ids") || + !strcmp(section->name, "aliases") || + !strcmp(section->name, "globals")) continue; - } layername = strtok(section->name, ":"); diff --git a/src/config.h b/src/config.h index bb6dfbb..6c536d9 100644 --- a/src/config.h +++ b/src/config.h @@ -13,12 +13,20 @@ #define MAX_MACROS 256 #define MAX_AUX_DESCRIPTORS 64 +#define MAX_ALIAS_LEN 32 +#define MAX_ALIASES 64 + #include "layer.h" #include "descriptor.h" #include "macro.h" #include "command.h" +struct alias { + char name[MAX_ALIAS_LEN]; + uint8_t code; +}; + struct config { struct layer layers[MAX_LAYERS]; @@ -26,9 +34,10 @@ struct config { struct descriptor descriptors[MAX_AUX_DESCRIPTORS]; struct macro macros[MAX_MACROS]; struct command commands[MAX_COMMANDS]; + struct alias aliases[MAX_ALIASES]; + size_t nr_aliases; size_t nr_layers; - size_t nr_macros; size_t nr_descriptors; size_t nr_commands;