|
|
@ -33,23 +33,7 @@ extern HARDWARE_IMPLEMENTATION KeyboardHardware;
|
|
|
|
|
|
|
|
|
|
|
|
#define KEYMAP_SIZE (sizeof(keymaps) / ROWS / COLS / sizeof(Key))
|
|
|
|
#define KEYMAP_SIZE (sizeof(keymaps) / ROWS / COLS / sizeof(Key))
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
#define USE_PLUGINS(plugins...) Kaleidoscope.use(plugins)
|
|
|
|
* The `USE_PLUGINS()` macro is a clever hack, to make it seem like
|
|
|
|
|
|
|
|
* `Kaleidoscope.use()` is type-safe. It pushes its arguments into an
|
|
|
|
|
|
|
|
* appropriately typed array, so anything that does not fit the criteria, will
|
|
|
|
|
|
|
|
* trigger a compiler error.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* It then never uses the array, and passes the plugins over to
|
|
|
|
|
|
|
|
* `Kaleidoscope.use`, adding the trailing `NULL`, making it even easier to use.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* Since the array this macro creates is never used, the compiler will optimize
|
|
|
|
|
|
|
|
* it out fully. As such, by using this macro, we incur neither any size
|
|
|
|
|
|
|
|
* penalties, nor any run-time penalties. Everything happens at compile-time.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define USE_PLUGINS(plugins...) ({ \
|
|
|
|
|
|
|
|
static KaleidoscopePlugin *__p[] = {plugins, NULL}; \
|
|
|
|
|
|
|
|
Kaleidoscope.use(plugins, NULL); \
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class KaleidoscopePlugin {
|
|
|
|
class KaleidoscopePlugin {
|
|
|
|
public:
|
|
|
|
public:
|
|
|
@ -65,7 +49,34 @@ class Kaleidoscope_ {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void setup(void);
|
|
|
|
void setup(void);
|
|
|
|
void loop(void);
|
|
|
|
void loop(void);
|
|
|
|
void use(KaleidoscopePlugin *plugin, ...) __attribute__((sentinel));
|
|
|
|
|
|
|
|
|
|
|
|
// ---- Kaleidoscope.use() ----
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// First, we have the zero-argument version, which will satisfy the tail case.
|
|
|
|
|
|
|
|
inline void use() {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Then, the one-argument version, that gives us type safety for a single
|
|
|
|
|
|
|
|
// plugin.
|
|
|
|
|
|
|
|
inline void use(KaleidoscopePlugin *p) {
|
|
|
|
|
|
|
|
p->begin();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// We have a no-op with a int argument, as a temporary hack until we remove
|
|
|
|
|
|
|
|
// the last instance of a NULL-terminated Kaleidoscope.use() call.
|
|
|
|
|
|
|
|
inline void use(int) {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// And the magic is in the last one, a template. The first parameter is
|
|
|
|
|
|
|
|
// matched out by the compiler, and passed to one of the functions above. The
|
|
|
|
|
|
|
|
// rest of the parameter pack (which may be an empty set in a recursive case),
|
|
|
|
|
|
|
|
// are passed back to either ourselves, or the zero-argument version a few
|
|
|
|
|
|
|
|
// lines above.
|
|
|
|
|
|
|
|
template <typename... Plugins>
|
|
|
|
|
|
|
|
void use(KaleidoscopePlugin *first, Plugins&&... plugins) {
|
|
|
|
|
|
|
|
use(first);
|
|
|
|
|
|
|
|
use(plugins...);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ---- hooks ----
|
|
|
|
// ---- hooks ----
|
|
|
|
|
|
|
|
|
|
|
|