From 050472a4d07d07c1d9ae17d2fd26d44e9d95d950 Mon Sep 17 00:00:00 2001 From: Eric Gebhart Date: Sat, 12 Nov 2022 00:09:41 +0100 Subject: Eric Gebhart user space and keymaps (#17487) Co-authored-by: Drashna Jaelre --- users/ericgebhart/extensions/keymap_combo.h | 139 ++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 users/ericgebhart/extensions/keymap_combo.h (limited to 'users/ericgebhart/extensions/keymap_combo.h') 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 + + 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 . +*/ +// 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, + /* */ + /* */ + 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 + } +} -- cgit v1.2.3