diff options
Diffstat (limited to 'users/ericgebhart/extensions/smart_lock.h')
-rw-r--r-- | users/ericgebhart/extensions/smart_lock.h | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/users/ericgebhart/extensions/smart_lock.h b/users/ericgebhart/extensions/smart_lock.h new file mode 100644 index 0000000000..0102d611cd --- /dev/null +++ b/users/ericgebhart/extensions/smart_lock.h @@ -0,0 +1,103 @@ +#pragma once +/* + Copyright 2018-2022 Eric Gebhart <[email protected]> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ +#include QMK_KEYBOARD_H +#include USERSPACE_H + +#ifdef SMART_LOCK_ENABLE +typedef enum { + sml_layer, + sml_mod +} smart_lock_type; + +typedef struct { + bool active; + const uint16_t *keys; + uint16_t keycode; + uint16_t thing; + smart_lock_type type; +} smart_lock_t; + + +// smart layer, smart mods +#undef SMLL +#undef SMLM +#define SMLL(key, layer, ...) +#define SMLM(key, mod, ...) // to replace mod_lock.. +#define COND_KEYS_END 0 + +#define CONCATENATE_SA(a, ...) a ## __VA_ARGS__ +#define CONCATENATE_S(a, ...) a ## __VA_ARGS__ +#define CAT_S(a, ...) CONCATENATE_S(a, __VA_ARGS__) +#define MK_SKEY(KC) CONCATENATE_S(sml_, KC) +#define MK_ARRAY(KC) \ + const uint16_t PROGMEM CONCATENATE_SA(sml_, KC)[] + +// to create an enum and find how many... +#define S_ENUM(kc, layer, ...) CAT_S(sml__, kc), +// create a const array of the condkeys for each SML +#define S_DATA(kc, thing, ...) MK_ARRAY(kc) = {__VA_ARGS__, COND_KEYS_END}; + +// create a list of smart_lock structs. Two names, one for mod one for layer to be concise. +#define S_SMART_LOCK(kc, layer, ...) {false, MK_SKEY(kc), kc, layer, sml_layer}, +#define M_SMART_LOCK(kc, mod, ...) {false, MK_SKEY(kc), kc, mod, sml_mod}, + +#define SML(sk, sa, st, stype) \ + { .keys = &(sk)[0], .keycode = (sa), .thing = (st), .smart_lock_type = stype} +#define K_SMLM(key, mod...) [MK_SKEY(key)] = SML(MK_SKEY(key), key, mod, sml_mod), +#define K_SMLL(key, layer...) [MK_SKEY(key)] = SML(MK_SKEY(key), key, layer, sml_layer), + +// Set everything up +// - Create enum of names, (sml_keycode). Used as indexes in the arrays. +// avoids using the keycodes which would create a sparse/large array. +// - Create array of conditional locks.. +// - Create array of the conditional keys for the locks, by name. + +// Create Enum +#undef SMLL +#undef SMLM +#define SMLL S_ENUM +#define SMLM S_ENUM + +// find how many +enum smart_locks { +#include "smart_lock.def" + SML_LENGTH +}; +uint16_t SML_LEN = SML_LENGTH; + +// Bake locks into mem, name, ignore/cancel keys +#undef SMLL +#undef SMLM +#undef TOGG +#define SMLL S_DATA +#define SMLM S_DATA +#include "smart_lock.def" +#undef SMLL +#undef SMLM + +// Fill array of locks by name, kc, layer/mod. +#define SMLL S_SMART_LOCK +#define SMLM M_SMART_LOCK + +smart_lock_t smart_locks[] = { +#include "smart_lock.def" +}; +#undef SMLL +#undef SMLM + +#endif |