summaryrefslogtreecommitdiffstats
path: root/users/ericgebhart/extensions/keymap_combo.h
diff options
context:
space:
mode:
authorEric Gebhart <e.a.gebhart@gmail.com>2022-11-12 00:09:41 +0100
committerGitHub <noreply@github.com>2022-11-11 23:09:41 +0000
commit050472a4d07d07c1d9ae17d2fd26d44e9d95d950 (patch)
tree8c326011ec8cac395a92839ec4b420bf12652fa1 /users/ericgebhart/extensions/keymap_combo.h
parent49a78b81145213e2883e6c3beab6d9c136c10085 (diff)
Eric Gebhart user space and keymaps (#17487)
Co-authored-by: Drashna Jaelre <drashna@live.com>
Diffstat (limited to 'users/ericgebhart/extensions/keymap_combo.h')
-rw-r--r--users/ericgebhart/extensions/keymap_combo.h139
1 files changed, 139 insertions, 0 deletions
diff --git a/users/ericgebhart/extensions/keymap_combo.h b/users/ericgebhart/extensions/keymap_combo.h
new file mode 100644
index 0000000000..cd9684e601
--- /dev/null
+++ b/users/ericgebhart/extensions/keymap_combo.h
@@ -0,0 +1,139 @@
+#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/>.
+*/
+// Keymap helpers
+void process_combo_event(uint16_t combo_index, bool pressed);
+
+
+// define reference layers per layer.
+#define REF_LAYER(LAYER, REF_LAYER) \
+ case LAYER: return REF_LAYER;
+
+#define K_ENUM(name, key, ...) name,
+#define K_DATA(name, key, ...) const uint16_t PROGMEM cmb_##name[] = {__VA_ARGS__, COMBO_END};
+#define K_COMB(name, key, ...) [name] = COMBO(cmb_##name, key),
+
+#define A_ENUM(name, string, ...) name,
+#define A_DATA(name, string, ...) const uint16_t PROGMEM cmb_##name[] = {__VA_ARGS__, COMBO_END};
+#define A_COMB(name, string, ...) [name] = COMBO_ACTION(cmb_##name),
+#define A_ACTI(name, string, ...) \
+ case name: \
+ if (pressed) SEND_STRING(string); \
+ break;
+
+#define A_TOGG(name, layer, ...) \
+ case name: \
+ if (pressed) layer_invert(layer); \
+ break;
+
+#define BLANK(...)
+// Generate data needed for combos/actions
+// Create Enum
+#define COMBO_REF_LAYER BLANK
+#undef COMB
+#undef SUBS
+#undef TOGG
+#define COMB K_ENUM
+#define SUBS A_ENUM
+#define TOGG A_ENUM
+enum combos {
+#include "combos.def"
+ COMBO_LENGTH
+};
+// Export length to combo module
+uint16_t COMBO_LEN = COMBO_LENGTH;
+
+// Bake combos into mem
+#undef COMB
+#undef SUBS
+#undef TOGG
+#define COMB K_DATA
+#define SUBS A_DATA
+#define TOGG A_DATA
+#include "combos.def"
+#undef COMB
+#undef SUBS
+#undef TOGG
+
+// Fill combo array
+#define COMB K_COMB
+#define SUBS A_COMB
+#define TOGG A_COMB
+combo_t key_combos[] = {
+#include "combos.def"
+};
+#undef COMB
+#undef SUBS
+#undef TOGG
+
+// Fill QMK hook
+#define COMB BLANK
+#define SUBS A_ACTI
+#define TOGG A_TOGG
+
+void process_combo_event(uint16_t combo_index, bool pressed) {
+#if defined( CONSOLE_ENABLE) && defined(CONSOLE_KEY_LOGGER_ENABLE)
+ if (pressed) {
+ combo_t *combo = &key_combos[combo_index];
+ uint8_t idx = 0;
+ uint16_t combo_keycode;
+ while ((combo_keycode = pgm_read_word(&combo->keys[idx])) != COMBO_END) {
+ uprintf("0x%04X,NA,NA,%u,%u,0x%02X,0x%02X,0\n",
+ combo_keycode,
+ /* <missing row information> */
+ /* <missing column information> */
+ get_highest_layer(layer_state),
+ pressed,
+ get_mods(),
+ get_oneshot_mods()
+ );
+ idx++;
+ }
+ }
+#endif
+ switch (combo_index) {
+#include "combos.def"
+ }
+
+ // Allow user overrides per keymap
+#if __has_include("inject.h")
+# include "inject.h"
+#endif
+}
+
+#undef COMB
+#undef SUBS
+#undef TOGG
+
+#define COMB BLANK
+#define SUBS BLANK
+#define TOGG BLANK
+
+#undef COMBO_REF_LAYER
+#define COMBO_REF_LAYER REF_LAYER
+
+uint16_t combo_ref_from_layer(uint16_t layer){
+ switch (biton32(layer_state)){
+#include "combos.def"
+
+#ifdef COMBO_REF_DEFAULT
+ default: return COMBO_REF_DEFAULT;
+#else
+ default: return layer;
+#endif
+ }
+}