diff options
author | lokher <lokher@gmail.com> | 2022-12-06 17:04:10 +0800 |
---|---|---|
committer | lokher <lokher@gmail.com> | 2022-12-06 17:04:10 +0800 |
commit | 27fc28fd2ff52e079a5bc58d6aaea4c752420615 (patch) | |
tree | 7ac943fb1ba4f430a7220efd18f66f6a77205c30 /keyboards/gboards/engine/keymap_engine.h | |
parent | e736133392fe6427cfb995da0787337189828272 (diff) | |
parent | 2709b6ed616f8012ff4cfd3ee69a822a8d188351 (diff) |
Merge upstream master
Diffstat (limited to 'keyboards/gboards/engine/keymap_engine.h')
-rw-r--r-- | keyboards/gboards/engine/keymap_engine.h | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/keyboards/gboards/engine/keymap_engine.h b/keyboards/gboards/engine/keymap_engine.h new file mode 100644 index 0000000000..599c1ca3e4 --- /dev/null +++ b/keyboards/gboards/engine/keymap_engine.h @@ -0,0 +1,121 @@ +/* If for some reason you're still here, maybe due to horror, shock or + * some other godforsaken reason. Meet X Macros. + * + * The we abuse the include system to generate data structures that are + * used by the internal chording engine. The alternative to this is + * using a external generator (Like is done for the ASETNIOP base keymaps) + * With this disgusting bodge, you can just edit your .defs and compile! + */ + +// Clear all X Macros +#define PRES BLANK +#define KEYS BLANK +#define SUBS BLANK +#define EXEC BLANK +#define SPEC BLANK + +// Process single key pushes +#undef PRES +#define PRES P_KEYMAP +const struct keyEntry keyDict[] = { +#include "dicts.def" +}; +#undef PRES +#define PRES BLANK + +// Process Combos +#undef KEYS +#define KEYS K_ACTION +#include "dicts.def" +#undef KEYS +#define KEYS BLANK + +#undef KEYS +#define KEYS K_KEYMAP +const struct comboEntry PROGMEM cmbDict[] = { +#include "dicts.def" +}; +#undef KEYS +#define KEYS BLANK + +// Process String stubs +#undef SUBS +#define SUBS S_ACTION +#include "dicts.def" +#undef SUBS +#define SUBS BLANK + +// Generate dict for strings +#undef SUBS +#define SUBS S_KEYMAP +const struct stringEntry PROGMEM strDict[] = { +#include "dicts.def" +}; +#undef SUBS +#define SUBS BLANK + +// Generate function stubs +#undef EXEC +#define EXEC X_ACTION +#include "dicts.def" +#undef EXEC +#define EXEC BLANK + +// Process the function structure +#undef EXEC +#define EXEC X_KEYMAP +const struct funcEntry funDict[] = { +#include "dicts.def" +}; +#undef EXEC +#define EXEC BLANK + +// Handle Special calls +#undef SPEC +#define SPEC Z_KEYMAP +const struct specialEntry spcDict[] = { +#include "dicts.def" +}; +#undef SPEC +#define SPEC BLANK + +// Test for collisions! +// Switch statement will explode on duplicate +// chords. This will be optimized out +#undef PRES +#undef KEYS +#undef SUBS +#undef EXEC +#undef SPEC +#define PRES TEST_COLLISION +#define KEYS TEST_COLLISION +#define SUBS TEST_COLLISION +#define EXEC TEST_COLLISION +#define SPEC TEST_COLLISION +void testCollisions(void) { + C_SIZE bomb = 0; + switch (bomb) { +#include "dicts.def" + } +} + +// Test for unexpected input +// Should return blank lines for all valid input +#undef PRES +#undef KEYS +#undef SUBS +#undef EXEC +#undef SPEC +#define PRES BLANK +#define KEYS BLANK +#define SUBS BLANK +#define EXEC BLANK +#define SPEC BLANK +#include "dicts.def" + +// Get size data back into the engine +size_t funcsLen = ARRAY_SIZE(funDict); +size_t stringLen = ARRAY_SIZE(strDict); +size_t keyLen = ARRAY_SIZE(keyDict); +size_t comboLen = ARRAY_SIZE(cmbDict); +size_t specialLen = ARRAY_SIZE(spcDict); |