summaryrefslogtreecommitdiff
path: root/users/drashna/keyrecords
diff options
context:
space:
mode:
Diffstat (limited to 'users/drashna/keyrecords')
-rw-r--r--users/drashna/keyrecords/dynamic_macros.c283
-rw-r--r--users/drashna/keyrecords/dynamic_macros.h50
-rw-r--r--users/drashna/keyrecords/keycodes.md13
-rw-r--r--users/drashna/keyrecords/process_records.c200
-rw-r--r--users/drashna/keyrecords/process_records.h150
-rw-r--r--users/drashna/keyrecords/readme.md7
-rw-r--r--users/drashna/keyrecords/secrets.md122
-rw-r--r--users/drashna/keyrecords/tap_dance.md121
-rw-r--r--users/drashna/keyrecords/tap_dances.c67
-rw-r--r--users/drashna/keyrecords/tap_dances.h31
-rw-r--r--users/drashna/keyrecords/tapping.c66
-rw-r--r--users/drashna/keyrecords/unicode.c446
-rw-r--r--users/drashna/keyrecords/unicode.h21
-rw-r--r--users/drashna/keyrecords/unicode.md27
-rw-r--r--users/drashna/keyrecords/wrappers.h266
-rw-r--r--users/drashna/keyrecords/wrappers.md11
16 files changed, 0 insertions, 1881 deletions
diff --git a/users/drashna/keyrecords/dynamic_macros.c b/users/drashna/keyrecords/dynamic_macros.c
deleted file mode 100644
index 43c2336cb6..0000000000
--- a/users/drashna/keyrecords/dynamic_macros.c
+++ /dev/null
@@ -1,283 +0,0 @@
-// Copyright 2016 Jack Humbert
-// Copyright 2019 Wojciech Siewierski < wojciech dot siewierski at onet dot pl >
-// Copyright 2023 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "keyrecords/dynamic_macros.h"
-#include "keyrecords/process_records.h"
-#include "wait.h"
-#include "debug.h"
-#include "eeprom.h"
-#include "eeconfig.h"
-#include <string.h>
-
-static uint8_t macro_id = 255;
-static uint8_t recording_state = STATE_NOT_RECORDING;
-
-#if EECONFIG_USER_DATA_SIZE < 4
-# error "EECONFIG_USER_DATA_SIZE not set. Don't step on others eeprom."
-#endif
-#ifndef DYNAMIC_MACRO_EEPROM_BLOCK0_ADDR
-# define DYNAMIC_MACRO_EEPROM_BLOCK0_ADDR (uint8_t*)(EECONFIG_USER_DATABLOCK + 4)
-#endif
-
-dynamic_macro_t dynamic_macros[DYNAMIC_MACRO_COUNT];
-_Static_assert((sizeof(dynamic_macros)) <= (EECONFIG_USER_DATA_SIZE - 4), "User Data Size must be large enough to host all macros");
-
-__attribute__((weak)) void dynamic_macro_record_start_user(void) {}
-
-__attribute__((weak)) void dynamic_macro_play_user(uint8_t macro_id) {}
-
-__attribute__((weak)) void dynamic_macro_record_key_user(uint8_t macro_id, keyrecord_t* record) {}
-
-__attribute__((weak)) void dynamic_macro_record_end_user(uint8_t macro_id) {}
-
-/**
- * @brief Gets the current macro ID
- *
- * @return uint8_t
- */
-uint8_t dynamic_macro_get_current_id(void) {
- return macro_id;
-}
-
-/**
- * @brief Gets the current recording state
- *
- * @return uint8_t
- */
-uint8_t dynamic_macro_get_recording_state(void) {
- return recording_state;
-}
-
-/**
- * Start recording of the dynamic macro.
- *
- * @param macro_id[in] The id of macro to be recorded
- */
-bool dynamic_macro_record_start(uint8_t macro_id) {
- if (macro_id >= (uint8_t)(DYNAMIC_MACRO_COUNT)) {
- return false;
- }
- dprintf("dynamic macro recording: started for slot %d\n", macro_id);
-
- dynamic_macro_record_start_user();
-
- clear_keyboard();
- layer_clear();
-
- dynamic_macros[macro_id].length = 0;
- return true;
-}
-
-/**
- * Play the dynamic macro.
- *
- * @param macro_id[in] The id of macro to be played
- */
-void dynamic_macro_play(uint8_t macro_id) {
- if (macro_id >= (uint8_t)(DYNAMIC_MACRO_COUNT)) {
- return;
- }
-
- dprintf("dynamic macro: slot %d playback, length %d\n", macro_id, dynamic_macros[macro_id].length);
-
- layer_state_t saved_layer_state = layer_state;
-
- clear_keyboard();
- layer_clear();
-
- for (uint8_t i = 0; i < dynamic_macros[macro_id].length; ++i) {
- process_record(&dynamic_macros[macro_id].events[i]);
- }
-
- clear_keyboard();
-
- layer_state_set(saved_layer_state);
-
- dynamic_macro_play_user(macro_id);
-}
-
-/**
- * Record a single key in a dynamic macro.
- *
- * @param macro_id[in] The start of the used macro buffer.
- * @param record[in] The current keypress.
- */
-void dynamic_macro_record_key(uint8_t macro_id, keyrecord_t* record) {
- dynamic_macro_t* macro = &dynamic_macros[macro_id];
- uint8_t length = macro->length;
-
- /* If we've just started recording, ignore all the key releases. */
- if (!record->event.pressed && length == 0) {
- dprintln("dynamic macro: ignoring a leading key-up event");
- return;
- }
-
- if (length < DYNAMIC_MACRO_SIZE) {
- macro->events[length] = *record;
- macro->length = ++length;
- } else {
- dynamic_macro_record_key_user(macro_id, record);
- }
-
- dprintf("dynamic macro: slot %d length: %d/%d\n", macro_id, length, DYNAMIC_MACRO_SIZE);
-}
-
-/**
- * End recording of the dynamic macro. Essentially just update the
- * pointer to the end of the macro.
- */
-void dynamic_macro_record_end(uint8_t macro_id) {
- if (macro_id >= (uint8_t)(DYNAMIC_MACRO_COUNT)) {
- return;
- }
- dynamic_macro_record_end_user(macro_id);
-
- dynamic_macro_t* macro = &dynamic_macros[macro_id];
- uint8_t length = macro->length;
-
- keyrecord_t* events_begin = &(macro->events[0]);
- keyrecord_t* events_pointer = &(macro->events[length - 1]);
-
- dprintf("dynamic_macro: macro length before trimming: %d\n", macro->length);
- while (events_pointer != events_begin && (events_pointer)->event.pressed) {
- dprintln("dynamic macro: trimming a trailing key-down event");
- --(macro->length);
- --events_pointer;
- }
-
- macro->checksum = dynamic_macro_calc_crc(macro);
- dynamic_macro_save_eeprom(macro_id);
-
- dprintf("dynamic macro: slot %d saved, length: %d\n", macro_id, length);
-}
-
-bool process_record_dynamic_macro(uint16_t keycode, keyrecord_t* record) {
- if (STATE_NOT_RECORDING == recording_state) {
- /* Program key pressed to request programming mode */
- if (keycode == DYN_MACRO_PROG && record->event.pressed) {
- // dynamic_macro_led_blink();
-
- recording_state = STATE_RECORD_KEY_PRESSED;
- dprintf("dynamic macro: programming key pressed, waiting for macro slot selection. %d\n", recording_state);
-
- return false;
- }
- /* Macro key pressed to request macro playback */
- if (IS_DYN_KEYCODE(keycode) && record->event.pressed) {
- dynamic_macro_play(keycode - DYN_MACRO_KEY00);
-
- return false;
- }
-
- /* Non-dynamic macro key, process it elsewhere. */
- return true;
- } else if (STATE_RECORD_KEY_PRESSED == recording_state) {
- /* Program key pressed again before a macro selector key, cancel macro recording.
- Blink leds to indicate cancelation. */
- if (keycode == DYN_MACRO_PROG && record->event.pressed) {
- // dynamic_macro_led_blink();
-
- recording_state = STATE_NOT_RECORDING;
- dprintf("dynamic macro: programming key pressed, programming mode canceled. %d\n", recording_state);
-
- return false;
- } else if (IS_DYN_KEYCODE(keycode) && record->event.pressed) {
- macro_id = keycode - DYN_MACRO_KEY00;
-
- if (dynamic_macro_record_start(macro_id)) {
- /* Macro slot selected, enter recording state. */
- recording_state = STATE_CURRENTLY_RECORDING;
- } else {
- recording_state = STATE_NOT_RECORDING;
- }
-
- return false;
- }
- /* Ignore any non-macro key press while in RECORD_KEY_PRESSED state. */
- return false;
- } else if (STATE_CURRENTLY_RECORDING == recording_state) {
- /* Program key pressed to request end of macro recording. */
- if (keycode == DYN_MACRO_PROG && record->event.pressed) {
- dynamic_macro_record_end(macro_id);
- recording_state = STATE_NOT_RECORDING;
-
- return false;
- }
- /* Don't record other macro key presses. */
- else if (IS_DYN_KEYCODE(keycode) && record->event.pressed) {
- dprintln("dynamic macro: playback key ignored in programming mode.");
- return false;
- }
- /* Non-macro keypress that should be recorded */
- else {
- dynamic_macro_record_key(macro_id, record);
-
- /* Don't output recorded keypress. */
- return false;
- }
- }
-
- return true;
-}
-
-static inline uint16_t crc16_update(uint16_t crc, uint8_t a) {
- crc ^= a;
- for (uint8_t i = 0; i < 8; ++i) {
- if (crc & 1)
- crc = (crc >> 1) ^ 0xA001;
- else
- crc = (crc >> 1);
- }
- return crc;
-}
-
-uint16_t dynamic_macro_calc_crc(dynamic_macro_t* macro) {
- uint16_t crc = 0;
- uint8_t* data = (uint8_t*)macro;
-
- for (uint16_t i = 0; i < DYNAMIC_MACRO_CRC_LENGTH; ++i) {
- crc = crc16_update(crc, *(data++));
- }
- return crc;
-}
-
-inline void* dynamic_macro_eeprom_macro_addr(uint8_t macro_id) {
- return DYNAMIC_MACRO_EEPROM_BLOCK0_ADDR + sizeof(dynamic_macro_t) * macro_id;
-}
-
-void dynamic_macro_load_eeprom_all(void) {
- for (uint8_t i = 0; i < DYNAMIC_MACRO_COUNT; ++i) {
- dynamic_macro_load_eeprom(i);
- }
-}
-
-void dynamic_macro_load_eeprom(uint8_t macro_id) {
- dynamic_macro_t* dst = &dynamic_macros[macro_id];
-
- eeprom_read_block(dst, dynamic_macro_eeprom_macro_addr(macro_id), sizeof(dynamic_macro_t));
-
- /* Validate checksum, ifchecksum is NOT valid for macro, set its length to 0 to prevent its use. */
- if (dynamic_macro_calc_crc(dst) != dst->checksum) {
- dprintf("dynamic macro: slot %d not loaded, checksum mismatch\n", macro_id);
- dst->length = 0;
-
- return;
- }
-
- dprintf("dynamic macro: slot %d loaded from eeprom, checksum okay\n", macro_id);
-}
-
-void dynamic_macro_save_eeprom(uint8_t macro_id) {
- dynamic_macro_t* src = &dynamic_macros[macro_id];
-
- eeprom_update_block(src, dynamic_macro_eeprom_macro_addr(macro_id), sizeof(dynamic_macro_t));
- dprintf("dynamic macro: slot %d saved to eeprom\n", macro_id);
-}
-
-void dynamic_macro_init(void) {
- /* zero out macro blocks */
- memset(&dynamic_macros, 0, DYNAMIC_MACRO_COUNT * sizeof(dynamic_macro_t));
- dynamic_macro_load_eeprom_all();
-}
diff --git a/users/drashna/keyrecords/dynamic_macros.h b/users/drashna/keyrecords/dynamic_macros.h
deleted file mode 100644
index 5eefb9b268..0000000000
--- a/users/drashna/keyrecords/dynamic_macros.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2016 Jack Humbert
-// Copyright 2019 Wojciech Siewierski < wojciech dot siewierski at onet dot pl >
-// Copyright 2023 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "action.h"
-#include "action_layer.h"
-
-#ifndef DYNAMIC_MACRO_COUNT
-# define DYNAMIC_MACRO_COUNT 8
-#endif
-
-#ifndef DYNAMIC_MACRO_SIZE
-# define DYNAMIC_MACRO_SIZE 64
-#endif
-
-enum dynamic_macro_recording_state {
- STATE_NOT_RECORDING,
- STATE_RECORD_KEY_PRESSED,
- STATE_CURRENTLY_RECORDING,
-};
-
-typedef struct {
- keyrecord_t events[DYNAMIC_MACRO_SIZE];
- uint8_t length;
- uint16_t checksum;
-} dynamic_macro_t;
-
-void dynamic_macro_init(void);
-bool dynamic_macro_record_start(uint8_t macro_id);
-void dynamic_macro_play(uint8_t macro_id);
-void dynamic_macro_record_key(uint8_t macro_id, keyrecord_t* record);
-void dynamic_macro_record_end(uint8_t macro_id);
-bool process_record_dynamic_macro(uint16_t keycode, keyrecord_t* record);
-
-void dynamic_macro_record_start_user(void);
-void dynamic_macro_play_user(uint8_t macro_id);
-void dynamic_macro_record_key_user(uint8_t macro_id, keyrecord_t* record);
-void dynamic_macro_record_end_user(uint8_t macro_id);
-
-#define DYNAMIC_MACRO_CRC_LENGTH (sizeof(dynamic_macro_t) - sizeof(uint16_t))
-#define IS_DYN_KEYCODE(keycode) (keycode >= DYN_MACRO_KEY00 && keycode <= DYN_MACRO_KEY15)
-
-uint16_t dynamic_macro_calc_crc(dynamic_macro_t* macro);
-void dynamic_macro_load_eeprom_all(void);
-void dynamic_macro_load_eeprom(uint8_t macro_id);
-void dynamic_macro_save_eeprom(uint8_t macro_id);
-bool dynamic_macro_header_correct(void);
diff --git a/users/drashna/keyrecords/keycodes.md b/users/drashna/keyrecords/keycodes.md
deleted file mode 100644
index bb5b65a77c..0000000000
--- a/users/drashna/keyrecords/keycodes.md
+++ /dev/null
@@ -1,13 +0,0 @@
-
-# Custom Keycodes
-
-Keycodes are defined in the `process_record.h` file and need to be included in the keymap.c files, so that they can be used there.
-
-A bunch of macros are present and are only included on boards that are not the Ergodox EZ or Orthodox, as they are not needed for those boards.
-
-* `DEFAULT_LAYER_1` ... `DEFAULT_LAYER_4` - This sets layer 0-3 as the default layer, and writes that to eeprom, and plays a chime.
-* `VRSN`, outputs the keyboard, keymap, commit and date info. Eg:
- * `handwired/tractyl_manuform/5x6_right/f411/drashna @ 0.15.9-162-g087d08, Built on: 2021-12-19-21:10:26`
-* `KC_DIABLO_CLEAR` - clears the diablo tapdance status.
-* `KC_CCCV` - Copy on hold, paste on tap.
-* `KEYLOCK` - This unloads the host driver, and prevents any data from being sent to the host. Hitting it again loads the driver, back.
diff --git a/users/drashna/keyrecords/process_records.c b/users/drashna/keyrecords/process_records.c
deleted file mode 100644
index d8d45dcac9..0000000000
--- a/users/drashna/keyrecords/process_records.c
+++ /dev/null
@@ -1,200 +0,0 @@
-// Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "drashna.h"
-#include "version.h"
-#ifdef OS_DETECTION_ENABLE
-# include "os_detection.h"
-#endif
-#ifdef CUSTOM_DYNAMIC_MACROS_ENABLE
-# include "keyrecords/dynamic_macros.h"
-#endif
-
-uint16_t copy_paste_timer;
-// Defines actions tor my global custom keycodes. Defined in drashna.h file
-// Then runs the _keymap's record handier if not processed here
-
-/**
- * @brief Keycode handler for keymaps
- *
- * This handles the keycodes at the keymap level, useful for keyboard specific customization
- */
-__attribute__((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
- return true;
-}
-__attribute__((weak)) bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
- return true;
-}
-
-/**
- * @brief Main user keycode handler
- *
- * This handles all of the keycodes for the user, including calling feature handlers.
- *
- * @param keycode Keycode from matrix
- * @param record keyrecord_t data structure
- * @return true Continue processing keycode and send to host
- * @return false Stop process keycode and do not send to host
- */
-bool process_record_user(uint16_t keycode, keyrecord_t *record) {
- // If console is enabled, it will print the matrix position and status of each key pressed
-#ifdef KEYLOGGER_ENABLE
- uprintf("KL: kc: 0x%04X, col: %2u, row: %2u, pressed: %1d, time: %5u, int: %1d, count: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed, record->event.time, record->tap.interrupted, record->tap.count);
-#endif // KEYLOGGER_ENABLE
-#if defined(OLED_ENABLE) && defined(CUSTOM_OLED_DRIVER)
- process_record_user_oled(keycode, record);
-#endif // OLED
-
- if (!(process_record_keymap(keycode, record) && process_record_secrets(keycode, record)
-#ifdef CUSTOM_RGB_MATRIX
- && process_record_user_rgb_matrix(keycode, record)
-#endif
-#ifdef CUSTOM_RGBLIGHT
- && process_record_user_rgb_light(keycode, record)
-#endif
-#ifdef CUSTOM_UNICODE_ENABLE
- && process_record_unicode(keycode, record)
-#endif
-#if defined(CUSTOM_POINTING_DEVICE)
- && process_record_pointing(keycode, record)
-#endif
-#ifdef CUSTOM_DYNAMIC_MACROS_ENABLE
- && process_record_dynamic_macro(keycode, record)
-#endif
- && true)) {
- return false;
- }
-
- switch (keycode) {
- case VRSN: // Prints firmware version
- if (record->event.pressed) {
- send_string_with_delay_P(PSTR(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE), TAP_CODE_DELAY);
- }
- break;
-
- case KC_DIABLO_CLEAR: // reset all Diablo timers, disabling them
-#ifdef TAP_DANCE_ENABLE
- if (record->event.pressed) {
- for (uint8_t index = 0; index < 4; index++) {
- diablo_timer[index].key_interval = 0;
- }
- }
-#endif // TAP_DANCE_ENABLE
- break;
-
- case KC_CCCV: // One key copy/paste
- if (record->event.pressed) {
- copy_paste_timer = timer_read();
- } else {
- if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy
- tap_code16(LCTL(KC_C));
- } else { // Tap, paste
- tap_code16(LCTL(KC_V));
- }
- }
- break;
- case KC_RGB_T: // This allows me to use underglow as layer indication, or as normal
-#if defined(CUSTOM_RGBLIGHT) || defined(CUSTOM_RGB_MATRIX)
- if (record->event.pressed) {
- userspace_config.rgb_layer_change ^= 1;
- dprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change);
- eeconfig_update_user_config(&userspace_config.raw);
- if (userspace_config.rgb_layer_change) {
-# if defined(CUSTOM_RGB_MATRIX)
- rgb_matrix_set_flags(LED_FLAG_UNDERGLOW | LED_FLAG_KEYLIGHT | LED_FLAG_INDICATOR);
-# if defined(CUSTOM_RGBLIGHT)
- rgblight_enable_noeeprom();
-# endif
-# endif
- layer_state_set(layer_state); // This is needed to immediately set the layer color (looks better)
-# if defined(CUSTOM_RGB_MATRIX)
- } else {
- rgb_matrix_set_flags(LED_FLAG_ALL);
-# if defined(CUSTOM_RGBLIGHT)
- rgblight_disable_noeeprom();
-# endif
-# endif
- }
- }
-#endif // CUSTOM_RGBLIGHT
- break;
-
-#if defined(CUSTOM_RGBLIGHT) || defined(CUSTOM_RGB_MATRIX)
- case RGB_TOG:
- // Split keyboards need to trigger on key-up for edge-case issue
-# ifndef SPLIT_KEYBOARD
- if (record->event.pressed) {
-# else
- if (!record->event.pressed) {
-# endif
-# if defined(CUSTOM_RGBLIGHT) && !defined(RGBLIGHT_DISABLE_KEYCODES)
- rgblight_toggle();
-# endif
-# if defined(CUSTOM_RGB_MATRIX) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
- rgb_matrix_toggle();
-# endif
- }
- return false;
- break;
- case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // quantum_keycodes.h L400 for definitions
- if (record->event.pressed) {
- bool is_eeprom_updated;
-# if defined(CUSTOM_RGBLIGHT) && !defined(RGBLIGHT_DISABLE_KEYCODES)
- // This disables layer indication, as it's assumed that if you're changing this ... you want that disabled
- if (userspace_config.rgb_layer_change) {
- userspace_config.rgb_layer_change = false;
- dprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change);
- is_eeprom_updated = true;
- }
-# endif
-# if defined(CUSTOM_RGB_MATRIX) && defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
- if (userspace_config.rgb_matrix_idle_anim) {
- userspace_config.rgb_matrix_idle_anim = false;
- dprintf("RGB Matrix Idle Animation [EEPROM]: %u\n", userspace_config.rgb_matrix_idle_anim);
- is_eeprom_updated = true;
- }
-# endif
- if (is_eeprom_updated) {
- eeconfig_update_user_config(&userspace_config.raw);
- }
- }
- break;
-#endif
- case KEYLOCK:
- if (record->event.pressed) {
- toggle_keyboard_lock();
- }
- break;
-#if defined(OS_DETECTION_ENABLE) && defined(OS_DETECTION_DEBUG_ENABLE)
- case STORE_SETUPS:
- if (record->event.pressed) {
- store_setups_in_eeprom();
- }
- return false;
- case PRINT_SETUPS:
- if (record->event.pressed) {
- print_stored_setups();
- }
- return false;
-#endif
- }
- return true;
-}
-
-__attribute__((weak)) void post_process_record_keymap(uint16_t keycode, keyrecord_t *record) {}
-void post_process_record_user(uint16_t keycode, keyrecord_t *record) {
-#if defined(OS_DETECTION_ENABLE) && defined(UNICODE_COMMON_ENABLE)
- switch (keycode) {
- case QK_MAGIC_SWAP_LCTL_LGUI:
- case QK_MAGIC_SWAP_RCTL_RGUI:
- case QK_MAGIC_SWAP_CTL_GUI:
- case QK_MAGIC_UNSWAP_LCTL_LGUI:
- case QK_MAGIC_UNSWAP_RCTL_RGUI:
- case QK_MAGIC_UNSWAP_CTL_GUI:
- case QK_MAGIC_TOGGLE_CTL_GUI:
- set_unicode_input_mode_soft(keymap_config.swap_lctl_lgui ? UNICODE_MODE_MACOS : UNICODE_MODE_WINCOMPOSE);
- break;
- }
-#endif
- post_process_record_keymap(keycode, record);
-}
diff --git a/users/drashna/keyrecords/process_records.h b/users/drashna/keyrecords/process_records.h
deleted file mode 100644
index 0137976580..0000000000
--- a/users/drashna/keyrecords/process_records.h
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-#include "drashna.h"
-
-enum userspace_custom_keycodes {
- VRSN = QK_USER, // Prints QMK Firmware and board info
- KC_DIABLO_CLEAR, // Clears all Diablo Timers
- KC_RGB_T, // Toggles RGB Layer Indication mode
- RGB_IDL, // RGB Idling animations
- KC_SECRET_1, // test1
- KC_SECRET_2, // test2
- KC_SECRET_3, // test3
- KC_SECRET_4, // test4
- KC_SECRET_5, // test5
- KC_CCCV, // Hold to copy, tap to paste
- KC_NUKE, // NUCLEAR LAUNCH DETECTED!!!
- UC_FLIP, // (ಠ痊ಠ)┻━┻
- UC_TABL, // ┬─┬ノ( º _ ºノ)
- UC_SHRG, // ¯\_(ツ)_/¯
- UC_DISA, // ಠ_ಠ
- UC_IRNY,
- UC_CLUE,
- KEYLOCK, // Locks keyboard by unmounting driver
- KC_NOMODE,
- KC_WIDE,
- KC_SCRIPT,
- KC_BLOCKS,
- KC_REGIONAL,
- KC_AUSSIE,
- KC_ZALGO,
- KC_SUPER,
- KC_COMIC,
- KC_ACCEL,
- OLED_LOCK,
- OLED_BRIGHTNESS_INC,
- OLED_BRIGHTNESS_DEC,
-
- STORE_SETUPS,
- PRINT_SETUPS,
-
- PD_JIGGLER,
-
- DYN_MACRO_PROG,
- DYN_MACRO_KEY00,
- DYN_MACRO_KEY01,
- DYN_MACRO_KEY02,
- DYN_MACRO_KEY03,
- DYN_MACRO_KEY04,
- DYN_MACRO_KEY05,
- DYN_MACRO_KEY06,
- DYN_MACRO_KEY07,
- DYN_MACRO_KEY08,
- DYN_MACRO_KEY09,
- DYN_MACRO_KEY10,
- DYN_MACRO_KEY11,
- DYN_MACRO_KEY12,
- DYN_MACRO_KEY13,
- DYN_MACRO_KEY14,
- DYN_MACRO_KEY15,
-
- USER_SAFE_RANGE,
-};
-
-bool process_record_secrets(uint16_t keycode, keyrecord_t *record);
-bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
-void post_process_record_keymap(uint16_t keycode, keyrecord_t *record);
-#ifdef CUSTOM_UNICODE_ENABLE
-bool process_record_unicode(uint16_t keycode, keyrecord_t *record);
-#endif
-
-#define LOWER MO(_LOWER)
-#define RAISE MO(_RAISE)
-#define ADJUST MO(_ADJUST)
-#define TG_MODS OS_TOGG
-#define TG_GAME TG(_GAMEPAD)
-#define TG_DBLO TG(_DIABLO)
-#define OS_LWR OSL(_LOWER)
-#define OS_RSE OSL(_RAISE)
-
-#define KC_SEC1 KC_SECRET_1
-#define KC_SEC2 KC_SECRET_2
-#define KC_SEC3 KC_SECRET_3
-#define KC_SEC4 KC_SECRET_4
-#define KC_SEC5 KC_SECRET_5
-
-#define KC_QWERTY DF(_QWERTY)
-#define KC_COLEMAK_DH DF(_COLEMAK_DH)
-#define KC_COLEMAK DF(_COLEMAK)
-#define KC_DVORAK DF(_DVORAK)
-
-#define QWERTY KC_QWERTY
-#define DVORAK KC_DVORAK
-#define COLEMAK KC_COLEMAK
-#define CLMKDH KC_COLEMAK_DH
-
-#ifdef SWAP_HANDS_ENABLE
-# define KC_C1R3 SH_T(KC_TAB)
-#elif defined(DRASHNA_LP)
-# define KC_C1R3 TG(_GAMEPAD)
-#else // SWAP_HANDS_ENABLE
-# define KC_C1R3 KC_TAB
-#endif // SWAP_HANDS_ENABLE
-
-#define BK_LWER LT(_LOWER, KC_BSPC)
-#define SP_LWER LT(_LOWER, KC_SPC)
-#define DL_RAIS LT(_RAISE, KC_DEL)
-#define ET_RAIS LT(_RAISE, KC_ENTER)
-
-/* OSM keycodes, to keep things clean and easy to change */
-#define KC_MLSF OSM(MOD_LSFT)
-#define KC_MRSF OSM(MOD_RSFT)
-
-#define OS_LGUI OSM(MOD_LGUI)
-#define OS_RGUI OSM(MOD_RGUI)
-#define OS_LSFT OSM(MOD_LSFT)
-#define OS_RSFT OSM(MOD_RSFT)
-#define OS_LCTL OSM(MOD_LCTL)
-#define OS_RCTL OSM(MOD_RCTL)
-#define OS_LALT OSM(MOD_LALT)
-#define OS_RALT OSM(MOD_RALT)
-#define OS_MEH OSM(MOD_MEH)
-#define OS_HYPR OSM(MOD_HYPR)
-
-#define ALT_APP ALT_T(KC_APP)
-
-#define MG_NKRO MAGIC_TOGGLE_NKRO
-
-#define AUTO_CTN QK_AUTOCORRECT_TOGGLE
-/*
-Custom Keycodes for Diablo 3 layer
-But since TD() doesn't work when tap dance is disabled
-We use custom codes here, so we can substitute the right stuff
-*/
-#ifdef TAP_DANCE_ENABLE
-# define KC_D3_1 TD(TD_D3_1)
-# define KC_D3_2 TD(TD_D3_2)
-# define KC_D3_3 TD(TD_D3_3)
-# define KC_D3_4 TD(TD_D3_4)
-#else // TAP_DANCE_ENABLE
-# define KC_D3_1 KC_1
-# define KC_D3_2 KC_2
-# define KC_D3_3 KC_3
-# define KC_D3_4 KC_4
-#endif // TAP_DANCE_ENABLE
-
-#define OL_LOCK OLED_LOCK
-#define OL_BINC OLED_BRIGHTNESS_INC
-#define OL_BDEC OLED_BRIGHTNESS_DEC
diff --git a/users/drashna/keyrecords/readme.md b/users/drashna/keyrecords/readme.md
deleted file mode 100644
index b89777db3d..0000000000
--- a/users/drashna/keyrecords/readme.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Keycode handling and interception
-
- * [Diablo Tap Dancing](tap_dance.md)
- * [Keymap Wrappers](wrappers.md)
- * [Secret Macros](secrets.md)
- * [Custom Keycodes](keycodes.md)
- * [Unicode Input](unicode.md)
diff --git a/users/drashna/keyrecords/secrets.md b/users/drashna/keyrecords/secrets.md
deleted file mode 100644
index 3c40fa41b3..0000000000
--- a/users/drashna/keyrecords/secrets.md
+++ /dev/null
@@ -1,122 +0,0 @@
-# Secret Macros
-
-With help from gitter and Colinta, this adds the ability to add hidden macros from other users.
-
-First, I have several files that are hidden/excluded from Git/GitHub. These contain everything needed for the macros. To hide these files, open `.git/info/exclude` and add `secrets.c` and `secrets.h` to that file, below the comments.
-
-And this requires `KC_SECRET_1` through `KC_SECRET_5` to be added in your keycode enum (usually in your `<name>.h` file) the keycodes for the new macros.
-
-## Git Exclusion
-
-To prevent `git` from seeing, or committing the secret files, you can exclude them. What's the point of having secrets if they're posted on GitHub for everyone to see!?!
-
-You can do this with the `.git/info/exclude` file, so that it's only ignored locally. Unfortunately, that means it's not consistently handled on each system.
-
-However, if you create a `.gitignore` file in the same folder, you keep things consistent between every system that the code is checked out on.
-
-```c
-secrets.c
-secrets.h
-```
-
-## secrets.c
-
-Here is the magic. This handles including the "secrets", and adding the custom macros to send them.
-
-```c
-#include QMK_KEYBOARD_H
-
-#if (__has_include("secrets.h") && !defined(NO_SECRETS))
-#include "secrets.h"
-#else
-static const char * const secrets[] = {
- "test1",
- "test2",
- "test3",
- "test4",
- "test5"
-};
-#endif
-
-bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
- switch (keycode) {
- case KC_SECRET_1 ... KC_SECRET_5: // Secrets! Externally defined strings, not stored in repo
- if (record->event.pressed) {
- clear_mods();
- clear_oneshot_mods();
- send_string_with_delay(secrets[keycode - KC_SECRET_1], MACRO_TIMER);
- }
- return false;
- break;
- }
- return true;
-}
-```
-
-## secrets.h
-
-Now, for the actual secrets! The file needs to look like
-
-```c
-static const char * secrets[] = {
- "secret1",
- "secret2",
- "secret3",
- "secret4",
- "secret5"
-};
-```
-
-Replacing the strings with the codes that you need.
-
-## Process Record
-
-In whichever file you have your `process_record_*` function in, you will want to add this to the top:
-
-```c
-__attribute__ ((weak))
-bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
- return true;
-}
-```
-
-This is so that the function can be called here, and replaced in the `secrets.c` file, and so it won't error out if it doesn't exist.
-
-And then, in the `process_record_user` function, assuming you have `return process_record_keymap(keycode, record)` here, you'll want to replace the "final" return with the following. Otherwise, you want to replace the `return true;` with `return process_record_secrets(keycode, record);`
-
-```c
-bool process_record_user(uint16_t keycode, keyrecord_t *record) {
- // your existing macro code here.
- return process_record_keymap(keycode, record) && process_record_secrets(keycode, record);
-}
-```
-
-## rules.mk
-
-Here, you want your `/users/<name>/rules.mk` file to "detect" the existence of the `secrets.c` file, and only add it if the file exists.
-
-Additionally, to ensure that it's not added or processed in any way, it checks to see if `NO_SECRETS` is set. This way, if you run `qmk compile -kb keyboard -km name -e NO_SECRETS=yes`, it will remove the feature altogether.
-
-```make
-ifneq ($(strip $(NO_SECRETS)), yes)
- ifneq ("$(wildcard $(USER_PATH)/secrets.c)","")
- SRC += secrets.c
- endif
-endif
-```
-
-Alternately, if you want to make sure that you can disable the function without messing with the file, you need to add this to your `/users/<name>/rules.mk`, so that it catches the flag:
-
-```make
-ifneq ("$(wildcard $(USER_PATH)/secrets.c)","")
- SRC += secrets.c
-endif
-
-ifeq ($(strip $(NO_SECRETS)), yes)
- OPT_DEFS += -DNO_SECRETS
-endif
-```
-
-## Extras
-
-Additionally, because this file isn't present in the repo at all, you could add additional functionality that nobody else will see.
diff --git a/users/drashna/keyrecords/tap_dance.md b/users/drashna/keyrecords/tap_dance.md
deleted file mode 100644
index 9dff96640f..0000000000
--- a/users/drashna/keyrecords/tap_dance.md
+++ /dev/null
@@ -1,121 +0,0 @@
-# Diablo Tap Dances
-
-My [Tap Dance](tap_dances.c) file includes the tap dance declarations, and everything needed for them.
-
-To disable, add `CUSTOM_TAP_DANCE = no` to your `rules.mk`.
-
-This is used for making Diablo 3 much easier to plan, especially at high rift levels.
-
-This works by using Tap Dances. The taps don't actually "do anything". Instead, it sets up the interval for how often to send specific keypresses. As you can tell, this makes automating things very easy.
-
-For critics that think this is cheating, just search "[diablo 3 num lock auto cast](http://lmgtfy.com/?q=diablo+3+numlock+autocast)". This is just a simpler method, that doesn't require a numpad.
-
-
-## Custom Tap Dance Type
-The real fun here is that the tap dances use a custom defined Tap Dance type:
-
-```c
-#define ACTION_TAP_DANCE_DIABLO(index, keycode) { \
- .fn = { NULL, (void *)diablo_tapdance_master, NULL }, \
- .user_data = (void *)&((diable_keys_t) { index, keycode }), \
- }
-```
-This lets me set an index and keycode for the tap dance. This isn't the cool part yet, but this allows for the really cool stuff.
-
-The Index is needed because I don't know how to handle it otherwise.
-
-## The Actual Dances
-
-These are the custom defined dances that I'm using. It sets up everything for later, using the above custom dance type.
-
-```c
-//Tap Dance Definitions, sets the index and the keycode.
-tap_dance_action_t tap_dance_actions[] = {
- // tap once to disable, and more to enable timed micros
- [TD_D3_1] = ACTION_TAP_DANCE_DIABLO(0, KC_1),
- [TD_D3_2] = ACTION_TAP_DANCE_DIABLO(1, KC_2),
- [TD_D3_3] = ACTION_TAP_DANCE_DIABLO(2, KC_3),
- [TD_D3_4] = ACTION_TAP_DANCE_DIABLO(3, KC_4),
-};
-```
-
-## Custom Data Structures
-
-First, to get this all working, there are a couple of things that need to be set up. In a header file (or you could put it into the keymap), you need to create a couple of custom structures:
-
-```c
-typedef struct {
- uint16_t timer;
- uint8_t key_interval;
- uint8_t keycode;
-} diablo_timer_t;
-
-typedef struct {
- uint8_t index;
- uint8_t keycode;
-} diable_keys_t;
-```
-
-The first structure is for tracking each key that is being used. The second is to pass data from the Tap Dance action array to the actual function that we will need.
-
-
-## Custom Arrays
-
-To facilitate things, you will need a couple of arrays in your `c` file.
-
-```c
-//define diablo macro timer variables
-diablo_timer_t diablo_timer[4];
-
-// Set the default intervals. Always start with 0 so that it will disable on first hit.
-// Otherwise, you will need to hit a bunch of times, or hit the "clear" command
-uint8_t diablo_times[] = { 0, 1, 3, 5, 10, 30 };
-```
-
-The first one (`diablo_timer`) is what keeps track of the timer used for the keys, the interval that it uses, and the actual keycode. This makes managing it a lot easier.
-
-The second array is a list of predefined intervals, in seconds. You can add more here, or remove entries. It doesn't matter how long the array is, as this is computed automatically.
-
-## The Magic - Part 1: Master function
-
-The first part of the magic here is the `diablo_tapdance_master` function. The Tap Dance feature calls this function, directly, and passes some data to the function. Namely, it passes the array of the index and the keycode (`diablo_keys_t` from above). This sets the keycode and the interval for the specific index of `diabolo_timer` based on the number of taps. If you hit it more than the number of items in the array, then it zeroes out the interval, disabling it.
-
-```c
-// Cycle through the times for the macro, starting at 0, for disabled.
-void diablo_tapdance_master(tap_dance_state_t *state, void *user_data) {
- diable_keys_t *diablo_keys = (diable_keys_t *)user_data;
- // Sets the keycode based on the index
- diablo_timer[diablo_keys->index].keycode = diablo_keys->keycode;
-
- // if the tapdance is hit more than the number of elemints in the array, reset
- if (state->count >= ARRAY_SIZE(diablo_times) ) {
- diablo_timer[diablo_keys->index].key_interval = 0;
- reset_tap_dance(state);
- } else { // else set the interval (tapdance count starts at 1, array starts at 0, so offset by one)
- diablo_timer[diablo_keys->index].key_interval = diablo_times[state->count - 1];
- }
-}
-```
-
-## The Magic - Part 2: The Coup de Grace
-
-The real core here is the `run_diablo_macro_check()` function. You need to call this from `matrix_scan_user`, as this handles the timer check.
-
-Specifically, it runs a check for each index of the timer. It checks to see if it's enabled, and if enough time has passed. If enough time has passed, it resets the timer, and will tap the keycode that you set for that index, but only if the Diablo layer is enabled.
-
-```c
-// Checks each of the 4 timers/keys to see if enough time has elapsed
-void run_diablo_macro_check(void) {
- for (uint8_t index = 0; index < NUM_OF_DIABLO_KEYS; index++) {
- // if key_interval is 0, it's disabled, so only run if it's set. If it's set, check the timer.
- if ( diablo_timer[index].key_interval && timer_elapsed( diablo_timer[index].timer ) > ( diablo_timer[index].key_interval * 1000 ) ) {
- // reset the timer, since enough time has passed
- diablo_timer[index].timer = timer_read();
- // send keycode ONLY if we're on the diablo layer.
- if (IS_LAYER_ON(_DIABLO)) {
- tap_code(diablo_timer[index].keycode);
- }
- }
- }
-}
-```
diff --git a/users/drashna/keyrecords/tap_dances.c b/users/drashna/keyrecords/tap_dances.c
deleted file mode 100644
index 87739c2a18..0000000000
--- a/users/drashna/keyrecords/tap_dances.c
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "tap_dances.h"
-
-#define NUM_OF_DIABLO_KEYS 4
-// define diablo macro timer variables
-diablo_timer_t diablo_timer[NUM_OF_DIABLO_KEYS];
-
-// Set the default intervals. Always start with 0 so that it will disable on first hit.
-// Otherwise, you will need to hit a bunch of times, or hit the "clear" command
-uint8_t diablo_times[] = {0, 1, 3, 5, 10, 30};
-
-/**
- * @brief Main function for handling diable related tap dances.
- *
- * @param state Main data struction contining information about events
- * @param user_data Local data for the dance. Allows customization to be passed on to function
- */
-void diablo_tapdance_master(tap_dance_state_t *state, void *user_data) {
- diable_keys_t *diablo_keys = (diable_keys_t *)user_data;
- // Sets the keycode based on the index
- diablo_timer[diablo_keys->index].keycode = diablo_keys->keycode;
-
- // if the tapdance is hit more than the number of elemints in the array, reset
- if (state->count >= ARRAY_SIZE(diablo_times)) {
- diablo_timer[diablo_keys->index].key_interval = 0;
- reset_tap_dance(state);
- } else { // else set the interval (tapdance count starts at 1, array starts at 0, so offset by one)
- diablo_timer[diablo_keys->index].key_interval = diablo_times[state->count - 1];
- }
-}
-
-// clang-format off
-// One function to rule them all!! Where the Magic Sauce lies
-#define ACTION_TAP_DANCE_DIABLO(index, keycode) { \
- .fn = { NULL, (void *)diablo_tapdance_master, NULL }, \
- .user_data = (void *)&((diable_keys_t) { index, keycode }), \
- }
-// clang-format on
-
-// Tap Dance Definitions, sets the index and the keycode.
-tap_dance_action_t tap_dance_actions[] = {
- // tap once to disable, and more to enable timed micros
- [TD_D3_1] = ACTION_TAP_DANCE_DIABLO(0, KC_1),
- [TD_D3_2] = ACTION_TAP_DANCE_DIABLO(1, KC_2),
- [TD_D3_3] = ACTION_TAP_DANCE_DIABLO(2, KC_3),
- [TD_D3_4] = ACTION_TAP_DANCE_DIABLO(3, KC_4),
-};
-
-/**
- * @brief Runs check to see if timer has elapsed for each dance, and sends keycodes, if it has.
- *
- */
-void run_diablo_macro_check(void) {
- for (uint8_t index = 0; index < NUM_OF_DIABLO_KEYS; index++) {
- // if key_interval is 0, it's disabled, so only run if it's set. If it's set, check the timer.
- if (diablo_timer[index].key_interval && timer_elapsed(diablo_timer[index].timer) > (diablo_timer[index].key_interval * 1000)) {
- // reset the timer, since enough time has passed
- diablo_timer[index].timer = timer_read();
- // send keycode ONLY if we're on the diablo layer.
- if (IS_LAYER_ON(_DIABLO)) {
- tap_code(diablo_timer[index].keycode);
- }
- }
- }
-}
diff --git a/users/drashna/keyrecords/tap_dances.h b/users/drashna/keyrecords/tap_dances.h
deleted file mode 100644
index 81d1f07fe0..0000000000
--- a/users/drashna/keyrecords/tap_dances.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-#include "drashna.h"
-
-// define diablo macro timer variables
-extern uint8_t diablo_times[];
-typedef struct {
- uint16_t timer;
- uint8_t key_interval;
- uint8_t keycode;
-} diablo_timer_t;
-
-typedef struct {
- uint8_t index;
- uint8_t keycode;
-} diable_keys_t;
-
-extern diablo_timer_t diablo_timer[];
-
-void run_diablo_macro_check(void);
-
-#ifdef TAP_DANCE_ENABLE
-enum {
- TD_D3_1 = 0,
- TD_D3_2,
- TD_D3_3,
- TD_D3_4,
-};
-#endif // TAP_DANCE_ENABLE
diff --git a/users/drashna/keyrecords/tapping.c b/users/drashna/keyrecords/tapping.c
deleted file mode 100644
index d4a0e16112..0000000000
--- a/users/drashna/keyrecords/tapping.c
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2021 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "drashna.h"
-
-#ifdef TAPPING_TERM_PER_KEY
-__attribute__((weak)) uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
-
- switch (keycode) {
- case BK_LWER:
- return TAPPING_TERM + 25;
- case QK_MOD_TAP ... QK_MOD_TAP_MAX:
- if (QK_MOD_TAP_GET_MODS(keycode) & MOD_LGUI) {
- return 300;
- }
- default:
- return TAPPING_TERM;
- }
-}
-#endif // TAPPING_TERM_PER_KEY
-
-#ifdef PERMISSIVE_HOLD_PER_KEY
-__attribute__((weak)) bool get_permissive_hold(uint16_t keycode, keyrecord_t *record) {
- // Immediately select the hold action when another key is tapped:
- // return true;
- // Do not select the hold action when another key is tapped.
- // return false;
- switch (keycode) {
- default:
- return false;
- }
-}
-#endif // PERMISSIVE_HOLD_PER_KEY
-
-#ifdef HOLD_ON_OTHER_KEY_PRESS_PER_KEY
-__attribute__((weak)) bool get_hold_on_other_key_press(uint16_t keycode, keyrecord_t *record) {
- // Immediately select the hold action when another key is pressed.
- // return true;
- // Do not select the hold action when another key is pressed.
- // return false;
- switch (keycode) {
-// case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:
-// return true;
- default:
- return false;
- }
-}
-#endif // HOLD_ON_OTHER_KEY_PRESS_PER_KEY
-
-#ifdef QUICK_TAP_TERM_PER_KEY
-__attribute__((weak)) uint16_t get_quick_tap_term(uint16_t keycode, keyrecord_t *record) {
- switch (keycode) {
- default:
- return QUICK_TAP_TERM;
- }
-}
-#endif // QUICK_TAP_TERM_PER_KEY
-
-#ifdef RETRO_TAPPING_PER_KEY
-__attribute__((weak)) bool get_retro_tapping(uint16_t keycode, keyrecord_t *record) {
- switch (keycode) {
- default:
- return false;
- }
-}
-#endif // RETRO_TAPPING_PER_KEY
diff --git a/users/drashna/keyrecords/unicode.c b/users/drashna/keyrecords/unicode.c
deleted file mode 100644
index a4687d3e59..0000000000
--- a/users/drashna/keyrecords/unicode.c
+++ /dev/null
@@ -1,446 +0,0 @@
-// Copyright 2020 @ridingqwerty
-// Copyright 2020 @tzarc
-// Copyright 2021 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "drashna.h"
-#include "unicode.h"
-#include "process_unicode_common.h"
-
-uint8_t unicode_typing_mode = UCTM_NO_MODE;
-const char unicode_mode_str[UNCODES_MODE_END][13] PROGMEM = {
- " Normal\0",
- " Wide\0",
- " Script\0",
- " Blocks\0",
- " Regional\0",
- " Aussie\0",
- " Zalgo\0",
- "Super Script\0",
- " Comic\0",
-};
-
-/**
- * @brief Registers the unicode keystrokes based on desired unicode
- *
- * @param glyph Unicode character, supports up to 0x1FFFF (or higher)
- */
-void tap_unicode_glyph_nomods(uint32_t glyph) {
- uint8_t temp_mod = get_mods();
- clear_mods();
- clear_oneshot_mods();
- register_unicode(glyph);
- set_mods(temp_mod);
-}
-
-typedef uint32_t (*translator_function_t)(bool is_shifted, uint32_t keycode);
-
-#define DEFINE_UNICODE_RANGE_TRANSLATOR(translator_name, lower_alpha, upper_alpha, zero_glyph, number_one, space_glyph) \
- static inline uint32_t translator_name(bool is_shifted, uint32_t keycode) { \
- switch (keycode) { \
- case KC_A ... KC_Z: \
- return (is_shifted ? upper_alpha : lower_alpha) + keycode - KC_A; \
- case KC_0: \
- return zero_glyph; \
- case KC_1 ... KC_9: \
- return (number_one + keycode - KC_1); \
- case KC_SPACE: \
- return space_glyph; \
- } \
- return keycode; \
- }
-
-#define DEFINE_UNICODE_LUT_TRANSLATOR(translator_name, ...) \
- static inline uint32_t translator_name(bool is_shifted, uint32_t keycode) { \
- static const uint32_t translation[] = {__VA_ARGS__}; \
- uint32_t ret = keycode; \
- if ((keycode - KC_A) < ARRAY_SIZE(translation)) { \
- ret = translation[keycode - KC_A]; \
- } \
- return ret; \
- }
-
-/**
- * @brief Handler function for outputting unicode.
- *
- * @param keycode Keycode from matrix.
- * @param record keyrecord_t data structure
- * @param translator translator lut for different unicode modes
- * @return true Continue processing matrix press, and send to host
- * @return false Replace keycode, and do not send to host
- */
-bool process_record_glyph_replacement(uint16_t keycode, keyrecord_t *record, translator_function_t translator) {
- uint8_t temp_mod = get_mods();
- uint8_t temp_osm = get_oneshot_mods();
- bool is_shifted = (temp_mod | temp_osm) & MOD_MASK_SHIFT;
- if (((temp_mod | temp_osm) & (MOD_MASK_CTRL | MOD_MASK_ALT | MOD_MASK_GUI)) == 0) {
- if (KC_A <= keycode && keycode <= KC_Z) {
- if (record->event.pressed) {
- tap_unicode_glyph_nomods(translator(is_shifted, keycode));
- }
- return false;
- } else if (KC_1 <= keycode && keycode <= KC_0) {
- if (is_shifted) { // skip shifted numbers, so that we can still use symbols etc.
- return process_record_keymap(keycode, record);
- }
- if (record->event.pressed) {
- register_unicode(translator(is_shifted, keycode));
- }
- return false;
- } else if (keycode == KC_SPACE) {
- if (record->event.pressed) {
- register_unicode(translator(is_shifted, keycode));
- }
- return false;
- }
- }
- return true;
-}
-
-DEFINE_UNICODE_RANGE_TRANSLATOR(unicode_range_translator_wide, 0xFF41, 0xFF21, 0xFF10, 0xFF11, 0x2003);
-DEFINE_UNICODE_RANGE_TRANSLATOR(unicode_range_translator_script, 0x1D4EA, 0x1D4D0, 0x1D7CE, 0x1D7C1, 0x2002);
-DEFINE_UNICODE_RANGE_TRANSLATOR(unicode_range_translator_boxes, 0x1F170, 0x1F170, '0', '1', 0x2002);
-DEFINE_UNICODE_RANGE_TRANSLATOR(unicode_range_translator_regional, 0x1F1E6, 0x1F1E6, '0', '1', 0x2003);
-
-// DEFINE_UNICODE_LUT_TRANSLATOR(unicode_lut_translator_normal,
-// 'a', // a
-// 'b', // b
-// 'c', // c
-// 'd', // d
-// 'e', // e
-// 'f', // f
-// 'g', // g
-// 'h', // h
-// 'i', // i
-// 'j', // j
-// 'k', // k
-// 'l', // l
-// 'm', // m
-// 'n', // n
-// 'o', // o
-// 'p', // p
-// 'q', // q
-// 'r', // r
-// 's', // s
-// 't', // t
-// 'u', // u
-// 'v', // v
-// 'w', // w
-// 'x', // x
-// 'y', // y
-// 'z', // z
-// '1', // 1
-// '2', // 2
-// '3', // 3
-// '4', // 4
-// '5', // 5
-// '6', // 6
-// '7', // 7
-// '8', // 8
-// '9', // 9
-// '0' // 0
-// );
-
-DEFINE_UNICODE_LUT_TRANSLATOR(unicode_lut_translator_aussie,
- 0x0250, // a
- 'q', // b
- 0x0254, // c
- 'p', // d
- 0x01DD, // e
- 0x025F, // f
- 0x0183, // g
- 0x0265, // h
- 0x1D09, // i
- 0x027E, // j
- 0x029E, // k
- 'l', // l
- 0x026F, // m
- 'u', // n
- 'o', // o
- 'd', // p
- 'b', // q
- 0x0279, // r
- 's', // s
- 0x0287, // t
- 'n', // u
- 0x028C, // v
- 0x028D, // w
- 0x2717, // x
- 0x028E, // y
- 'z', // z
- 0x0269, // 1
- 0x3139, // 2
- 0x0190, // 3
- 0x3123, // 4
- 0x03DB, // 5
- '9', // 6
- 0x3125, // 7
- '8', // 8
- '6', // 9
- '0' // 0
-);
-
-DEFINE_UNICODE_LUT_TRANSLATOR(unicode_lut_translator_super,
- 0x1D43, // a
- 0x1D47, // b
- 0x1D9C, // c
- 0x1D48, // d
- 0x1D49, // e
- 0x1DA0, // f
- 0x1D4D, // g
- 0x02B0, // h
- 0x2071, // i
- 0x02B2, // j
- 0x1D4F, // k
- 0x02E1, // l
- 0x1D50, // m
- 0x207F, // n
- 0x1D52, // o
- 0x1D56, // p
- 0x06F9, // q
- 0x02B3, // r
- 0x02E2, // s
- 0x1D57, // t
- 0x1D58, // u
- 0x1D5B, // v
- 0x02B7, // w
- 0x02E3, // x
- 0x02B8, // y
- 0x1DBB, // z
- 0x00B9, // 1
- 0x00B2, // 2
- 0x00B3, // 3
- 0x2074, // 4
- 0x2075, // 5
- 0x2076, // 6
- 0x2077, // 7
- 0x2078, // 8
- 0x2079, // 9
- 0x2070 // 0
-);
-
-DEFINE_UNICODE_LUT_TRANSLATOR(unicode_lut_translator_comic,
- 0x212B, // a
- 0x212C, // b
- 0x2102, // c
- 0x2145, // d
- 0x2107, // e
- 0x2132, // f
- 0x2141, // g
- 0x210D, // h
- 0x2148, // i
- 0x2111, // j
- 'k', // k
- 0x2143, // l
- 'm', // m
- 0x2115, // n
- 0x2134, // o
- 0x2119, // p
- 0x211A, // q
- 0x211B, // r
- 0x20B7, // s
- 0x20B8, // t
- 0x2127, // u
- 'v', // v
- 0x20A9, // w
- 'x', // x
- 0x213D, // y
- 'z', // z
- '1', // 1
- '2', // 2
- '3', // 3
- '4', // 4
- '5', // 5
- '6', // 6
- '7', // 7
- '8', // 8
- '9', // 9
- '0' // 0
-);
-
-bool process_record_aussie(uint16_t keycode, keyrecord_t *record) {
- bool is_shifted = (get_mods() | get_oneshot_mods()) & MOD_MASK_SHIFT;
- if ((KC_A <= keycode) && (keycode <= KC_0)) {
- if (record->event.pressed) {
- if (!process_record_glyph_replacement(keycode, record, unicode_lut_translator_aussie)) {
- tap_code16_nomods(KC_LEFT);
- return false;
- }
- }
- } else if (record->event.pressed && keycode == KC_SPACE) {
- tap_code16_nomods(KC_SPACE);
- tap_code16_nomods(KC_LEFT);
- return false;
- } else if (record->event.pressed && keycode == KC_ENTER) {
- tap_code16_nomods(KC_END);
- tap_code16_nomods(KC_ENTER);
- return false;
- } else if (record->event.pressed && keycode == KC_HOME) {
- tap_code16_nomods(KC_END);
- return false;
- } else if (record->event.pressed && keycode == KC_END) {
- tap_code16_nomods(KC_HOME);
- return false;
- } else if (record->event.pressed && keycode == KC_BSPC) {
- tap_code16_nomods(KC_DEL);
- return false;
- } else if (record->event.pressed && keycode == KC_DEL) {
- tap_code16_nomods(KC_BSPC);
- return false;
- } else if (record->event.pressed && keycode == KC_QUOT) {
- tap_unicode_glyph_nomods(is_shifted ? 0x201E : 0x201A);
- tap_code16_nomods(KC_LEFT);
- return false;
- } else if (record->event.pressed && keycode == KC_COMMA) {
- tap_unicode_glyph_nomods(is_shifted ? '<' : 0x2018);
- tap_code16_nomods(KC_LEFT);
- return false;
- } else if (record->event.pressed && keycode == KC_DOT) {
- tap_unicode_glyph_nomods(is_shifted ? '>' : 0x02D9);
- tap_code16_nomods(KC_LEFT);
- return false;
- } else if (record->event.pressed && keycode == KC_SLASH) {
- tap_unicode_glyph_nomods(is_shifted ? 0x00BF : '/');
- tap_code16_nomods(KC_LEFT);
- return false;
- }
- return true;
-}
-
-bool process_record_zalgo(uint16_t keycode, keyrecord_t *record) {
- if ((KC_A <= keycode) && (keycode <= KC_0)) {
- if (record->event.pressed) {
- tap_code16_nomods(keycode);
-
- int number = (rand() % (8 + 1 - 2)) + 2;
- for (int index = 0; index < number; index++) {
- uint16_t hex = (rand() % (0x036F + 1 - 0x0300)) + 0x0300;
- register_unicode(hex);
- }
-
- return false;
- }
- }
- return true;
-}
-
-/**
- * @brief Main handler for unicode input
- *
- * @param keycode Keycode from switch matrix
- * @param record keyrecord_t data struture
- * @return true Send keycode from matrix to host
- * @return false Stop processing and do not send to host
- */
-
-bool process_record_unicode(uint16_t keycode, keyrecord_t *record) {
- switch (keycode) {
- case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻
- if (record->event.pressed) {
- send_unicode_string("(ノಠ痊ಠ)ノ彡┻━┻");
- }
- break;
-
- case UC_TABL: // ┬─┬ノ( º _ ºノ)
- if (record->event.pressed) {
- send_unicode_string("┬─┬ノ( º _ ºノ)");
- }
- break;
-
- case UC_SHRG: // ¯\_(ツ)_/¯
- if (record->event.pressed) {
- send_unicode_string("¯\\_(ツ)_/¯");
- }
- break;
-
- case UC_DISA: // ಠ_ಠ
- if (record->event.pressed) {
- send_unicode_string("ಠ_ಠ");
- }
- break;
-
- case UC_IRNY: // ⸮
- if (record->event.pressed) {
- register_unicode(0x2E2E);
- }
- break;
- case UC_CLUE: // ‽
- if (record->event.pressed) {
- register_unicode(0x203D);
- }
- break;
- case KC_NOMODE ... KC_COMIC:
- if (record->event.pressed) {
- if (unicode_typing_mode != keycode - KC_NOMODE) {
- unicode_typing_mode = keycode - KC_NOMODE;
- } else {
- unicode_typing_mode = UCTM_NO_MODE;
- }
- }
- break;
- }
-
- if (((get_mods() | get_oneshot_mods()) & ~MOD_MASK_SHIFT) != 0) {
- return true;
- }
-
- if (IS_QK_MOD_TAP(keycode) && record->tap.count) {
- keycode = QK_MOD_TAP_GET_TAP_KEYCODE(keycode);
- }
- if (IS_QK_LAYER_TAP(keycode) && record->tap.count) {
- keycode = QK_LAYER_TAP_GET_TAP_KEYCODE(keycode);
- }
-
- if (unicode_typing_mode == UCTM_WIDE) {
- if (((KC_A <= keycode) && (keycode <= KC_0)) || keycode == KC_SPACE) {
- return process_record_glyph_replacement(keycode, record, unicode_range_translator_wide);
- }
- } else if (unicode_typing_mode == UCTM_SCRIPT) {
- if (((KC_A <= keycode) && (keycode <= KC_0)) || keycode == KC_SPACE) {
- return process_record_glyph_replacement(keycode, record, unicode_range_translator_script);
- }
- } else if (unicode_typing_mode == UCTM_BLOCKS) {
- if (((KC_A <= keycode) && (keycode <= KC_0)) || keycode == KC_SPACE) {
- return process_record_glyph_replacement(keycode, record, unicode_range_translator_boxes);
- }
- } else if (unicode_typing_mode == UCTM_REGIONAL) {
- if (((KC_A <= keycode) && (keycode <= KC_0)) || keycode == KC_SPACE) {
- if (!process_record_glyph_replacement(keycode, record, unicode_range_translator_regional)) {
- wait_us(500);
- tap_unicode_glyph_nomods(0x200C);
- return false;
- }
- }
- } else if (unicode_typing_mode == UCTM_SUPER) {
- if (((KC_A <= keycode) && (keycode <= KC_0))) {
- return process_record_glyph_replacement(keycode, record, unicode_lut_translator_super);
- }
- } else if (unicode_typing_mode == UCTM_COMIC) {
- if (((KC_A <= keycode) && (keycode <= KC_0))) {
- return process_record_glyph_replacement(keycode, record, unicode_lut_translator_comic);
- }
- } else if (unicode_typing_mode == UCTM_AUSSIE) {
- return process_record_aussie(keycode, record);
- } else if (unicode_typing_mode == UCTM_ZALGO) {
- return process_record_zalgo(keycode, record);
- }
- return true;
-}
-
-/**
- * @brief Initialize the default unicode mode on firmware startup
- *
- */
-void keyboard_post_init_unicode(void) {
- unicode_input_mode_init();
-}
-
-/**
- * @brief Set the unicode input mode without extra functionality
- *
- * @param input_mode
- */
-void set_unicode_input_mode_soft(uint8_t input_mode) {
- unicode_config.input_mode = input_mode;
- unicode_input_mode_set_kb(input_mode);
-}
diff --git a/users/drashna/keyrecords/unicode.h b/users/drashna/keyrecords/unicode.h
deleted file mode 100644
index fe95e78c3a..0000000000
--- a/users/drashna/keyrecords/unicode.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-enum unicode_typing_modes {
- UCTM_NO_MODE,
- UCTM_WIDE,
- UCTM_SCRIPT,
- UCTM_BLOCKS,
- UCTM_REGIONAL,
- UCTM_AUSSIE,
- UCTM_ZALGO,
- UCTM_SUPER,
- UCTM_COMIC,
- UNCODES_MODE_END,
-};
-
-extern uint8_t unicode_typing_mode;
-extern const PROGMEM char unicode_mode_str[UNCODES_MODE_END][13];
-void set_unicode_input_mode_soft(uint8_t input_mode);
diff --git a/users/drashna/keyrecords/unicode.md b/users/drashna/keyrecords/unicode.md
deleted file mode 100644
index 1b3f696a82..0000000000
--- a/users/drashna/keyrecords/unicode.md
+++ /dev/null
@@ -1,27 +0,0 @@
-# Custom Unicode
-
-To disable, add `CUSTOM_UNICODE_ENABLE = no` to the keymap's `rules.mk`.
-
-This disables all of the various implementations of unicode, enables the common unicode core, and allows usage.
-
-In addition to a number of unicode keycodes:
-
-* `UC_FLIP` - `(ノಠ痊ಠ)ノ彡┻━┻`
-* `UC_TABL` - `┬─┬ノ( º _ ºノ)`
-* `UC_SHRG` - `¯\_(ツ)_/¯`
-* `UC_DISA` - `ಠ_ಠ`
-* `UC_IRNY` - `⸮`
-* `UC_CLUE` - `‽`
-
-There are a number of unicode typing modes. This replaces the normal alpha keys with special unicodes.
-
-* `KC_WIDE` - this is wide mode
-* `KC_SCRIPT` - 𝓽𝓱𝓲𝓼 𝓲𝓼 𝓼𝓬𝓻𝓲𝓹𝓽 𝓶𝓸𝓭𝓮
-* `KC_BLOCKS` - 🆃🅷🅸🆂 🅸🆂 🅱🅻🅾🅲🅺 🅼🅾🅳🅴
-* `KC_REGIONAL` - 🇹‌‌🇭‌‌🇮‌‌🇸‌‌ ‌‌🇮‌‌🇸‌‌ ‌‌🇷‌‌🇪‌‌🇬‌‌🇮‌‌🇴‌‌🇳‌‌🇦‌‌🇱‌‌ ‌‌🇲‌‌🇴‌‌🇩‌‌🇪‌‌
-* `KC_AUSSIE` - ǝpoɯ ǝᴉssnɐ sᴉ sᴉɥʇ
-* `KC_ZALGO` - t̨͕͙̺͍͐̾ĥ̻ï̳̻̗̜͔ͦs͎̠͈͓͗̀ i̶̫ͭ̆s̛̫̻̜̝͑͡ z̩͈̠͗a͚̜̓͜l͈̟g͋͢͝ò͚ͥ͘͡͞ ḿ̴̡̻̼̔ͪò͔̭̿ͪ̍ḏ̻̊̄̈e̳͕̤ͣͯ
-* `KC_NOMODE` - this is the normal typing mode with no unicode glyphs
-
-
-Credit goes to ridingqwerty and tzarc for the unicode typing modes.
diff --git a/users/drashna/keyrecords/wrappers.h b/users/drashna/keyrecords/wrappers.h
deleted file mode 100644
index b298ef0628..0000000000
--- a/users/drashna/keyrecords/wrappers.h
+++ /dev/null
@@ -1,266 +0,0 @@
-// Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
-// Copyright 2020 @jola5
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-#include "drashna.h"
-/*
-Since our quirky block definitions are basically a list of comma separated
-arguments, we need a wrapper in order for these definitions to be
-expanded before being used as arguments to the LAYOUT_xxx macro.
-*/
-
-/*
-Blocks for each of the four major keyboard layouts
-Organized so we can quickly adapt and modify all of them
-at once, rather than for each keyboard, one at a time.
-And this allows for much cleaner blocks in the keymaps.
-For instance Tap/Hold for Control on all of the layouts
-
-NOTE: These are all the same length. If you do a search/replace
- then you need to add/remove underscores to keep the
- lengths consistent.
-*/
-// clang-format off
-#define _________________QWERTY_L1_________________ KC_Q, KC_W, KC_E, KC_R, KC_T
-#define _________________QWERTY_L2_________________ KC_A, KC_S, KC_D, KC_F, KC_G
-#define _________________QWERTY_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B
-
-#define _________________QWERTY_R1_________________ KC_Y, KC_U, KC_I, KC_O, KC_P
-#define _________________QWERTY_R2_________________ KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT
-#define _________________QWERTY_R3_________________ KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH
-
-
-#define _________________COLEMAK_L1________________ KC_Q, KC_W, KC_F, KC_P, KC_G
-#define _________________COLEMAK_L2________________ KC_A, KC_R, KC_S, KC_T, KC_D
-#define _________________COLEMAK_L3________________ KC_Z, KC_X, KC_C, KC_V, KC_B
-
-#define _________________COLEMAK_R1________________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN
-#define _________________COLEMAK_R2________________ KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT
-#define _________________COLEMAK_R3________________ KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH
-
-#define ______________COLEMAK_MOD_DH_L1____________ KC_Q, KC_W, KC_F, KC_P, KC_B
-#define ______________COLEMAK_MOD_DH_L2____________ KC_A, KC_R, KC_S, KC_T, KC_G
-#define ______________COLEMAK_MOD_DH_L3____________ KC_Z, KC_X, KC_C, KC_D, KC_V
-
-#define ______________COLEMAK_MOD_DH_R1____________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN
-#define ______________COLEMAK_MOD_DH_R2____________ KC_M, KC_N, KC_E, KC_I, KC_O, KC_QUOT
-#define ______________COLEMAK_MOD_DH_R3____________ KC_K, KC_H, KC_COMM, KC_DOT, KC_SLASH
-
-
-#define _________________DVORAK_L1_________________ KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y
-#define _________________DVORAK_L2_________________ KC_A, KC_O, KC_E, KC_U, KC_I
-#define _________________DVORAK_L3_________________ KC_SCLN, KC_Q, KC_J, KC_K, KC_X
-
-#define _________________DVORAK_R1_________________ KC_F, KC_G, KC_C, KC_R, KC_L
-#define _________________DVORAK_R2_________________ KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH
-#define _________________DVORAK_R3_________________ KC_B, KC_M, KC_W, KC_V, KC_Z
-
-
-#define ________________DVORAK_AU_L1_______________ KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y
-#define ________________DVORAK_AU_L2_______________ KC_O, KC_A, KC_E, KC_I, KC_U
-#define ________________DVORAK_AU_L3_______________ KC_SCLN, KC_Q, KC_J, KC_K, KC_X
-
-#define ________________DVORAK_AU_R1_______________ KC_F, KC_G, KC_C, KC_R, KC_L
-#define ________________DVORAK_AU_R2_______________ KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH
-#define ________________DVORAK_AU_R3_______________ KC_B, KC_M, KC_W, KC_V, KC_Z
-
-#define _________________WORKMAN_L1________________ KC_Q, KC_D, KC_R, KC_W, KC_B
-#define _________________WORKMAN_L2________________ KC_A, KC_S, KC_H, KC_T, KC_G
-#define _________________WORKMAN_L3________________ KC_Z, KC_X, KC_M, KC_C, KC_V
-
-#define _________________WORKMAN_R1________________ KC_J, KC_F, KC_U, KC_P, KC_SCLN
-#define _________________WORKMAN_R2________________ KC_Y, KC_N, KC_E, KC_O, KC_I, KC_QUOT
-#define _________________WORKMAN_R3________________ KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH
-
-
-#define _________________NORMAN_L1_________________ KC_Q, KC_W, KC_D, KC_F, KC_K
-#define _________________NORMAN_L2_________________ KC_A, KC_S, KC_E, KC_T, KC_G
-#define _________________NORMAN_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B
-
-#define _________________NORMAN_R1_________________ KC_J, KC_U, KC_R, KC_L, KC_SCLN
-#define _________________NORMAN_R2_________________ KC_Y, KC_N, KC_I, KC_O, KC_U, KC_QUOT
-#define _________________NORMAN_R3_________________ KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH
-
-
-#define _________________MALTRON_L1________________ KC_Q, KC_P, KC_Y, KC_C, KC_B
-#define _________________MALTRON_L2________________ KC_A, KC_N, KC_I, KC_S, KC_F
-#define _________________MALTRON_L3________________ KC_SCLN, KC_SLSH, KC_J, KC_G, KC_COMM
-
-#define _________________MALTRON_R1________________ KC_V, KC_M, KC_U, KC_Z, KC_L
-#define _________________MALTRON_R2________________ KC_D, KC_T, KC_D, KC_O, KC_R, KC_QUOT
-#define _________________MALTRON_R3________________ KC_DOT, KC_W, KC_K, KC_MINS, KC_X
-
-
-#define _________________EUCALYN_L1________________ KC_Q, KC_W, KC_COMM, KC_DOT, KC_SCLN
-#define _________________EUCALYN_L2________________ KC_A, KC_O, KC_E, KC_I, KC_U
-#define _________________EUCALYN_L3________________ KC_Z, KC_X, KC_C, KC_V, KC_F
-
-#define _________________EUCALYN_R1________________ KC_M, KC_R, KC_D, KC_Y, KC_P
-#define _________________EUCALYN_R2________________ KC_G, KC_T, KC_K, KC_S, KC_N, KC_QUOT
-#define _________________EUCALYN_R3________________ KC_B, KC_H, KC_J, KC_L, KC_SLSH
-
-// Qwerty-like
-#define _____________CARPLAX_QFMLWY_L1_____________ KC_Q, KC_F, KC_M, KC_L, KC_W
-#define _____________CARPLAX_QFMLWY_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R
-#define _____________CARPLAX_QFMLWY_L3_____________ KC_Z, KC_V, KC_G, KC_C, KC_X
-
-#define _____________CARPLAX_QFMLWY_R1_____________ KC_Y, KC_U, KC_O, KC_B, KC_J
-#define _____________CARPLAX_QFMLWY_R2_____________ KC_I, KC_A, KC_E, KC_H, KC_SCLN, KC_QUOT
-#define _____________CARPLAX_QFMLWY_R3_____________ KC_P, KC_K, KC_COMM, KC_DOT, KC_SLSH
-
-// Colemak like
-#define _____________CARPLAX_QGMLWB_L1_____________ KC_Q, KC_G, KC_M, KC_L, KC_W
-#define _____________CARPLAX_QGMLWB_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R
-#define _____________CARPLAX_QGMLWB_L3_____________ KC_Z, KC_X, KC_C, KC_F, KC_J
-
-#define _____________CARPLAX_QGMLWB_R1_____________ KC_B, KC_Y, KC_U, KC_V, KC_SCLN
-#define _____________CARPLAX_QGMLWB_R2_____________ KC_I, KC_A, KC_E, KC_O, KC_H, KC_QUOT
-#define _____________CARPLAX_QGMLWB_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, KC_SLSH
-
-// colemak like, zxcv fixed
-#define _____________CARPLAX_QGMLWY_L1_____________ KC_Q, KC_G, KC_M, KC_L, KC_W
-#define _____________CARPLAX_QGMLWY_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R
-#define _____________CARPLAX_QGMLWY_L3_____________ KC_Z, KC_X, KC_C, KC_V, KC_J
-
-#define _____________CARPLAX_QGMLWY_R1_____________ KC_Y, KC_F, KC_U, KC_B, KC_SCLN
-#define _____________CARPLAX_QGMLWY_R2_____________ KC_I, KC_A, KC_E, KC_O, KC_H, KC_QUOT
-#define _____________CARPLAX_QGMLWY_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, KC_SLSH
-
-// teeheehee
-#define _____________CARPLAX_TNWCLR_L1_____________ KC_T, KC_N, KC_W, KC_C, KC_L
-#define _____________CARPLAX_TNWCLR_L2_____________ KC_S, KC_K, KC_J, KC_X, KC_G
-#define _____________CARPLAX_TNWCLR_L3_____________ KC_E, KC_O, KC_D, KC_I, KC_A
-
-#define _____________CARPLAX_TNWCLR_R1_____________ KC_R, KC_B, KC_F, KC_M, KC_H
-#define _____________CARPLAX_TNWCLR_R2_____________ KC_P, KC_Q, KC_Z, KC_V, KC_SCLN, KC_QUOT
-#define _____________CARPLAX_TNWCLR_R3_____________ KC_U, KC_Y, KC_COMM, KC_DOT, KC_SLSH
-
-
-#define _________________WHITE_R1__________________ KC_V, KC_Y, KC_D, KC_COMM, KC_QUOT
-#define _________________WHITE_R2__________________ KC_A, KC_T, KC_H, KC_E, KC_B
-#define _________________WHITE_R3__________________ KC_P, KC_K, KC_G, KC_W, KC_Q
-
-#define _________________WHITE_L1__________________ KC_INT1, KC_J, KC_M, KC_L, KC_U
-#define _________________WHITE_L2__________________ KC_MINS, KC_C, KC_S, KC_N, KC_O, KC_I
-#define _________________WHITE_L3__________________ KC_X, KC_R, KC_F, KC_DOT, KC_Z
-
-
-#define _________________HALMAK_L1_________________ KC_W, KC_L, KC_R, KC_B, KC_Z
-#define _________________HALMAK_L2_________________ KC_S, KC_H, KC_N, KC_T, KC_COMM
-#define _________________HALMAK_L3_________________ KC_F, KC_M, KC_V, KC_V, KC_SLASH
-
-#define _________________HALMAK_R1_________________ KC_SCLN, KC_Q, KC_U, KC_D, KC_J
-#define _________________HALMAK_R2_________________ KC_DOT, KC_A, KC_E, KC_O, KC_I, KC_QUOTE
-#define _________________HALMAK_R3_________________ KC_G, KC_P, KC_X, KC_K, KC_Y
-
-
-#define __________________ISRT_L1__________________ KC_W, KC_C, KC_L, KC_M, KC_K
-#define __________________ISRT_L2__________________ KC_I, KC_S, KC_R, KC_T, KC_G
-#define __________________ISRT_L3__________________ KC_Q, KC_V, KC_W, KC_D, KC_J
-
-#define __________________ISRT_R1__________________ KC_Z, KC_F, KC_U, KC_COMM, KC_QUOTE
-#define __________________ISRT_R2__________________ KC_P, KC_N, KC_E, KC_A, KC_O, KC_SCLN
-#define __________________ISRT_R3__________________ KC_B, KC_H, KC_SLSH, KC_DOT, KC_X
-
-
-#define __________________SOUL_L1__________________ KC_Q, KC_W, KC_L, KC_D, KC_P
-#define __________________SOUL_L2__________________ KC_A, KC_S, KC_R, KC_T, KC_G
-#define __________________SOUL_L3__________________ KC_Z, KC_X, KC_C, KC_V, KC_J
-
-#define __________________SOUL_R1__________________ KC_K, KC_M, KC_U, KC_Y, KC_SCLN
-#define __________________SOUL_R2__________________ KC_F, KC_N, KC_E, KC_I, KC_O, KC_QUOTE
-#define __________________SOUL_R3__________________ KC_B, KC_H, KC_COMM, KC_DOT, KC_SLSH
-
-
-#define __________________NIRO_L1__________________ KC_Q, KC_W, KC_U, KC_D, KC_P
-#define __________________NIRO_L2__________________ KC_A, KC_S, KC_E, KC_T, KC_G
-#define __________________NIRO_L3__________________ KC_Z, KC_X, KC_C, KC_V, KC_B
-
-#define __________________NIRO_R1__________________ KC_J, KC_F, KC_Y, KC_L, KC_SCLN
-#define __________________NIRO_R2__________________ KC_H, KC_N, KC_I, KC_R, KC_O, KC_QUOTE
-#define __________________NIRO_R3__________________ KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH
-
-
-#define _________________ASSET_L1__________________ KC_Q, KC_W, KC_J, KC_F, KC_G
-#define _________________ASSET_L2__________________ KC_A, KC_S, KC_E, KC_T, KC_D
-#define _________________ASSET_L3__________________ KC_Z, KC_X, KC_C, KC_V, KC_B
-
-#define _________________ASSET_R1__________________ KC_Y, KC_P, KC_U, KC_L, KC_SCLN
-#define _________________ASSET_R2__________________ KC_H, KC_N, KC_I, KC_O, KC_R, KC_QUOTE
-#define _________________ASSET_R3__________________ KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH
-
-
-#define _________________MTGAP_L1__________________ KC_Y, KC_P, KC_O, KC_U, KC_J
-#define _________________MTGAP_L2__________________ KC_I, KC_N, KC_E, KC_A, KC_COMM
-#define _________________MTGAP_L3__________________ KC_Q, KC_Z, KC_SLSH, KC_DOT, KC_SCLN
-
-#define _________________MTGAP_R1__________________ KC_K, KC_D, KC_L, KC_C, KC_W
-#define _________________MTGAP_R2__________________ KC_M, KC_H, KC_T, KC_S, KC_R, KC_QUOTE
-#define _________________MTGAP_R3__________________ KC_B, KC_F, KC_G, KC_V, KC_X
-
-
-#define _________________MINIMAK_L1________________ KC_Q, KC_W, KC_D, KC_R, KC_K
-#define _________________MINIMAK_L2________________ KC_A, KC_S, KC_T, KC_F, KC_G
-#define _________________MINIMAK_L3________________ KC_Z, KC_X, KC_C, KC_V, KC_B
-
-#define _________________MINIMAK_R1________________ KC_Y, KC_U, KC_I, KC_O, KC_P
-#define _________________MINIMAK_R2________________ KC_H, KC_J, KC_E, KC_L, KC_SCLN, KC_QUOT
-#define _________________MINIMAK_R3________________ KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH
-
-
-#define ________________MINIMAK_8_L1_______________ KC_Q, KC_W, KC_D, KC_R, KC_K
-#define ________________MINIMAK_8_L2_______________ KC_A, KC_S, KC_T, KC_F, KC_G
-#define ________________MINIMAK_8_L3_______________ KC_Z, KC_X, KC_C, KC_V, KC_B
-
-#define ________________MINIMAK_8_R1_______________ KC_Y, KC_U, KC_I, KC_L, KC_P
-#define ________________MINIMAK_8_R2_______________ KC_H, KC_N, KC_E, KC_O, KC_SCLN, KC_QUOT
-#define ________________MINIMAK_8_R3_______________ KC_J, KC_M, KC_COMM, KC_DOT, KC_SLSH
-
-
-#define _______________MINIMAK_12_L1_______________ KC_Q, KC_W, KC_D, KC_F, KC_K
-#define _______________MINIMAK_12_L2_______________ KC_A, KC_S, KC_T, KC_R, KC_G
-#define _______________MINIMAK_12_L3_______________ KC_Z, KC_X, KC_C, KC_V, KC_B
-
-#define _______________MINIMAK_12_R1_______________ KC_Y, KC_U, KC_I, KC_L, KC_SCLN
-#define _______________MINIMAK_12_R2_______________ KC_H, KC_N, KC_E, KC_O, KC_P, KC_QUOT
-#define _______________MINIMAK_12_R3_______________ KC_J, KC_M, KC_COMM, KC_DOT, KC_SLSH
-
-
-#define ________________NUMBER_LEFT________________ KC_1, KC_2, KC_3, KC_4, KC_5
-#define ________________NUMBER_RIGHT_______________ KC_6, KC_7, KC_8, KC_9, KC_0
-#define _________________FUNC_LEFT_________________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5
-#define _________________FUNC_RIGHT________________ KC_F6, KC_F7, KC_F8, KC_F9, KC_F10
-
-#define ___________________BLANK___________________ _______, _______, _______, _______, _______
-
-
-#define _________________LOWER_L1__________________ KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC
-#define _________________LOWER_L2__________________ _________________FUNC_LEFT_________________
-#define _________________LOWER_L3__________________ _________________FUNC_RIGHT________________
-
-#define _________________LOWER_R1__________________ KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN
-#define _________________LOWER_R2__________________ _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR
-#define _________________LOWER_R3__________________ _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END
-
-
-
-#define _________________RAISE_L1__________________ ________________NUMBER_LEFT________________
-#define _________________RAISE_L2__________________ ___________________BLANK___________________
-#define _________________RAISE_L3__________________ ___________________BLANK___________________
-
-#define _________________RAISE_R1__________________ ________________NUMBER_RIGHT_______________
-#define _________________RAISE_R2__________________ _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC
-#define _________________RAISE_R3__________________ _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
-
-
-
-#define _________________ADJUST_L1_________________ RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_TOG
-#define _________________ADJUST_L2_________________ MU_TOGG, CK_TOGG, AU_ON, AU_OFF, CG_NORM
-#define _________________ADJUST_L3_________________ RGB_RMOD,RGB_HUD,RGB_SAD, RGB_VAD, KC_RGB_T
-
-#define _________________ADJUST_R1_________________ KC_SEC1, KC_SEC2, KC_SEC3, KC_SEC4, KC_SEC5
-#define _________________ADJUST_R2_________________ CG_SWAP, QWERTY, CLMKDH, COLEMAK, DVORAK
-#define _________________ADJUST_R3_________________ MG_NKRO, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT
-
-// clang-format on
diff --git a/users/drashna/keyrecords/wrappers.md b/users/drashna/keyrecords/wrappers.md
deleted file mode 100644
index fd62ff1609..0000000000
--- a/users/drashna/keyrecords/wrappers.md
+++ /dev/null
@@ -1,11 +0,0 @@
-## Keyboard Layout Templates
-
-This borrows from @jola5's "Not quite neo" code. This allows me to maintain blocks of keymaps in the userspace, so that I can modify the userspace, and this is reflected in all of the keyboards that use it, at once.
-
-This makes adding tap/hold mods, or other special keycodes or functions to all keyboards super easy, as it's done to all of them at once.
-
-The caveat here is that the keymap needs a processor/wrapper, as it doesn't like the substitutions. However, this is as simple as just pushing it through a define. For instance:
-
-`#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__)`
-
-Once that's been done and you've switched the keymaps to use the "wrapper", it will read the substitution blocks just fine.