diff options
author | Jeremy Bernhardt <jeremythegeek@gmail.com> | 2020-05-04 10:49:47 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-04 12:49:47 -0400 |
commit | 15e84f79f177d92e0faeb5e424a48506489eb955 (patch) | |
tree | 8936f6087b900274928107b4fbf27a3bba149d92 /keyboards/gboards/engine/keymap_engine.h | |
parent | 6f30b402a285ddecce9b6f5b002a649f775225d2 (diff) |
gBoards Common (#8921)
Co-Authored-By: Drashna Jaelre <drashna@live.com>
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..c8a42a052b --- /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 = sizeof(funDict) / sizeof(funDict[0]); +size_t stringLen = sizeof(strDict) / sizeof(strDict[0]); +size_t keyLen = sizeof(keyDict) / sizeof(keyDict[0]); +size_t comboLen = sizeof(cmbDict) / sizeof(cmbDict[0]); +size_t specialLen = sizeof(spcDict) / sizeof(spcDict[0]); |