summaryrefslogtreecommitdiff
path: root/users/ericgebhart/extensions/smart_lock.h
diff options
context:
space:
mode:
Diffstat (limited to 'users/ericgebhart/extensions/smart_lock.h')
-rw-r--r--users/ericgebhart/extensions/smart_lock.h103
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 <e.a.gebhart@gmail.com>
+
+ 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