/* 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! */ #include "g/engine.h" // 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]);