summaryrefslogtreecommitdiff
path: root/users
diff options
context:
space:
mode:
Diffstat (limited to 'users')
-rw-r--r--users/bcat/bcat.c6
-rw-r--r--users/bcat/config.h85
-rw-r--r--users/bcat/rules.mk16
-rw-r--r--users/drashna/.gitlab-ci.yml2
-rw-r--r--users/drashna/config.h139
-rw-r--r--users/drashna/drashna.c198
-rw-r--r--users/drashna/drashna.h79
-rw-r--r--users/drashna/font_gmk_bad.h241
-rw-r--r--users/drashna/hue_manitee_font.h241
-rw-r--r--users/drashna/process_records.c220
-rw-r--r--users/drashna/process_records.h75
-rw-r--r--users/drashna/readme.md192
-rw-r--r--users/drashna/readme_handlers.md97
-rw-r--r--users/drashna/readme_keycodes.md10
-rw-r--r--users/drashna/readme_rgb.md43
-rw-r--r--users/drashna/readme_secrets.md123
-rw-r--r--users/drashna/readme_tap_dance.md119
-rw-r--r--users/drashna/readme_wrappers.md11
-rw-r--r--users/drashna/rgb_stuff.c427
-rw-r--r--users/drashna/rgb_stuff.h29
-rw-r--r--users/drashna/rgblight_breathe_table.h8
-rw-r--r--users/drashna/rules.mk27
-rw-r--r--users/drashna/send_unicode.h71
-rw-r--r--users/drashna/tap_dances.c77
-rw-r--r--users/drashna/tap_dances.h16
-rw-r--r--users/drashna/template.c130
-rw-r--r--users/drashna/template.h15
-rw-r--r--users/drashna/wrappers.h18
-rw-r--r--users/dshields/config.h57
-rw-r--r--users/dshields/dshields.c26
-rw-r--r--users/dshields/dshields.h42
-rw-r--r--users/dshields/rules.mk32
-rw-r--r--users/gary/gary.c1
-rw-r--r--users/gary/gary.h43
-rw-r--r--users/gary/readme.md14
-rw-r--r--users/gary/rules.mk1
-rw-r--r--users/hvp/hvp.c2
-rw-r--r--users/hvp/hvp.h6
-rw-r--r--users/hvp/readme.md1
-rw-r--r--users/hvp/rules.mk4
-rw-r--r--users/hvp/tap_dances.c75
-rw-r--r--users/hvp/tap_dances.h10
-rw-r--r--users/issmirnov/config.h45
-rw-r--r--users/issmirnov/issmirnov.c43
-rw-r--r--users/issmirnov/issmirnov.h35
-rw-r--r--users/issmirnov/rows.h55
-rw-r--r--users/issmirnov/rules.mk25
-rw-r--r--users/issmirnov/tap_tog.c52
-rw-r--r--users/issmirnov/tap_tog.h10
-rw-r--r--users/jarred/jarred.h1
-rw-r--r--users/jarred/readme.md12
-rw-r--r--users/konstantin/config.h13
-rw-r--r--users/konstantin/konstantin.c65
-rw-r--r--users/konstantin/konstantin.h29
-rw-r--r--users/konstantin/rgb.c7
-rw-r--r--users/konstantin/rgb.h12
-rw-r--r--users/konstantin/tap_dance.c3
-rw-r--r--users/konstantin/tap_dance.h12
-rw-r--r--users/kuchosauronad0/.gitignore3
-rw-r--r--users/kuchosauronad0/combo.c27
-rw-r--r--users/kuchosauronad0/combo.h21
-rw-r--r--users/kuchosauronad0/config.h90
-rw-r--r--users/kuchosauronad0/encoder.c63
-rw-r--r--users/kuchosauronad0/encoder.h4
-rw-r--r--users/kuchosauronad0/kuchosauronad0.c197
-rw-r--r--users/kuchosauronad0/kuchosauronad0.h109
-rw-r--r--users/kuchosauronad0/leader.c116
-rw-r--r--users/kuchosauronad0/leader.h6
-rw-r--r--users/kuchosauronad0/process_records.c244
-rw-r--r--users/kuchosauronad0/process_records.h91
-rw-r--r--users/kuchosauronad0/readme.md217
-rw-r--r--users/kuchosauronad0/rgblight_user.c156
-rw-r--r--users/kuchosauronad0/rgblight_user.h23
-rw-r--r--users/kuchosauronad0/rules.mk49
-rw-r--r--users/kuchosauronad0/tap_dances.c55
-rw-r--r--users/kuchosauronad0/tap_dances.h26
-rw-r--r--users/kuchosauronad0/template.c125
-rw-r--r--users/kuchosauronad0/template.h18
-rw-r--r--users/kuchosauronad0/unicode.c62
-rw-r--r--users/kuchosauronad0/unicode.h67
-rw-r--r--users/kuchosauronad0/wrappers.h212
-rw-r--r--users/manna-harbour_miryoku/manna-harbour_miryoku.c14
-rw-r--r--users/manna-harbour_miryoku/miryoku.org28
-rw-r--r--users/mattly/mattly.h37
-rw-r--r--users/mguterl/config.h0
-rw-r--r--users/mguterl/mguterl.c1
-rw-r--r--users/mguterl/mguterl.h67
-rw-r--r--users/mguterl/readme.md14
-rw-r--r--users/mguterl/rules.mk1
-rw-r--r--users/narze/narze.c1
-rw-r--r--users/narze/narze.h9
-rw-r--r--users/narze/readme.md18
-rw-r--r--users/narze/rules.mk5
-rw-r--r--users/narze/superduper.c66
-rw-r--r--users/narze/superduper.h7
-rw-r--r--users/ninjonas/.gitignore1
-rw-r--r--users/ninjonas/README.md109
-rw-r--r--users/ninjonas/config.h14
-rw-r--r--users/ninjonas/ninjonas.c20
-rw-r--r--users/ninjonas/ninjonas.h136
-rw-r--r--users/ninjonas/oled.c91
-rw-r--r--users/ninjonas/process_records.c117
-rw-r--r--users/ninjonas/process_records.h30
-rw-r--r--users/ninjonas/rules.mk13
-rw-r--r--users/ninjonas/tap_dances.c12
-rw-r--r--users/ninjonas/tap_dances.h22
-rw-r--r--users/ridingqwerty/config.h3
-rw-r--r--users/ridingqwerty/process_records.c33
-rw-r--r--users/ridingqwerty/process_records.h29
-rw-r--r--users/ridingqwerty/ridingqwerty.c1
-rw-r--r--users/ridingqwerty/ridingqwerty.h37
-rw-r--r--users/ridingqwerty/rules.mk8
-rw-r--r--users/rishka/rishka.c1
-rw-r--r--users/rishka/rishka.h74
-rw-r--r--users/rishka/rules.mk1
-rw-r--r--users/sethBarberee/config.h8
-rw-r--r--users/sethBarberee/readme.md6
-rw-r--r--users/sethBarberee/rules.mk1
-rw-r--r--users/sethBarberee/sethBarberee.c45
-rw-r--r--users/sethBarberee/sethBarberee.h20
-rw-r--r--users/talljoe/talljoe.c2
-rw-r--r--users/tominabox1/.gitignore2
-rw-r--r--users/tominabox1/config.h80
-rw-r--r--users/tominabox1/dimple_rgb.c433
-rw-r--r--users/tominabox1/doug.c243
-rw-r--r--users/tominabox1/readme.md5
-rw-r--r--users/tominabox1/rules.mk26
-rw-r--r--users/tominabox1/tominabox1.c281
-rw-r--r--users/tominabox1/tominabox1.h56
-rw-r--r--users/tominabox1/wrappers.h142
-rw-r--r--users/xulkal/config.h4
-rw-r--r--users/xulkal/custom_encoder.c69
-rw-r--r--users/xulkal/custom_keycodes.h12
-rw-r--r--users/xulkal/custom_oled.c207
-rw-r--r--users/xulkal/custom_rgb.c64
-rw-r--r--users/xulkal/custom_rgb.h17
-rw-r--r--users/xulkal/custom_tap_dance.c17
-rw-r--r--users/xulkal/custom_tap_dance.h7
-rw-r--r--users/xulkal/layouts.h6
-rw-r--r--users/xulkal/process_records.c38
-rw-r--r--users/xulkal/process_records.h1
-rw-r--r--users/xulkal/rules.mk23
-rw-r--r--users/xulkal/timer_utils.c12
-rw-r--r--users/xulkal/timer_utils.h6
-rw-r--r--users/xulkal/xulkal.h1
-rw-r--r--users/yanfali/config.h21
-rw-r--r--users/yanfali/rules.mk16
-rw-r--r--users/yet-another-developer/.gitignore2
-rw-r--r--users/yet-another-developer/README.md7
-rw-r--r--users/yet-another-developer/combo.c27
-rw-r--r--users/yet-another-developer/combo.h21
-rw-r--r--users/yet-another-developer/config.h56
-rw-r--r--users/yet-another-developer/leader.c46
-rw-r--r--users/yet-another-developer/leader.h6
-rw-r--r--users/yet-another-developer/process_records.c193
-rw-r--r--users/yet-another-developer/process_records.h109
-rw-r--r--users/yet-another-developer/rules.mk50
-rw-r--r--users/yet-another-developer/tap_dances.c55
-rw-r--r--users/yet-another-developer/tap_dances.h26
-rw-r--r--users/yet-another-developer/unicode.c62
-rw-r--r--users/yet-another-developer/unicode.h67
-rw-r--r--users/yet-another-developer/wrappers.h166
-rw-r--r--users/yet-another-developer/yet-another-developer.c160
-rw-r--r--users/yet-another-developer/yet-another-developer.h87
164 files changed, 8227 insertions, 1233 deletions
diff --git a/users/bcat/bcat.c b/users/bcat/bcat.c
new file mode 100644
index 0000000000..bea64dbaa9
--- /dev/null
+++ b/users/bcat/bcat.c
@@ -0,0 +1,6 @@
+#include "quantum.h"
+
+#if defined(RGBLIGHT_ENABLE)
+ /* Adjust RGB static hue ranges for shorter gradients than default. */
+ const uint8_t RGBLED_GRADIENT_RANGES[] PROGMEM = {255, 127, 63, 31, 15};
+#endif
diff --git a/users/bcat/config.h b/users/bcat/config.h
index 7d42008955..f6be07bf6e 100644
--- a/users/bcat/config.h
+++ b/users/bcat/config.h
@@ -1,36 +1,67 @@
-/* Delay between tap_code register and unregister to fix flaky media keys. */
+/* Wait between tap_code register and unregister to fix flaky media keys. */
#undef TAP_CODE_DELAY
-#define TAP_CODE_DELAY 10
+#define TAP_CODE_DELAY 20
-/* Turn off RGB lighting when the host goes to sleep. */
-#define RGBLIGHT_SLEEP
+/* Extend default tap timeout because I'm too slow. :) */
+#undef TAPPING_TERM
-/* Keep backlight and RGB level increments consistent across keyboards. */
-#undef BACKLIGHT_LEVELS
-#undef RGBLIGHT_HUE_STEP
-#undef RGBLIGHT_SAT_STEP
-#undef RGBLIGHT_VAL_STEP
+#define TAPPING_TERM 250
-#define BACKLIGHT_LEVELS 7
-#define RGBLIGHT_HUE_STEP 8
-#define RGBLIGHT_SAT_STEP 17
-#define RGBLIGHT_VAL_STEP 17
+/*
+ * Treat mod-tap keys as holds even if the mod-tap key and the key being
+ * modified are both relased within TAPPING_TERM. This assumes the mod-tap key
+ * isn't usually pressed in quick succession with other tapped keys, which is
+ * good when the tap keycode is something like KC_ESC rather than a letter.
+ */
+#define PERMISSIVE_HOLD
-/* Make mouse operation smoother. */
-#undef MOUSEKEY_DELAY
-#undef MOUSEKEY_INTERVAL
+/*
+ * Turn off key repeat support of the tap keycode for tap-hold keys, enabling
+ * holds to work correctly in quick succession after taps.
+ */
+#define TAPPING_FORCE_HOLD
-#define MOUSEKEY_DELAY 0
-#define MOUSEKEY_INTERVAL 16
+#if defined(RGBLIGHT_ENABLE)
+ /* Turn off RGB underglow when the host goes to sleep. */
+ #define RGBLIGHT_SLEEP
-/* Lower mouse speed to adjust for reduced MOUSEKEY_INTERVAL. */
-#undef MOUSEKEY_MAX_SPEED
-#undef MOUSEKEY_TIME_TO_MAX
-#undef MOUSEKEY_WHEEL_MAX_SPEED
-#undef MOUSEKEY_WHEEL_TIME_TO_MAX
+ /* Keep RGB underglow level increments consistent across keyboards. */
+ #undef RGBLIGHT_HUE_STEP
+ #undef RGBLIGHT_SAT_STEP
+ #undef RGBLIGHT_VAL_STEP
-#define MOUSEKEY_MAX_SPEED 7
-#define MOUSEKEY_TIME_TO_MAX 150
-#define MOUSEKEY_WHEEL_MAX_SPEED 3
-#define MOUSEKEY_WHEEL_TIME_TO_MAX 150
+ #define RGBLIGHT_HUE_STEP 8
+ #define RGBLIGHT_SAT_STEP 17
+ #define RGBLIGHT_VAL_STEP 17
+#endif
+
+#if defined(BACKLIGHT_ENABLE)
+ /* Enable backlight breathing across the board. */
+ #define BACKLIGHT_BREATHING
+
+ /* Keep backlight level increments consistent across keyboards. */
+ #undef BACKLIGHT_LEVELS
+
+ #define BACKLIGHT_LEVELS 7
+#endif
+
+#if defined(MOUSEKEY_ENABLE)
+ /* Make mouse operation smoother. */
+ #undef MOUSEKEY_DELAY
+ #undef MOUSEKEY_INTERVAL
+
+ #define MOUSEKEY_DELAY 0
+ #define MOUSEKEY_INTERVAL 16
+
+ /* Lower mouse speed to adjust for reduced MOUSEKEY_INTERVAL. */
+ #undef MOUSEKEY_MAX_SPEED
+ #undef MOUSEKEY_TIME_TO_MAX
+ #undef MOUSEKEY_WHEEL_MAX_SPEED
+ #undef MOUSEKEY_WHEEL_TIME_TO_MAX
+
+ #define MOUSEKEY_MAX_SPEED 7
+ #define MOUSEKEY_TIME_TO_MAX 150
+ #define MOUSEKEY_WHEEL_MAX_SPEED 3
+ #define MOUSEKEY_WHEEL_TIME_TO_MAX 150
+#endif
diff --git a/users/bcat/rules.mk b/users/bcat/rules.mk
index 59f82709ad..6d3444b2ce 100644
--- a/users/bcat/rules.mk
+++ b/users/bcat/rules.mk
@@ -1,11 +1,23 @@
+SRC += bcat.c
+
# Enable Bootmagic Lite to consistently reset to bootloader and clear EEPROM.
BOOTMAGIC_ENABLE = lite
# Enable mouse and media keys on all keyboards.
-MOUSEKEY_ENABLE = yes
EXTRAKEY_ENABLE = yes
+MOUSEKEY_ENABLE = yes
# Disable some unwanted features on all keyboards.
-CONSOLE_ENABLE = no
+API_SYSEX_ENABLE = no
COMMAND_ENABLE = no
+CONSOLE_ENABLE = no
+FAUXCLICKY_ENABLE = no
+MIDI_ENABLE = no
NKRO_ENABLE = no
+SLEEP_LED_ENABLE = no
+UCIS_ENABLE = no
+UNICODE_ENABLE = no
+UNICODEMAP_ENABLE = no
+
+# Enable link-time optimization to reduce binary size.
+LINK_TIME_OPTIMIZATION_ENABLE = yes
diff --git a/users/drashna/.gitlab-ci.yml b/users/drashna/.gitlab-ci.yml
index 679bdf4351..7218a21bec 100644
--- a/users/drashna/.gitlab-ci.yml
+++ b/users/drashna/.gitlab-ci.yml
@@ -10,7 +10,7 @@ QMK Firmware:
image: ubuntu:18.10
before_script:
- apt-get update -qy
- - apt-get install -y build-essential avr-libc binutils-arm-none-eabi binutils-avr dfu-programmer dfu-util gcc gcc-arm-none-eabi git libnewlib-arm-none-eabi gcc-avr unzip wget zip
+ - apt-get install -y build-essential avr-libc binutils-arm-none-eabi binutils-avr dfu-programmer dfu-util gcc gcc-arm-none-eabi git libnewlib-arm-none-eabi gcc-avr python3 unzip wget zip
- avr-gcc --version
- uname -a
script:
diff --git a/users/drashna/config.h b/users/drashna/config.h
index a6d8e75263..6fafff8604 100644
--- a/users/drashna/config.h
+++ b/users/drashna/config.h
@@ -1,47 +1,105 @@
#pragma once
+// Use custom magic number so that when switching branches, EEPROM always gets reset
+#define EECONFIG_MAGIC_NUMBER (uint16_t)0x1337
-#ifdef AUDIO_ENABLE
-# define AUDIO_CLICKY
-# define STARTUP_SONG SONG(RICK_ROLL)
-# define GOODBYE_SONG SONG(SONIC_RING)
-# define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \
- SONG(COLEMAK_SOUND), \
- SONG(DVORAK_SOUND), \
- SONG(OVERWATCH_THEME) \
- }
-
-# define AUDIO_CLICKY_FREQ_RANDOMNESS 1.5f
+/* Set Polling rate to 1000Hz */
+#define USB_POLLING_INTERVAL_MS 1
-# define UNICODE_SONG_OSX SONG(RICK_ROLL)
-# define UNICODE_SONG_LNX SONG(RICK_ROLL)
-# define UNICODE_SONG_WIN SONG(RICK_ROLL)
-# define UNICODE_SONG_BSD SONG(RICK_ROLL)
-# define UNICODE_SONG_WINC SONG(RICK_ROLL)
-
-#endif // !AUDIO_ENABLE
+#ifdef AUDIO_ENABLE
+# if __GNUC__ > 5
+# if __has_include("drashna_song_list.h")
+# include "drashna_song_list.h"
+# endif // if file exists
+# endif // __GNUC__
+
+# define AUDIO_CLICKY
+# define STARTUP_SONG SONG(RICK_ROLL)
+# define GOODBYE_SONG SONG(SONIC_RING)
+# define DEFAULT_LAYER_SONGS \
+ { SONG(QWERTY_SOUND), SONG(COLEMAK_SOUND), SONG(DVORAK_SOUND), SONG(OVERWATCH_THEME) }
+
+# define AUDIO_CLICKY_FREQ_RANDOMNESS 1.5f
+
+# define UNICODE_SONG_OSX SONG(RICK_ROLL)
+# define UNICODE_SONG_LNX SONG(RICK_ROLL)
+# define UNICODE_SONG_WIN SONG(RICK_ROLL)
+# define UNICODE_SONG_BSD SONG(RICK_ROLL)
+# define UNICODE_SONG_WINC SONG(RICK_ROLL)
+#endif // !AUDIO_ENABLE
#ifdef RGBLIGHT_ENABLE
-# define RGBLIGHT_SLEEP
-# undef RGBLIGHT_ANIMATIONS
-# define RGBLIGHT_EFFECT_BREATHING
-# define RGBLIGHT_EFFECT_SNAKE
-# define RGBLIGHT_EFFECT_KNIGHT
-#endif // RGBLIGHT_ENABLE
+# undef RGBLIGHT_ANIMATIONS
+# if defined(__AVR__) && !defined(__AVR_AT90USB1286__)
+# define RGBLIGHT_SLEEP
+# define RGBLIGHT_EFFECT_BREATHING
+# define RGBLIGHT_EFFECT_SNAKE
+# define RGBLIGHT_EFFECT_KNIGHT
+# else
+# define RGBLIGHT_ANIMATIONS
+# endif
+#endif // RGBLIGHT_ENABLE
+
+#ifdef RGB_MATRIX_ENABLE
+# define RGB_MATRIX_KEYPRESSES // reacts to keypresses (will slow down matrix scan by a lot)
+// # define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (not recommened)
+# define RGB_MATRIX_FRAMEBUFFER_EFFECTS
+// # define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
+# define RGB_DISABLE_WHEN_USB_SUSPENDED true // turn off effects when suspended
+// # define RGB_MATRIX_MAXIMUM_BRIGHTNESS 200 // limits maximum brightness of LEDs to 200 out of 255. If not defined maximum brightness is set to 255
+// # define EECONFIG_RGB_MATRIX (uint32_t *)16
+
+# if defined(__AVR__) && !defined(__AVR_AT90USB1286__)
+# define DISABLE_RGB_MATRIX_ALPHAS_MODS
+# define DISABLE_RGB_MATRIX_GRADIENT_UP_DOWN
+# define DISABLE_RGB_MATRIX_BREATHING
+# define DISABLE_RGB_MATRIX_BAND_SAT
+# define DISABLE_RGB_MATRIX_BAND_VAL
+# define DISABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
+# define DISABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
+# define DISABLE_RGB_MATRIX_BAND_SPIRAL_SAT
+# define DISABLE_RGB_MATRIX_BAND_SPIRAL_VAL
+# define DISABLE_RGB_MATRIX_CYCLE_ALL
+# define DISABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
+# define DISABLE_RGB_MATRIX_CYCLE_UP_DOWN
+# define DISABLE_RGB_MATRIX_CYCLE_OUT_IN
+// # define DISABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
+# define DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
+# define DISABLE_RGB_MATRIX_DUAL_BEACON
+# define DISABLE_RGB_MATRIX_CYCLE_PINWHEEL
+# define DISABLE_RGB_MATRIX_CYCLE_SPIRAL
+# define DISABLE_RGB_MATRIX_RAINBOW_BEACON
+# define DISABLE_RGB_MATRIX_RAINBOW_PINWHEELS
+# define DISABLE_RGB_MATRIX_RAINDROPS
+# define DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
+// # define DISABLE_RGB_MATRIX_TYPING_HEATMAP
+# define DISABLE_RGB_MATRIX_DIGITAL_RAIN
+# define DISABLE_RGB_MATRIX_SOLID_REACTIVE
+# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
+# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
+# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
+# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
+# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
+# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
+# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
+# define DISABLE_RGB_MATRIX_SPLASH
+# define DISABLE_RGB_MATRIX_MULTISPLASH
+# define DISABLE_RGB_MATRIX_SOLID_SPLASH
+# define DISABLE_RGB_MATRIX_SOLID_MULTISPLASH
+# endif // AVR
+#endif // RGB_MATRIX_ENABLE
#ifndef ONESHOT_TAP_TOGGLE
-# define ONESHOT_TAP_TOGGLE 2
-#endif // !ONESHOT_TAP_TOGGLE
+# define ONESHOT_TAP_TOGGLE 2
+#endif // !ONESHOT_TAP_TOGGLE
#ifndef ONESHOT_TIMEOUT
-# define ONESHOT_TIMEOUT 3000
-#endif// !ONESHOT_TIMEOUT
+# define ONESHOT_TIMEOUT 3000
+#endif // !ONESHOT_TIMEOUT
#ifndef QMK_KEYS_PER_SCAN
-# define QMK_KEYS_PER_SCAN 4
-#endif // !QMK_KEYS_PER_SCAN
-
-
+# define QMK_KEYS_PER_SCAN 4
+#endif // !QMK_KEYS_PER_SCAN
// this makes it possible to do rolling combos (zx) with keys that
// convert to other keys on hold (z becomes ctrl when you hold it,
@@ -55,27 +113,26 @@
#define FORCE_NKRO
#ifndef TAPPING_TOGGLE
-# define TAPPING_TOGGLE 1
+# define TAPPING_TOGGLE 1
#endif
#ifdef TAPPING_TERM
-# undef TAPPING_TERM
-#endif // TAPPING_TERM
+# undef TAPPING_TERM
+#endif // TAPPING_TERM
#if defined(KEYBOARD_ergodox_ez)
-# define TAPPING_TERM 185
+# define TAPPING_TERM 185
#elif defined(KEYBOARD_crkbd)
-# define TAPPING_TERM 200
+# define TAPPING_TERM 200
#else
-# define TAPPING_TERM 175
+# define TAPPING_TERM 175
#endif
-
#define TAP_CODE_DELAY 5
/* Disable unused and unneeded features to reduce on firmware size */
#ifdef LOCKING_SUPPORT_ENABLE
-# undef LOCKING_SUPPORT_ENABLE
+# undef LOCKING_SUPPORT_ENABLE
#endif
#ifdef LOCKING_RESYNC_ENABLE
-# undef LOCKING_RESYNC_ENABLE
+# undef LOCKING_RESYNC_ENABLE
#endif
diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c
index acc6b9f9ed..71779a6215 100644
--- a/users/drashna/drashna.c
+++ b/users/drashna/drashna.c
@@ -19,40 +19,18 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
userspace_config_t userspace_config;
#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
- #define DRASHNA_UNICODE_MODE UC_WIN
+# define DRASHNA_UNICODE_MODE UC_WIN
#else
- // set to 2 for UC_WIN, set to 4 for UC_WINC
- #define DRASHNA_UNICODE_MODE 2
+// set to 2 for UC_WIN, set to 4 for UC_WINC
+# define DRASHNA_UNICODE_MODE 2
#endif
-
-// This block is for all of the gaming macros, as they were all doing
-// the same thing, but with differring text sent.
-bool send_game_macro(const char *str, keyrecord_t *record, bool override) {
- if (!record->event.pressed || override) {
- uint16_t keycode;
- if (userspace_config.is_overwatch) {
- keycode = KC_BSPC;
- } else {
- keycode = KC_ENTER;
- }
- clear_keyboard();
- tap_code(keycode);
- wait_ms(TAP_CODE_DELAY);
- send_string_with_delay(str, TAP_CODE_DELAY);
- wait_ms(TAP_CODE_DELAY);
- tap_code(KC_ENTER);
- }
- if (override) wait_ms(3000);
- return false;
-}
-
-bool mod_key_press_timer (uint16_t code, uint16_t mod_code, bool pressed) {
+bool mod_key_press_timer(uint16_t code, uint16_t mod_code, bool pressed) {
static uint16_t this_timer;
- if(pressed) {
- this_timer= timer_read();
+ if (pressed) {
+ this_timer = timer_read();
} else {
- if (timer_elapsed(this_timer) < TAPPING_TERM){
+ if (timer_elapsed(this_timer) < TAPPING_TERM) {
tap_code(code);
} else {
register_code(mod_code);
@@ -63,11 +41,11 @@ bool mod_key_press_timer (uint16_t code, uint16_t mod_code, bool pressed) {
return false;
}
-bool mod_key_press (uint16_t code, uint16_t mod_code, bool pressed, uint16_t this_timer) {
- if(pressed) {
- this_timer= timer_read();
+bool mod_key_press(uint16_t code, uint16_t mod_code, bool pressed, uint16_t this_timer) {
+ if (pressed) {
+ this_timer = timer_read();
} else {
- if (timer_elapsed(this_timer) < TAPPING_TERM){
+ if (timer_elapsed(this_timer) < TAPPING_TERM) {
tap_code(code);
} else {
register_code(mod_code);
@@ -80,90 +58,85 @@ bool mod_key_press (uint16_t code, uint16_t mod_code, bool pressed, uint16_t thi
void bootmagic_lite(void) {
matrix_scan();
- #if defined(DEBOUNCING_DELAY) && DEBOUNCING_DELAY > 0
- wait_ms(DEBOUNCING_DELAY * 2);
- #elif defined(DEBOUNCE) && DEBOUNCE > 0
- wait_ms(DEBOUNCE * 2);
- #else
- wait_ms(30);
- #endif
+#if defined(DEBOUNCING_DELAY) && DEBOUNCING_DELAY > 0
+ wait_ms(DEBOUNCING_DELAY * 2);
+#elif defined(DEBOUNCE) && DEBOUNCE > 0
+ wait_ms(DEBOUNCE * 2);
+#else
+ wait_ms(30);
+#endif
matrix_scan();
if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) {
bootloader_jump();
}
}
+__attribute__((weak)) void keyboard_pre_init_keymap(void) {}
+
+void keyboard_pre_init_user(void) {
+ userspace_config.raw = eeconfig_read_user();
+ keyboard_pre_init_keymap();
+}
// Add reconfigurable functions here, for keymap customization
// This allows for a global, userspace functions, and continued
// customization of the keymap. Use _keymap instead of _user
// functions in the keymaps
-__attribute__ ((weak))
-void matrix_init_keymap(void) {}
+__attribute__((weak)) void matrix_init_keymap(void) {}
// Call user matrix init, set default RGB colors and then
// call the keymap's init function
void matrix_init_user(void) {
- userspace_config.raw = eeconfig_read_user();
-
- #ifdef BOOTLOADER_CATERINA
- DDRD &= ~(1<<5);
- PORTD &= ~(1<<5);
+#if defined(BOOTLOADER_CATERINA) && defined(__AVR__)
+ DDRD &= ~(1 << 5);
+ PORTD &= ~(1 << 5);
- DDRB &= ~(1<<0);
- PORTB &= ~(1<<0);
- #endif
+ DDRB &= ~(1 << 0);
+ PORTB &= ~(1 << 0);
+#endif
- #if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
- set_unicode_input_mode(DRASHNA_UNICODE_MODE);
- get_unicode_input_mode();
- #endif //UNICODE_ENABLE
+#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
+ set_unicode_input_mode(DRASHNA_UNICODE_MODE);
+ get_unicode_input_mode();
+#endif // UNICODE_ENABLE
matrix_init_keymap();
}
-__attribute__((weak))
-void keyboard_post_init_keymap(void){ }
+__attribute__((weak)) void keyboard_post_init_keymap(void) {}
-void keyboard_post_init_user(void){
-#ifdef RGBLIGHT_ENABLE
+void keyboard_post_init_user(void) {
+#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
keyboard_post_init_rgb();
#endif
keyboard_post_init_keymap();
}
-__attribute__ ((weak))
-void shutdown_keymap(void) {}
-
-void shutdown_user (void) {
- #ifdef RGBLIGHT_ENABLE
- rgblight_enable_noeeprom();
- rgblight_mode_noeeprom(1);
- rgblight_setrgb_red();
- #endif // RGBLIGHT_ENABLE
- #ifdef RGB_MATRIX_ENABLE
- // uint16_t timer_start = timer_read();
- // rgb_matrix_set_color_all( 0xFF, 0x00, 0x00 );
- // while(timer_elapsed(timer_start) < 250) { wait_ms(1); }
- #endif //RGB_MATRIX_ENABLE
- shutdown_keymap();
-}
+__attribute__((weak)) void shutdown_keymap(void) {}
-__attribute__ ((weak))
-void suspend_power_down_keymap(void) {}
+void rgb_matrix_update_pwm_buffers(void);
-void suspend_power_down_user(void) {
- suspend_power_down_keymap();
+void shutdown_user(void) {
+#ifdef RGBLIGHT_ENABLE
+ rgblight_enable_noeeprom();
+ rgblight_mode_noeeprom(1);
+ rgblight_setrgb_red();
+#endif // RGBLIGHT_ENABLE
+#ifdef RGB_MATRIX_ENABLE
+ rgb_matrix_set_color_all(0xFF, 0x00, 0x00);
+ rgb_matrix_update_pwm_buffers();
+
+#endif // RGB_MATRIX_ENABLE
+ shutdown_keymap();
}
-__attribute__ ((weak))
-void suspend_wakeup_init_keymap(void) {}
+__attribute__((weak)) void suspend_power_down_keymap(void) {}
-void suspend_wakeup_init_user(void) {
- suspend_wakeup_init_keymap();
-}
+void suspend_power_down_user(void) { suspend_power_down_keymap(); }
+__attribute__((weak)) void suspend_wakeup_init_keymap(void) {}
-__attribute__ ((weak))
-void matrix_scan_keymap(void) {}
+void suspend_wakeup_init_user(void) { suspend_wakeup_init_keymap(); }
+
+__attribute__((weak)) void matrix_scan_keymap(void) {}
// No global matrix scan code, so just run keymap's matrix
// scan function
@@ -176,69 +149,66 @@ void matrix_scan_user(void) {
#ifdef TAP_DANCE_ENABLE // Run Diablo 3 macro checking code.
run_diablo_macro_check();
-#endif // TAP_DANCE_ENABLE
+#endif // TAP_DANCE_ENABLE
-#ifdef RGBLIGHT_ENABLE
+#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
matrix_scan_rgb();
-#endif // RGBLIGHT_ENABLE
+#endif // RGBLIGHT_ENABLE
matrix_scan_keymap();
}
-
-__attribute__ ((weak))
-layer_state_t layer_state_set_keymap (layer_state_t state) {
- return state;
-}
+__attribute__((weak)) layer_state_t layer_state_set_keymap(layer_state_t state) { return state; }
// on layer change, no matter where the change was initiated
// Then runs keymap's layer change check
layer_state_t layer_state_set_user(layer_state_t state) {
state = update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST);
-#ifdef RGBLIGHT_ENABLE
+#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
state = layer_state_set_rgb(state);
-#endif // RGBLIGHT_ENABLE
- return layer_state_set_keymap (state);
+#endif // RGBLIGHT_ENABLE
+ return layer_state_set_keymap(state);
}
-
-__attribute__ ((weak))
-layer_state_t default_layer_state_set_keymap (layer_state_t state) {
- return state;
-}
+__attribute__((weak)) layer_state_t default_layer_state_set_keymap(layer_state_t state) { return state; }
// Runs state check and changes underglow color and animation
layer_state_t default_layer_state_set_user(layer_state_t state) {
state = default_layer_state_set_keymap(state);
#if 0
-#ifdef RGBLIGHT_ENABLE
+# if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
state = default_layer_state_set_rgb(state);
-#endif // RGBLIGHT_ENABLE
+# endif // RGBLIGHT_ENABLE
#endif
return state;
}
-__attribute__ ((weak))
-void led_set_keymap(uint8_t usb_led) {}
+__attribute__((weak)) void led_set_keymap(uint8_t usb_led) {}
// Any custom LED code goes here.
// So far, I only have keyboard specific code,
// So nothing goes here.
-void led_set_user(uint8_t usb_led) {
- led_set_keymap(usb_led);
-}
+void led_set_user(uint8_t usb_led) { led_set_keymap(usb_led); }
-__attribute__ ((weak))
-void eeconfig_init_keymap(void) {}
+__attribute__((weak)) void eeconfig_init_keymap(void) {}
void eeconfig_init_user(void) {
- userspace_config.raw = 0;
+ userspace_config.raw = 0;
userspace_config.rgb_layer_change = true;
eeconfig_update_user(userspace_config.raw);
- #if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
+#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
set_unicode_input_mode(DRASHNA_UNICODE_MODE);
get_unicode_input_mode();
- #else
+#else
eeprom_update_byte(EECONFIG_UNICODEMODE, DRASHNA_UNICODE_MODE);
- #endif
+#endif
+ eeconfig_init_keymap();
+ keyboard_init();
+}
+
+bool hasAllBitsInMask(uint8_t value, uint8_t mask) {
+ value &= 0xF;
+ mask &= 0xF;
+
+ return (value & mask) == mask;
}
diff --git a/users/drashna/drashna.h b/users/drashna/drashna.h
index 507504f04e..0ba1817604 100644
--- a/users/drashna/drashna.h
+++ b/users/drashna/drashna.h
@@ -16,26 +16,22 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
-#include "quantum.h"
+#include QMK_KEYBOARD_H
+
#include "version.h"
#include "eeprom.h"
#include "wrappers.h"
#include "process_records.h"
#ifdef TAP_DANCE_ENABLE
-# include "tap_dances.h"
-#endif // TAP_DANCE_ENABLE
+# include "tap_dances.h"
+#endif // TAP_DANCE_ENABLE
#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
-# include "rgb_stuff.h"
-#endif
-#if defined(AUDIO_ENABLE) && __GNUC__ > 7
-# if __has_include("drashna_song_list.h")
-# include "drashna_song_list.h"
-# endif
+# include "rgb_stuff.h"
#endif
/* Define layer names */
enum userspace_layers {
- _QWERTY = 0,
+ _QWERTY = 0,
_NUMLOCK = 0,
_COLEMAK,
_DVORAK,
@@ -54,51 +50,48 @@ enum userspace_layers {
_ADJUST,
};
-/*
-define modifiers here, since MOD_* doesn't seem to work for these
- */
-
-
-bool mod_key_press_timer (uint16_t code, uint16_t mod_code, bool pressed);
-bool mod_key_press (uint16_t code, uint16_t mod_code, bool pressed, uint16_t this_timer);
-bool send_game_macro(const char *str, keyrecord_t *record, bool override);
-void matrix_init_keymap(void);
-void shutdown_keymap(void);
-void suspend_power_down_keymap(void);
-void suspend_wakeup_init_keymap(void);
-void matrix_scan_keymap(void);
-layer_state_t layer_state_set_keymap (layer_state_t state);
-layer_state_t default_layer_state_set_keymap (layer_state_t state);
-void led_set_keymap(uint8_t usb_led);
-void eeconfig_init_keymap(void);
+bool mod_key_press_timer(uint16_t code, uint16_t mod_code, bool pressed);
+bool mod_key_press(uint16_t code, uint16_t mod_code, bool pressed, uint16_t this_timer);
+void matrix_init_keymap(void);
+void shutdown_keymap(void);
+void suspend_power_down_keymap(void);
+void suspend_wakeup_init_keymap(void);
+void matrix_scan_keymap(void);
+layer_state_t layer_state_set_keymap(layer_state_t state);
+layer_state_t default_layer_state_set_keymap(layer_state_t state);
+void led_set_keymap(uint8_t usb_led);
+void eeconfig_init_keymap(void);
+bool hasAllBitsInMask(uint8_t value, uint8_t mask);
+// clang-format off
typedef union {
uint32_t raw;
struct {
- bool rgb_layer_change :1;
- bool is_overwatch :1;
- bool nuke_switch :1;
- uint8_t unicode_mod :4;
- bool swapped_numbers :1;
+ bool rgb_layer_change :1;
+ bool is_overwatch :1;
+ bool nuke_switch :1;
+ uint8_t unicode_mod :4;
+ bool swapped_numbers :1;
+ bool rgb_matrix_idle_anim :1;
};
} userspace_config_t;
+// clang-format on
extern userspace_config_t userspace_config;
-
/*
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 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
diff --git a/users/drashna/font_gmk_bad.h b/users/drashna/font_gmk_bad.h
new file mode 100644
index 0000000000..c1c5c390a9
--- /dev/null
+++ b/users/drashna/font_gmk_bad.h
@@ -0,0 +1,241 @@
+#pragma once
+
+#ifdef __AVR__
+# include <avr/io.h>
+# include <avr/pgmspace.h>
+#elif defined(ESP8266)
+# include <pgmspace.h>
+#else
+# define PROGMEM
+#endif
+
+// Corne 8x6 font with QMK Firmware Logo
+// Online editor: https://helixfonteditor.netlify.com/
+
+// clang-format off
+const unsigned char font[] PROGMEM = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00,
+ 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00,
+ 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00,
+ 0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00,
+ 0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00,
+ 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00,
+ 0x00, 0x18, 0x3C, 0x18, 0x00, 0x00,
+ 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00,
+ 0x00, 0x18, 0x24, 0x18, 0x00, 0x00,
+ 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00,
+ 0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00,
+ 0x26, 0x29, 0x79, 0x29, 0x26, 0x00,
+ 0x40, 0x7F, 0x05, 0x05, 0x07, 0x00,
+ 0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00,
+ 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00,
+ 0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00,
+ 0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00,
+ 0x14, 0x22, 0x7F, 0x22, 0x14, 0x00,
+ 0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00,
+ 0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00,
+ 0x00, 0x66, 0x89, 0x95, 0x6A, 0x00,
+ 0x60, 0x60, 0x60, 0x60, 0x60, 0x00,
+ 0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00,
+ 0x08, 0x04, 0x7E, 0x04, 0x08, 0x00,
+ 0x10, 0x20, 0x7E, 0x20, 0x10, 0x00,
+ 0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00,
+ 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00,
+ 0x1E, 0x10, 0x10, 0x10, 0x10, 0x00,
+ 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00,
+ 0x30, 0x38, 0x3E, 0x38, 0x30, 0x00,
+ 0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00,
+ 0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
+ 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00,
+ 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00,
+ 0x23, 0x13, 0x08, 0x64, 0x62, 0x00,
+ 0x36, 0x49, 0x56, 0x20, 0x50, 0x00,
+ 0x00, 0x08, 0x07, 0x03, 0x00, 0x00,
+ 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00,
+ 0x00, 0x41, 0x22, 0x1C, 0x00, 0x00,
+ 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00,
+ 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00,
+ 0x00, 0x80, 0x70, 0x30, 0x00, 0x00,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
+ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
+ 0x20, 0x10, 0x08, 0x04, 0x02, 0x00,
+ 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00,
+ 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00,
+ 0x72, 0x49, 0x49, 0x49, 0x46, 0x00,
+ 0x21, 0x41, 0x49, 0x4D, 0x33, 0x00,
+ 0x18, 0x14, 0x12, 0x7F, 0x10, 0x00,
+ 0x27, 0x45, 0x45, 0x45, 0x39, 0x00,
+ 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00,
+ 0x41, 0x21, 0x11, 0x09, 0x07, 0x00,
+ 0x36, 0x49, 0x49, 0x49, 0x36, 0x00,
+ 0x46, 0x49, 0x49, 0x29, 0x1E, 0x00,
+ 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0x34, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0x14, 0x22, 0x41, 0x00,
+ 0x14, 0x14, 0x14, 0x14, 0x14, 0x00,
+ 0x00, 0x41, 0x22, 0x14, 0x08, 0x00,
+ 0x02, 0x01, 0x59, 0x09, 0x06, 0x00,
+ 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00,
+ 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00,
+ 0x7F, 0x49, 0x49, 0x49, 0x36, 0x00,
+ 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00,
+ 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00,
+ 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00,
+ 0x7F, 0x09, 0x09, 0x09, 0x01, 0x00,
+ 0x3E, 0x41, 0x41, 0x51, 0x73, 0x00,
+ 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00,
+ 0x00, 0x41, 0x7F, 0x41, 0x00, 0x00,
+ 0x20, 0x40, 0x41, 0x3F, 0x01, 0x00,
+ 0x7F, 0x08, 0x14, 0x22, 0x41, 0x00,
+ 0x7F, 0x40, 0x40, 0x40, 0x40, 0x00,
+ 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00,
+ 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00,
+ 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00,
+ 0x7F, 0x09, 0x09, 0x09, 0x06, 0x00,
+ 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00,
+ 0x7F, 0x09, 0x19, 0x29, 0x46, 0x00,
+ 0x26, 0x49, 0x49, 0x49, 0x32, 0x00,
+ 0x03, 0x01, 0x7F, 0x01, 0x03, 0x00,
+ 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00,
+ 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00,
+ 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00,
+ 0x63, 0x14, 0x08, 0x14, 0x63, 0x00,
+ 0x03, 0x04, 0x78, 0x04, 0x03, 0x00,
+ 0x61, 0x59, 0x49, 0x4D, 0x43, 0x00,
+ 0x00, 0x7F, 0x41, 0x41, 0x41, 0x00,
+ 0x02, 0x04, 0x08, 0x10, 0x20, 0x00,
+ 0x00, 0x41, 0x41, 0x41, 0x7F, 0x00,
+ 0x04, 0x02, 0x01, 0x02, 0x04, 0x00,
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
+ 0x00, 0x03, 0x07, 0x08, 0x00, 0x00,
+ 0x20, 0x54, 0x54, 0x78, 0x40, 0x00,
+ 0x7F, 0x28, 0x44, 0x44, 0x38, 0x00,
+ 0x38, 0x44, 0x44, 0x44, 0x28, 0x00,
+ 0x38, 0x44, 0x44, 0x28, 0x7F, 0x00,
+ 0x38, 0x54, 0x54, 0x54, 0x18, 0x00,
+ 0x00, 0x08, 0x7E, 0x09, 0x02, 0x00,
+ 0x18, 0x24, 0x24, 0x1C, 0x78, 0x00,
+ 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00,
+ 0x00, 0x44, 0x7D, 0x40, 0x00, 0x00,
+ 0x20, 0x40, 0x40, 0x3D, 0x00, 0x00,
+ 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00,
+ 0x00, 0x41, 0x7F, 0x40, 0x00, 0x00,
+ 0x7C, 0x04, 0x78, 0x04, 0x78, 0x00,
+ 0x7C, 0x08, 0x04, 0x04, 0x78, 0x00,
+ 0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
+ 0x7C, 0x18, 0x24, 0x24, 0x18, 0x00,
+ 0x18, 0x24, 0x24, 0x18, 0x7C, 0x00,
+ 0x7C, 0x08, 0x04, 0x04, 0x08, 0x00,
+ 0x48, 0x54, 0x54, 0x54, 0x24, 0x00,
+ 0x04, 0x04, 0x3F, 0x44, 0x24, 0x00,
+ 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00,
+ 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00,
+ 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00,
+ 0x44, 0x28, 0x10, 0x28, 0x44, 0x00,
+ 0x4C, 0x90, 0x10, 0x90, 0x7C, 0x00,
+ 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00,
+ 0x00, 0x08, 0x36, 0x41, 0x00, 0x00,
+ 0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
+ 0x00, 0x41, 0x36, 0x08, 0x00, 0x00,
+ 0x02, 0x01, 0x02, 0x04, 0x02, 0x00,
+ 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0xC0, 0xE0, 0xF0, 0xF0, 0x70,
+ 0x38, 0x38, 0x38, 0x78, 0x70, 0xF0,
+ 0xE0, 0xE0, 0x80, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0xF0, 0xF8,
+ 0xF8, 0xF8, 0xF8, 0x00, 0x00, 0x00,
+ 0x80, 0xE0, 0xF8, 0xF8, 0xF8, 0xF8,
+ 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0xF8, 0xF8, 0xF8, 0x38, 0x00,
+ 0x80, 0xE0, 0xF0, 0xF8, 0x78, 0x38,
+ 0x08, 0x08, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0xF8, 0xF8, 0xF8, 0x38, 0x38,
+ 0x38, 0xF8, 0xF0, 0xF0, 0xE0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0xFC, 0xFC,
+ 0xFC, 0x1C, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC,
+ 0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00,
+ 0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E,
+ 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C,
+ 0xFF, 0xFF, 0xFF, 0xC1, 0x80, 0x00,
+ 0x00, 0x38, 0x38, 0xB8, 0xB8, 0xF9,
+ 0xF9, 0xF8, 0x38, 0x00, 0x00, 0x00,
+ 0x00, 0xC0, 0xF8, 0xFF, 0xFF, 0x1F,
+ 0x01, 0x3F, 0xFF, 0xFF, 0xF0, 0xFE,
+ 0x7F, 0x0F, 0x03, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80,
+ 0xFF, 0xFF, 0xFF, 0x3F, 0x1E, 0x7F,
+ 0xFF, 0xFF, 0xF3, 0xC1, 0x80, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
+ 0xFF, 0xFF, 0xFF, 0x3F, 0x1C, 0x1C,
+ 0x9C, 0xFF, 0xFF, 0xF3, 0xE1, 0x00,
+ 0x00, 0x00, 0x00, 0xF0, 0xFC, 0xFE,
+ 0xFF, 0x0F, 0x07, 0x07, 0x8E, 0xFF,
+ 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00,
+ 0x00, 0xF0, 0xFC, 0xFE, 0xFF, 0x8F,
+ 0x07, 0x07, 0x8E, 0xFF, 0xFF, 0xFF,
+ 0x3F, 0x00, 0x00, 0x00, 0x00, 0x80,
+ 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00,
+ 0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F,
+ 0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00,
+ 0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F,
+ 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x03, 0x03, 0x03, 0x07,
+ 0x07, 0x07, 0x07, 0x03, 0x03, 0x03,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x06, 0x07, 0x07, 0x07, 0x01, 0x00,
+ 0x00, 0x00, 0x07, 0x07, 0x07, 0x01,
+ 0x00, 0x00, 0x00, 0x07, 0x07, 0x07,
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x07,
+ 0x07, 0x07, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x03, 0x07, 0x07, 0x07, 0x06,
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x03, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x03, 0x07,
+ 0x07, 0x07, 0x07, 0x03, 0x07, 0x07,
+ 0x07, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0x07, 0x07, 0x07,
+ 0x07, 0x03, 0x07, 0x07, 0x07, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x07,
+ 0x07, 0x07, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
diff --git a/users/drashna/hue_manitee_font.h b/users/drashna/hue_manitee_font.h
new file mode 100644
index 0000000000..72d50f7a6a
--- /dev/null
+++ b/users/drashna/hue_manitee_font.h
@@ -0,0 +1,241 @@
+#pragma once
+
+#ifdef __AVR__
+# include <avr/io.h>
+# include <avr/pgmspace.h>
+#elif defined(ESP8266)
+# include <pgmspace.h>
+#else
+# define PROGMEM
+#endif
+
+// Corne 8x6 font with QMK Firmware Logo
+// Online editor: https://helixfonteditor.netlify.com/
+
+// clang-format off
+const unsigned char font[] PROGMEM = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00,
+ 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00,
+ 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00,
+ 0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00,
+ 0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00,
+ 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00,
+ 0x00, 0x18, 0x3C, 0x18, 0x00, 0x00,
+ 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00,
+ 0x00, 0x18, 0x24, 0x18, 0x00, 0x00,
+ 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00,
+ 0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00,
+ 0x26, 0x29, 0x79, 0x29, 0x26, 0x00,
+ 0x40, 0x7F, 0x05, 0x05, 0x07, 0x00,
+ 0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00,
+ 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00,
+ 0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00,
+ 0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00,
+ 0x14, 0x22, 0x7F, 0x22, 0x14, 0x00,
+ 0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00,
+ 0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00,
+ 0x00, 0x66, 0x89, 0x95, 0x6A, 0x00,
+ 0x60, 0x60, 0x60, 0x60, 0x60, 0x00,
+ 0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00,
+ 0x08, 0x04, 0x7E, 0x04, 0x08, 0x00,
+ 0x10, 0x20, 0x7E, 0x20, 0x10, 0x00,
+ 0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00,
+ 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00,
+ 0x1E, 0x10, 0x10, 0x10, 0x10, 0x00,
+ 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00,
+ 0x30, 0x38, 0x3E, 0x38, 0x30, 0x00,
+ 0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00,
+ 0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
+ 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00,
+ 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00,
+ 0x23, 0x13, 0x08, 0x64, 0x62, 0x00,
+ 0x36, 0x49, 0x56, 0x20, 0x50, 0x00,
+ 0x00, 0x08, 0x07, 0x03, 0x00, 0x00,
+ 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00,
+ 0x00, 0x41, 0x22, 0x1C, 0x00, 0x00,
+ 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00,
+ 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00,
+ 0x00, 0x80, 0x70, 0x30, 0x00, 0x00,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
+ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
+ 0x20, 0x10, 0x08, 0x04, 0x02, 0x00,
+ 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00,
+ 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00,
+ 0x72, 0x49, 0x49, 0x49, 0x46, 0x00,
+ 0x21, 0x41, 0x49, 0x4D, 0x33, 0x00,
+ 0x18, 0x14, 0x12, 0x7F, 0x10, 0x00,
+ 0x27, 0x45, 0x45, 0x45, 0x39, 0x00,
+ 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00,
+ 0x41, 0x21, 0x11, 0x09, 0x07, 0x00,
+ 0x36, 0x49, 0x49, 0x49, 0x36, 0x00,
+ 0x46, 0x49, 0x49, 0x29, 0x1E, 0x00,
+ 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0x34, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0x14, 0x22, 0x41, 0x00,
+ 0x14, 0x14, 0x14, 0x14, 0x14, 0x00,
+ 0x00, 0x41, 0x22, 0x14, 0x08, 0x00,
+ 0x02, 0x01, 0x59, 0x09, 0x06, 0x00,
+ 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00,
+ 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00,
+ 0x7F, 0x49, 0x49, 0x49, 0x36, 0x00,
+ 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00,
+ 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00,
+ 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00,
+ 0x7F, 0x09, 0x09, 0x09, 0x01, 0x00,
+ 0x3E, 0x41, 0x41, 0x51, 0x73, 0x00,
+ 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00,
+ 0x00, 0x41, 0x7F, 0x41, 0x00, 0x00,
+ 0x20, 0x40, 0x41, 0x3F, 0x01, 0x00,
+ 0x7F, 0x08, 0x14, 0x22, 0x41, 0x00,
+ 0x7F, 0x40, 0x40, 0x40, 0x40, 0x00,
+ 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00,
+ 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00,
+ 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00,
+ 0x7F, 0x09, 0x09, 0x09, 0x06, 0x00,
+ 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00,
+ 0x7F, 0x09, 0x19, 0x29, 0x46, 0x00,
+ 0x26, 0x49, 0x49, 0x49, 0x32, 0x00,
+ 0x03, 0x01, 0x7F, 0x01, 0x03, 0x00,
+ 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00,
+ 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00,
+ 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00,
+ 0x63, 0x14, 0x08, 0x14, 0x63, 0x00,
+ 0x03, 0x04, 0x78, 0x04, 0x03, 0x00,
+ 0x61, 0x59, 0x49, 0x4D, 0x43, 0x00,
+ 0x00, 0x7F, 0x41, 0x41, 0x41, 0x00,
+ 0x02, 0x04, 0x08, 0x10, 0x20, 0x00,
+ 0x00, 0x41, 0x41, 0x41, 0x7F, 0x00,
+ 0x04, 0x02, 0x01, 0x02, 0x04, 0x00,
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
+ 0x00, 0x03, 0x07, 0x08, 0x00, 0x00,
+ 0x20, 0x54, 0x54, 0x78, 0x40, 0x00,
+ 0x7F, 0x28, 0x44, 0x44, 0x38, 0x00,
+ 0x38, 0x44, 0x44, 0x44, 0x28, 0x00,
+ 0x38, 0x44, 0x44, 0x28, 0x7F, 0x00,
+ 0x38, 0x54, 0x54, 0x54, 0x18, 0x00,
+ 0x00, 0x08, 0x7E, 0x09, 0x02, 0x00,
+ 0x18, 0x24, 0x24, 0x1C, 0x78, 0x00,
+ 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00,
+ 0x00, 0x44, 0x7D, 0x40, 0x00, 0x00,
+ 0x20, 0x40, 0x40, 0x3D, 0x00, 0x00,
+ 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00,
+ 0x00, 0x41, 0x7F, 0x40, 0x00, 0x00,
+ 0x7C, 0x04, 0x78, 0x04, 0x78, 0x00,
+ 0x7C, 0x08, 0x04, 0x04, 0x78, 0x00,
+ 0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
+ 0x7C, 0x18, 0x24, 0x24, 0x18, 0x00,
+ 0x18, 0x24, 0x24, 0x18, 0x7C, 0x00,
+ 0x7C, 0x08, 0x04, 0x04, 0x08, 0x00,
+ 0x48, 0x54, 0x54, 0x54, 0x24, 0x00,
+ 0x04, 0x04, 0x3F, 0x44, 0x24, 0x00,
+ 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00,
+ 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00,
+ 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00,
+ 0x44, 0x28, 0x10, 0x28, 0x44, 0x00,
+ 0x4C, 0x90, 0x10, 0x90, 0x7C, 0x00,
+ 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00,
+ 0x00, 0x08, 0x36, 0x41, 0x00, 0x00,
+ 0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
+ 0x00, 0x41, 0x36, 0x08, 0x00, 0x00,
+ 0x02, 0x01, 0x02, 0x04, 0x02, 0x00,
+ 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0,
+ 0x90, 0x70, 0xE8, 0xA8, 0xE4, 0xC4,
+ 0xC4, 0xA0, 0xE4, 0xB0, 0xDC, 0xE4,
+ 0xFC, 0xFC, 0xFC, 0xFC, 0x3C, 0x3C,
+ 0xFC, 0xF8, 0xF0, 0xF0, 0xE0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC,
+ 0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00,
+ 0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E,
+ 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0,
+ 0xFC, 0xF6, 0xF7, 0xEF, 0xFF, 0x87,
+ 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F,
+ 0x1F, 0x1F, 0x1F, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x07, 0x1F, 0x1F, 0x19, 0x15,
+ 0xF7, 0x16, 0x1A, 0x1B, 0x16, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0C, 0x0C, 0x33, 0x33,
+ 0x33, 0x33, 0x33, 0x33, 0xC0, 0xC0,
+ 0x00, 0x00, 0x03, 0x03, 0xFF, 0xFF,
+ 0x03, 0x03, 0x00, 0x00, 0xC0, 0xC0,
+ 0x00, 0x00, 0x00, 0xFC, 0xFC, 0x03,
+ 0x03, 0x03, 0x03, 0x03, 0x03, 0xFC,
+ 0xFC, 0x00, 0x00, 0x00, 0xFC, 0xFC,
+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0x30, 0x30, 0xCC, 0xCC,
+ 0x03, 0x03, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F,
+ 0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00,
+ 0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F,
+ 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x03, 0x07, 0x07, 0x07, 0x07, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0x07, 0x07,
+ 0x03, 0x00, 0x00, 0x02, 0x04, 0x00,
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0x03, 0x03, 0x03,
+ 0x03, 0x03, 0x03, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x03, 0x03, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x03, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x03, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
diff --git a/users/drashna/process_records.c b/users/drashna/process_records.c
index 770219917e..2f79ad11cc 100644
--- a/users/drashna/process_records.c
+++ b/users/drashna/process_records.c
@@ -2,160 +2,120 @@
uint16_t copy_paste_timer;
-__attribute__ ((weak))
-bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
- return true;
-}
+__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;
-}
+__attribute__((weak)) bool process_record_secrets(uint16_t keycode, keyrecord_t *record) { return true; }
// Defines actions tor my global custom keycodes. Defined in drashna.h file
// Then runs the _keymap's record handier if not processed here
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
+ // If console is enabled, it will print the matrix position and status of each key pressed
#ifdef KEYLOGGER_ENABLE
-# if defined(KEYBOARD_ergodox_ez) || defined(KEYBOARD_keebio_iris_rev2)
- xprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.row, record->event.key.col, record->event.pressed);
-# else
- xprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed);
-# endif
-#endif //KEYLOGGER_ENABLE
+# if defined(KEYBOARD_ergodox_ez) || defined(KEYBOARD_keebio_iris_rev2)
+ xprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.row, record->event.key.col, record->event.pressed);
+# else
+ xprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed);
+# endif
+#endif // KEYLOGGER_ENABLE
switch (keycode) {
- case KC_QWERTY ... KC_CARPLAX:
- if (record->event.pressed) {
- set_single_persistent_default_layer(keycode - KC_QWERTY);
- }
- break;
+ case KC_QWERTY ... KC_WORKMAN:
+ if (record->event.pressed) {
+ uint8_t mods = mod_config(get_mods() | get_oneshot_mods());
+ if (!mods) {
+ set_single_persistent_default_layer(keycode - KC_QWERTY);
+ } else if (mods & MOD_MASK_SHIFT) {
+ set_single_persistent_default_layer(keycode - KC_QWERTY + 4);
+ } else if (mods & MOD_MASK_CTRL) {
+ set_single_persistent_default_layer(keycode - KC_QWERTY + 8);
+ }
+ }
+ break;
- case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader
- if (!record->event.pressed) {
- uint8_t temp_mod = get_mods();
- uint8_t temp_osm = get_oneshot_mods();
- clear_mods(); clear_oneshot_mods();
- send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), TAP_CODE_DELAY);
+ case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader
+ if (!record->event.pressed) {
+ uint8_t temp_mod = mod_config(get_mods());
+ uint8_t temp_osm = mod_config(get_oneshot_mods());
+ clear_mods();
+ clear_oneshot_mods();
+ send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), TAP_CODE_DELAY);
#ifndef MAKE_BOOTLOADER
- if ( ( temp_mod | temp_osm ) & MOD_MASK_SHIFT )
+ if ((temp_mod | temp_osm) & MOD_MASK_SHIFT)
#endif
- {
- #if defined(__arm__)
- send_string_with_delay_P(PSTR(":dfu-util"), TAP_CODE_DELAY);
- #elif defined(BOOTLOADER_DFU)
- send_string_with_delay_P(PSTR(":dfu"), TAP_CODE_DELAY);
- #elif defined(BOOTLOADER_HALFKAY)
- send_string_with_delay_P(PSTR(":teensy"), TAP_CODE_DELAY);
- #elif defined(BOOTLOADER_CATERINA)
- send_string_with_delay_P(PSTR(":avrdude"), TAP_CODE_DELAY);
- #endif // bootloader options
- }
- if ( ( temp_mod | temp_osm ) & MOD_MASK_CTRL) { send_string_with_delay_P(PSTR(" -j8 --output-sync"), TAP_CODE_DELAY); }
+ {
+ send_string_with_delay_P(PSTR(":flash"), TAP_CODE_DELAY);
+ }
+ if ((temp_mod | temp_osm) & MOD_MASK_CTRL) {
+ send_string_with_delay_P(PSTR(" -j8 --output-sync"), TAP_CODE_DELAY);
+ }
#ifdef RGB_MATRIX_SPLIT_RIGHT
- send_string_with_delay_P(PSTR(" RGB_MATRIX_SPLIT_RIGHT=yes OLED_DRIVER_ENABLE=no"), TAP_CODE_DELAY);
+ send_string_with_delay_P(PSTR(" RGB_MATRIX_SPLIT_RIGHT=yes"), TAP_CODE_DELAY);
+# ifndef OLED_DRIVER_ENABLE
+ send_string_with_delay_P(PSTR(" OLED_DRIVER_ENABLE=no"), TAP_CODE_DELAY);
+# endif
#endif
- send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), TAP_CODE_DELAY);
- }
-
- break;
-
- 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;
+ send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), TAP_CODE_DELAY);
+ }
- // These are a serious of gaming macros.
- // Only enables for the viterbi, basically,
- // to save on firmware space, since it's limited.
-#ifdef MACROS_ENABLED
- case KC_OVERWATCH: // Toggle's if we hit "ENTER" or "BACKSPACE" to input macros
- if (record->event.pressed) { userspace_config.is_overwatch ^= 1; eeconfig_update_user(userspace_config.raw); }
-#ifdef RGBLIGHT_ENABLE
- userspace_config.is_overwatch ? rgblight_mode_noeeprom(17) : rgblight_mode_noeeprom(18);
-#endif //RGBLIGHT_ENABLE
- break;
- case KC_SALT:
- return send_game_macro("Salt, salt, salt...", record, false);
- case KC_MORESALT:
- return send_game_macro("Please sir, can I have some more salt?!", record, false);
- case KC_SALTHARD:
- return send_game_macro("Your salt only makes me harder, and even more aggressive!", record, false);
- case KC_GOODGAME:
- return send_game_macro("Good game, everyone!", record, false);
- case KC_GLHF:
- return send_game_macro("Good luck, have fun!!!", record, false);
- case KC_SYMM:
- return send_game_macro("Left click to win!", record, false);
- case KC_JUSTGAME:
- return send_game_macro("It may be a game, but if you don't want to actually try, please go play AI, so that people that actually want to take the game seriously and \"get good\" have a place to do so without trolls like you throwing games.", record, false);
- case KC_TORB:
- return send_game_macro("That was positively riveting!", record, false);
- case KC_AIM:
- send_game_macro("That aim is absolutely amazing. It's almost like you're a machine!", record, true);
- return send_game_macro("Wait! That aim is TOO good! You're clearly using an aim hack! CHEATER!", record, false);
- case KC_C9:
- return send_game_macro("OMG!!! C9!!!", record, false);
- case KC_GGEZ:
- return send_game_macro("That was a fantastic game, though it was a bit easy. Try harder next time!", record, false);
-#endif // MACROS_ENABLED
+ break;
+ 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
+ case KC_DIABLO_CLEAR: // reset all Diablo timers, disabling them
#ifdef TAP_DANCE_ENABLE
- if (record->event.pressed) {
- uint8_t dtime;
- for (dtime = 0; dtime < 4; dtime++) {
- diablo_timer[dtime].key_time = diablo_times[0];
+ if (record->event.pressed) {
+ for (uint8_t index = 0; index < 4; index++) {
+ diablo_timer[index].key_interval = 0;
+ }
}
- }
-#endif // TAP_DANCE_ENABLE
- break;
+#endif // TAP_DANCE_ENABLE
+ break;
-
- case KC_CCCV: // One key copy/paste
- if(record->event.pressed){
- copy_paste_timer = timer_read();
+ 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
- register_code(KC_LCTL);
- tap_code(KC_C);
- unregister_code(KC_LCTL);
- } else { // Tap, paste
- register_code(KC_LCTL);
- tap_code(KC_V);
- unregister_code(KC_LCTL);
+ if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy
+ register_code(KC_LCTL);
+ tap_code(KC_C);
+ unregister_code(KC_LCTL);
+ } else { // Tap, paste
+ register_code(KC_LCTL);
+ tap_code(KC_V);
+ unregister_code(KC_LCTL);
+ }
}
- }
- break;
+ break;
#ifdef UNICODE_ENABLE
- case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻
- if (record->event.pressed) {
- send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B");
- }
- break;
- case UC_TABL: // ┬─┬ノ( º _ ºノ)
- if (record->event.pressed) {
- send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 30CE 0029");
- }
- break;
- case UC_SHRG: // ¯\_(ツ)_/¯
- if (record->event.pressed) {
- send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF");
- }
- break;
- case UC_DISA: // ಠ_ಠ
- if (record->event.pressed) {
- send_unicode_hex_string("0CA0 005F 0CA0");
- }
- break;
+ case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻
+ if (record->event.pressed) {
+ send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B");
+ }
+ break;
+ case UC_TABL: // ┬─┬ノ( º _ ºノ)
+ if (record->event.pressed) {
+ send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 30CE 0029");
+ }
+ break;
+ case UC_SHRG: // ¯\_(ツ)_/¯
+ if (record->event.pressed) {
+ send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF");
+ }
+ break;
+ case UC_DISA: // ಠ_ಠ
+ if (record->event.pressed) {
+ send_unicode_hex_string("0CA0 005F 0CA0");
+ }
+ break;
#endif
}
return process_record_keymap(keycode, record) &&
#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
- process_record_user_rgb(keycode, record) &&
-#endif // RGBLIGHT_ENABLE
- process_record_secrets(keycode, record);
+ process_record_user_rgb(keycode, record) &&
+#endif // RGBLIGHT_ENABLE
+ process_record_secrets(keycode, record);
}
diff --git a/users/drashna/process_records.h b/users/drashna/process_records.h
index 35adec84cc..cb7ec3ec40 100644
--- a/users/drashna/process_records.h
+++ b/users/drashna/process_records.h
@@ -2,55 +2,38 @@
#include "drashna.h"
#if defined(KEYMAP_SAFE_RANGE)
-# define PLACEHOLDER_SAFE_RANGE KEYMAP_SAFE_RANGE
+# define PLACEHOLDER_SAFE_RANGE KEYMAP_SAFE_RANGE
#else
-# define PLACEHOLDER_SAFE_RANGE SAFE_RANGE
+# define PLACEHOLDER_SAFE_RANGE SAFE_RANGE
#endif
enum userspace_custom_keycodes {
- VRSN = PLACEHOLDER_SAFE_RANGE, // Prints QMK Firmware and board info
- KC_QWERTY, // Sets default layer to QWERTY
- KC_COLEMAK, // Sets default layer to COLEMAK
- KC_DVORAK, // Sets default layer to DVORAK
- KC_WORKMAN, // Sets default layer to WORKMAN
- KC_NORMAN, // Sets default layer to NORMAN
- KC_MALTRON, // Sets default layer to MALTRON
- KC_EUCALYN, // Sets default layer to EUCALYN
- KC_CARPLAX, // Sets default layer to CARPLAX
- KC_DIABLO_CLEAR, // Clears all Diablo Timers
- KC_OVERWATCH, // Toggles game macro input mode (so in OW, it defaults to game chat)
- KC_SALT, // See drashna.c for details
- KC_MORESALT,
- KC_SALTHARD,
- KC_GOODGAME,
- KC_SYMM,
- KC_JUSTGAME,
- KC_GLHF,
- KC_TORB,
- KC_AIM,
- KC_C9,
- KC_GGEZ,
- KC_MAKE, // Run keyboard's customized make command
- KC_RGB_T, // Toggles RGB Layer Indication mode
- 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, // ಠ_ಠ
- NEW_SAFE_RANGE //use "NEWPLACEHOLDER for keymap specific codes
+ VRSN = PLACEHOLDER_SAFE_RANGE, // Prints QMK Firmware and board info
+ KC_QWERTY, // Sets default layer to QWERTY
+ KC_COLEMAK, // Sets default layer to COLEMAK
+ KC_DVORAK, // Sets default layer to DVORAK
+ KC_WORKMAN, // Sets default layer to WORKMAN
+ KC_DIABLO_CLEAR, // Clears all Diablo Timers
+ KC_MAKE, // Run keyboard's customized make command
+ 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, // ಠ_ಠ
+ NEW_SAFE_RANGE // use "NEWPLACEHOLDER for keymap specific codes
};
bool process_record_secrets(uint16_t keycode, keyrecord_t *record);
bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
-
-
#define LOWER MO(_LOWER)
#define RAISE MO(_RAISE)
#define ADJUST MO(_ADJUST)
@@ -74,10 +57,12 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
#define KC_RST KC_RESET
#ifdef SWAP_HANDS_ENABLE
-#define KC_C1R3 SH_TT
-#else // SWAP_HANDS_ENABLE
-#define KC_C1R3 KC_BSPC
-#endif // 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)
@@ -96,7 +81,7 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
#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_MEH OSM(MOD_MEH)
#define OS_HYPR OSM(MOD_HYPR)
#define ALT_APP ALT_T(KC_APP)
diff --git a/users/drashna/readme.md b/users/drashna/readme.md
index ffc60060f4..d98d1d0a6b 100644
--- a/users/drashna/readme.md
+++ b/users/drashna/readme.md
@@ -2,192 +2,14 @@
This is my personal userspace file. Most of my code exists here, as it's heavily shared.
-## Custom userspace handlers
+* [RGB Customization](readme_rgb.md)
+* [Diablo Tap Dancing](readme_tap_dance.md)
+* [Keymap Wrappers](readme_wrappers.md)
+* [Custom Function Handlers](readme_handlers.md)
+* [Secret Macros](readme_secrets.md)
+* [Custom Keycodes](readme_keycodes.md)
-Specifically QMK works by using customized handlers for everything. This allows for multiple levels of customization.
-
-`matrix_scan` calls `matrix_scan_quantum`, which alls `matrix_scan_kb`, which calls `matrix_scan_user`.
-`process_record` calls a bunch of stuff, but eventually calls `process_record_kb` which calls `process_record_user`
-The same goes for `matrix_init`, `layer_state_set`, `led_set`, and a few other functions.
-
-All (most) `_user` functions are handled here instead. To allow keyboard specific configuration, I've created `_keymap` functions that can be called by the keymap.c files instead.
-
-This allows for keyboard specific configuration while maintaining the ability to customize the board.
-
-My [Ergodox EZ Keymap](https://github.com/qmk/qmk_firmware/blob/master/layouts/community/ergodox/drashna/keymap.c#L297) is a good example of this, as it uses the LEDs as modifier indicators.
-
-## 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.
-
-Credit goes to @jola5 for first implementing this awesome idea.
-
-
-## Custom Keycodes
-
-Keycodes are defined in the drashna.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.
-
-Included is a custom macro for compiling my keyboards. This includes the bootloader target (`:teensy`, `:avrdude`, or `:dfu`), and keeps RGBLIGHT, AUDIO and/or FAUXCLICKY enabled, if it previously was (regardless of the rules file).
-
-This also includes a modified RESET keycode as well, that sets the underglow to red.
-
-## Layer Indication
-
-This uses the `layer_state_set_*` command to change the layer color, to indicate which layer it is on. This includes the default keymap, as well.
-
-Since this is done via userspace, it is the same between all systems.
-
-Additionally, there is a custom keycode to toggle layer indication. And all RGB keycodes disable layer indication by default, as well. This way, I can leave special effects doing when I want.
-
-Also. I use `rgblight_sethsv` since it works with animation modes (that support it).
-
-## Diablo Layer
-
-This layer has some special handling.
-
-When Tap Dances are enabled, this layer has the ability to "spam" keypresses.
-
-For instance, tapping the TD "1" twice causes the layer to hit "1" ever 1 second (appoximately). This is useful for auto-hotkeying skills (such as bone armor or devour).
-
-Tappind once disables this, and switching layers temporarily disables this, until you switch back to the layer.
-
-For critics that think this is cheating, search "diablo 3 num lock auto cast". This is just a simpler method, since I no longer own a normal (non QMK) numpad.
-
-## 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 defined in your `<name>.h` file to define the keycodes for the new macros.
-
-
-### .git/info/exclude
-
-```
-# git ls-files --others --exclude-from=.git/info/exclude
-# Lines that start with '#' are comments.
-# For a project mostly in C, the following would be a good set of
-# exclude patterns (uncomment them if you want to use them):
-# *.[oa]
-# *~
-/users/drashna/secrets.c
-/users/drashna/secrets.h
-```
-
-Then you can create these files:
-
-### secrets.c
-
-```c
-#include "drashna.h" // replace with your keymap's "h" file, or whatever file stores the keycodes
-
-#if (__has_include("secrets.h") && !defined(NO_SECRETS))
-#include "secrets.h"
-#else
-// `PROGMEM const char secret[][x]` may work better, but it takes up more space in the firmware
-// And I'm not familiar enough to know which is better or why...
-static const char * const secret[] = {
- "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_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
- send_string_with_delay(secret[keycode - KC_SECRET_1], MACRO_TIMER);
- }
- return false;
- break;
- }
- return true;
-}
-```
-
-### secrets.h
-
-```c
-static const char * const secrets[] = {
- "secret1",
- "secret2",
- "secret3",
- "secret4",
- "secret5"
-};
-```
-
-Replacing the strings with the codes that you need.
-
-### name.c
-
-In the `<name>.c` file, 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
- 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. To do so, add this block:
-
-```make
-ifneq ("$(wildcard $(USER_PATH)/secrets.c)","")
- SRC += secrets.c
-endif
-```
-
-Additionally, 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
-ifeq ($(strip $(NO_SECRETS)), yes)
- OPT_DEFS += -DNO_SECRETS
-endif
-```
-
-Then, if you run `make keyboard:name NO_SECRETS=yes`, it will default to the test strings in your `<name>.c` file, rather than reading from your file.
## Pro Micro Hacking
-Well, you can get the QMK DFU bootloader working on the ProMicro. But you need to change fuses.
-
-What worked to get into the firmware properly was:
-
-```
-Low: 0x5E High: 0xD9 Extended: 0xC3 Lock: 0x3F
-```
-
-The reason that there was some issues before, is that JTAG was still enabled, and using some of the pins that the keyboard uses. Disabling JTAG (either by fuse, or modifying the matrix code for splits fixes the issue).
-
-And for reference, if you want to go back to caterina, the default fuse settings I believe were:
-
-```
-Low: 0xFF High: 0xD8 Extended: 0xC3 Lock: 0x3F
-```
+See [this thread](https://www.reddit.com/r/olkb/comments/8sxgzb/replace_pro_micro_bootloader_with_qmk_dfu/) for details on how to flash QMK DFU to Pro Micros.
diff --git a/users/drashna/readme_handlers.md b/users/drashna/readme_handlers.md
new file mode 100644
index 0000000000..4abaf51473
--- /dev/null
+++ b/users/drashna/readme_handlers.md
@@ -0,0 +1,97 @@
+# Custom Userspace Function handlers
+
+Specifically QMK works by using customized handlers for everything. This allows for multiple levels of customization.
+
+`matrix_scan` calls `matrix_scan_quantum`, which calls `matrix_scan_kb`, which calls `matrix_scan_user`.
+`process_record` calls a bunch of stuff, but eventually calls `process_record_kb` which calls `process_record_user`
+The same goes for `matrix_init`, `layer_state_set`, `led_set`, and a few other functions.
+
+All (most) `_user` functions are handled here, in the userspace instead. To allow keyboard specific configuration, I've created `_keymap` functions that can be called by the keymap.c files instead.
+
+This allows for keyboard specific configuration while maintaining the ability to customize the board.
+
+My [Ergodox EZ Keymap](https://github.com/qmk/qmk_firmware/blob/master/layouts/community/ergodox/drashna/keymap.c) is a good example of this, as it uses the LEDs as modifier indicators.
+
+But for a list:
+
+```c
+__attribute__ ((weak))
+void matrix_init_keymap(void) {}
+
+void matrix_init_user(void) {
+ matrix_init_keymap();
+}
+
+__attribute__((weak))
+void keyboard_post_init_keymap(void){ }
+
+void keyboard_post_init_user(void){
+ keyboard_post_init_keymap();
+}
+
+__attribute__ ((weak))
+void matrix_scan_keymap(void) {}
+
+void matrix_scan_user(void) {
+ matrix_scan_keymap();
+}
+
+
+__attribute__ ((weak))
+bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
+ return true;
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ return process_record_keymap(keycode, record);
+}
+
+
+__attribute__ ((weak))
+layer_state_t layer_state_set_keymap (layer_state_t state) {
+ return state;
+}
+
+layer_state_t layer_state_set_user (layer_state_t state) {
+ return layer_state_set_keymap (state);
+}
+
+
+__attribute__ ((weak))
+void led_set_keymap(uint8_t usb_led) {}
+
+void led_set_user(uint8_t usb_led) {
+ led_set_keymap(usb_led);
+}
+
+
+__attribute__ ((weak))
+void suspend_power_down_keymap(void) {}
+
+void suspend_power_down_user(void) {
+ suspend_power_down_keymap();
+}
+
+
+__attribute__ ((weak))
+void suspend_wakeup_init_keymap(void) {}
+
+void suspend_wakeup_init_user(void) {
+ suspend_wakeup_init_keymap();
+}
+
+
+__attribute__ ((weak))
+void shutdown_keymap(void) {}
+
+void shutdown_user (void) {
+ shutdown_keymap();
+}
+
+__attribute__ ((weak))
+void eeconfig_init_keymap(void) {}
+
+void eeconfig_init_user(void) {
+ eeconfig_init_keymap();
+}
+```
diff --git a/users/drashna/readme_keycodes.md b/users/drashna/readme_keycodes.md
new file mode 100644
index 0000000000..f5e6fb271e
--- /dev/null
+++ b/users/drashna/readme_keycodes.md
@@ -0,0 +1,10 @@
+
+# Custom Keycodes
+
+Keycodes are defined in the drashna.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.
+
+Included is a custom macro for compiling my keyboards. This includes the bootloader target (`:teensy`, `:avrdude`, or `:dfu`), and keeps RGBLIGHT, AUDIO and/or FAUXCLICKY enabled, if it previously was (regardless of the rules file).
+
+This also includes a modified RESET keycode as well, that sets the underglow to red.
diff --git a/users/drashna/readme_rgb.md b/users/drashna/readme_rgb.md
new file mode 100644
index 0000000000..acf01b051e
--- /dev/null
+++ b/users/drashna/readme_rgb.md
@@ -0,0 +1,43 @@
+# Layer Indication Code
+
+At least for RGB Light, the `layer_state_set` function is used to detect the current highest layer, and change the underglow based on that layer.
+
+This works for both the regular layers, and for the default layers, too.
+
+I use the sethsv variants of the commands, so that different modes can be used, as well.
+
+RGB Matrix uses a custom, per board implementation, at the moment.
+
+# RGB Light Startup Animation
+
+On startup, if enabled, the board will cycle through the entire hue wheel, starting and ending on the default layer color.
+
+```c
+void keyboard_post_init_rgb(void) {
+#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_STARTUP_ANIMATION)
+ if (userspace_config.rgb_layer_change) { rgblight_enable_noeeprom(); }
+ if (rgblight_config.enable) {
+ layer_state_set_user(layer_state);
+ uint16_t old_hue = rgblight_config.hue;
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
+ for (uint16_t i = 255; i > 0; i--) {
+ rgblight_sethsv_noeeprom( ( i + old_hue) % 255, 255, 255);
+ matrix_scan();
+ wait_ms(10);
+ }
+ }
+#endif
+ layer_state_set_user(layer_state);
+}
+```
+
+This could probably benefit from some cleanup and better handling.
+
+
+# RGB Light Twinkling
+
+This enables random twinkling of the LEDs when typing.
+
+# RGB Light Mod Indicators
+
+Allows feedback of which mods (oneshot or otherwise) are enabled.
diff --git a/users/drashna/readme_secrets.md b/users/drashna/readme_secrets.md
new file mode 100644
index 0000000000..a9408dc2ef
--- /dev/null
+++ b/users/drashna/readme_secrets.md
@@ -0,0 +1,123 @@
+# 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 "drashna.h" // replace with your keymap's "h" file, or whatever file stores the keycodes
+
+#if (__has_include("secrets.h") && !defined(NO_SECRETS))
+#include "secrets.h"
+#else
+// `PROGMEM const char secret[][x]` may work better, but it takes up more space in the firmware
+// And I'm not familiar enough to know which is better or why...
+static const char * const secret[] = {
+ "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_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
+ send_string_with_delay(secret[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 `make keyboard:name 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/readme_tap_dance.md b/users/drashna/readme_tap_dance.md
new file mode 100644
index 0000000000..a61dd1f2b0
--- /dev/null
+++ b/users/drashna/readme_tap_dance.md
@@ -0,0 +1,119 @@
+# Diablo Tap Dances
+
+My [Tap Dance](https://github.com/qmk/qmk_firmware/blob/master/users/drashna/tap_dances.c) file includes the tap dance declarations, and everything needed for them.
+
+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.
+qk_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(qk_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 >= (sizeof(diablo_times) / sizeof(uint8_t) ) ) {
+ 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/readme_wrappers.md b/users/drashna/readme_wrappers.md
new file mode 100644
index 0000000000..fd62ff1609
--- /dev/null
+++ b/users/drashna/readme_wrappers.md
@@ -0,0 +1,11 @@
+## 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.
diff --git a/users/drashna/rgb_stuff.c b/users/drashna/rgb_stuff.c
index 7d364fa686..52ec61c22d 100644
--- a/users/drashna/rgb_stuff.c
+++ b/users/drashna/rgb_stuff.c
@@ -4,209 +4,231 @@
#if defined(RGBLIGHT_ENABLE)
extern rgblight_config_t rgblight_config;
-bool has_initialized;
+bool has_initialized;
+
+void rgblight_sethsv_default_helper(uint8_t index) { rgblight_sethsv_at(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, index); }
+#endif // RGBLIGHT_ENABLE
+
+#if defined(RGB_MATRIX_ENABLE)
+static uint32_t hypno_timer;
+# if defined(SPLIT_KEYBOARD) || defined(KEYBOARD_ergodox_ez) || defined(KEYBOARD_crkbd)
+# define RGB_MATRIX_REST_MODE RGB_MATRIX_CYCLE_OUT_IN_DUAL
+# else
+# define RGB_MATRIX_REST_MODE RGB_MATRIX_CYCLE_OUT_IN
+# endif
#endif
+/* Custom indicators for modifiers.
+ * This allows for certain lights to be lit up, based on what mods are active, giving some visual feedback.
+ * This is especially useful for One Shot Mods, since it's not always obvious if they're still lit up.
+ */
#ifdef RGBLIGHT_ENABLE
-void rgblight_sethsv_default_helper(uint8_t index) {
- rgblight_sethsv_at(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, index);
-}
-#endif // RGBLIGHT_ENABLE
-
-#ifdef INDICATOR_LIGHTS
+# ifdef INDICATOR_LIGHTS
void set_rgb_indicators(uint8_t this_mod, uint8_t this_led, uint8_t this_osm) {
- if (userspace_config.rgb_layer_change && biton32(layer_state) == 0) {
- if ( (this_mod | this_osm) & MOD_MASK_SHIFT || this_led & (1<<USB_LED_CAPS_LOCK) ) {
- #ifdef SHFT_LED1
+ if (userspace_config.rgb_layer_change && get_highest_layer(layer_state) == 0) {
+ if ((this_mod | this_osm) & MOD_MASK_SHIFT || this_led & (1 << USB_LED_CAPS_LOCK)) {
+# ifdef SHFT_LED1
rgblight_sethsv_at(120, 255, 255, SHFT_LED1);
- #endif // SHFT_LED1
- #ifdef SHFT_LED2
+# endif // SHFT_LED1
+# ifdef SHFT_LED2
rgblight_sethsv_at(120, 255, 255, SHFT_LED2);
- #endif // SHFT_LED2
+# endif // SHFT_LED2
} else {
- #ifdef SHFT_LED1
+# ifdef SHFT_LED1
rgblight_sethsv_default_helper(SHFT_LED1);
- #endif // SHFT_LED1
- #ifdef SHFT_LED2
+# endif // SHFT_LED1
+# ifdef SHFT_LED2
rgblight_sethsv_default_helper(SHFT_LED2);
- #endif // SHFT_LED2
+# endif // SHFT_LED2
}
- if ( (this_mod | this_osm) & MOD_MASK_CTRL) {
- #ifdef CTRL_LED1
+ if ((this_mod | this_osm) & MOD_MASK_CTRL) {
+# ifdef CTRL_LED1
rgblight_sethsv_at(0, 255, 255, CTRL_LED1);
- #endif // CTRL_LED1
- #ifdef CTRL_LED2
+# endif // CTRL_LED1
+# ifdef CTRL_LED2
rgblight_sethsv_at(0, 255, 255, CTRL_LED2);
- #endif // CTRL_LED2
+# endif // CTRL_LED2
} else {
- #ifdef CTRL_LED1
+# ifdef CTRL_LED1
rgblight_sethsv_default_helper(CTRL_LED1);
- #endif // CTRL_LED1
- #ifdef CTRL_LED2
+# endif // CTRL_LED1
+# ifdef CTRL_LED2
rgblight_sethsv_default_helper(CTRL_LED2);
- #endif // CTRL_LED2
+# endif // CTRL_LED2
}
- if ( (this_mod | this_osm) & MOD_MASK_GUI) {
- #ifdef GUI_LED1
+ if ((this_mod | this_osm) & MOD_MASK_GUI) {
+# ifdef GUI_LED1
rgblight_sethsv_at(51, 255, 255, GUI_LED1);
- #endif // GUI_LED1
- #ifdef GUI_LED2
+# endif // GUI_LED1
+# ifdef GUI_LED2
rgblight_sethsv_at(51, 255, 255, GUI_LED2);
- #endif // GUI_LED2
+# endif // GUI_LED2
} else {
- #ifdef GUI_LED1
+# ifdef GUI_LED1
rgblight_sethsv_default_helper(GUI_LED1);
- #endif // GUI_LED1
- #ifdef GUI_LED2
+# endif // GUI_LED1
+# ifdef GUI_LED2
rgblight_sethsv_default_helper(GUI_LED2);
- #endif // GUI_LED2
+# endif // GUI_LED2
}
- if ( (this_mod | this_osm) & MOD_MASK_ALT) {
- #ifdef ALT_LED1
+ if ((this_mod | this_osm) & MOD_MASK_ALT) {
+# ifdef ALT_LED1
rgblight_sethsv_at(240, 255, 255, ALT_LED1);
- #endif // ALT_LED1
- #ifdef GUI_LED2
+# endif // ALT_LED1
+# ifdef GUI_LED2
rgblight_sethsv_at(240, 255, 255, ALT_LED2);
- #endif // GUI_LED2
+# endif // GUI_LED2
} else {
- #ifdef GUI_LED1
+# ifdef GUI_LED1
rgblight_sethsv_default_helper(ALT_LED1);
- #endif // GUI_LED1
- #ifdef GUI_LED2
+# endif // GUI_LED1
+# ifdef GUI_LED2
rgblight_sethsv_default_helper(ALT_LED2);
- #endif // GUI_LED2
+# endif // GUI_LED2
}
}
}
+/* Function for the indicators */
void matrix_scan_indicator(void) {
if (has_initialized) {
set_rgb_indicators(get_mods(), host_keyboard_leds(), get_oneshot_mods());
}
}
-#endif //INDICATOR_LIGHTS
+# endif // INDICATOR_LIGHTS
-#ifdef RGBLIGHT_TWINKLE
+# ifdef RGBLIGHT_TWINKLE
static rgblight_fadeout lights[RGBLED_NUM];
-__attribute__ ((weak))
-bool rgblight_twinkle_is_led_used_keymap(uint8_t index) { return false; }
+__attribute__((weak)) bool rgblight_twinkle_is_led_used_keymap(uint8_t index) { return false; }
+/* This function checks for used LEDs. This way, collisions don't occur and cause weird rendering */
bool rgblight_twinkle_is_led_used(uint8_t index) {
switch (index) {
-#ifdef INDICATOR_LIGHTS
-#ifdef SHFT_LED1
+# ifdef INDICATOR_LIGHTS
+# ifdef SHFT_LED1
case SHFT_LED1:
return true;
-#endif //SHFT_LED1
-#ifdef SHFT_LED2
+# endif // SHFT_LED1
+# ifdef SHFT_LED2
case SHFT_LED2:
return true;
-#endif //SHFT_LED2
-#ifdef CTRL_LED1
+# endif // SHFT_LED2
+# ifdef CTRL_LED1
case CTRL_LED1:
return true;
-#endif //CTRL_LED1
-#ifdef CTRL_LED2
+# endif // CTRL_LED1
+# ifdef CTRL_LED2
case CTRL_LED2:
return true;
-#endif //CTRL_LED2
-#ifdef GUI_LED1
+# endif // CTRL_LED2
+# ifdef GUI_LED1
case GUI_LED1:
return true;
-#endif //GUI_LED1
-#ifdef GUI_LED2
+# endif // GUI_LED1
+# ifdef GUI_LED2
case GUI_LED2:
return true;
-#endif //GUI_LED2
-#ifdef ALT_LED1
+# endif // GUI_LED2
+# ifdef ALT_LED1
case ALT_LED1:
return true;
-#endif //ALT_LED1
-#ifdef ALT_LED2
+# endif // ALT_LED1
+# ifdef ALT_LED2
case ALT_LED2:
return true;
-#endif //ALT_LED2
-#endif //INDICATOR_LIGHTS
+# endif // ALT_LED2
+# endif // INDICATOR_LIGHTS
default:
return rgblight_twinkle_is_led_used_keymap(index);
- }
+ }
}
-void scan_rgblight_fadeout(void) { // Don't effing change this function .... rgblight_sethsv is supppppper intensive
+/* Handler for fading/twinkling effect */
+void scan_rgblight_fadeout(void) { // Don't effing change this function .... rgblight_sethsv is supppppper intensive
bool litup = false;
- for (uint8_t light_index = 0 ; light_index < RGBLED_NUM ; ++light_index ) {
+ for (uint8_t light_index = 0; light_index < RGBLED_NUM; ++light_index) {
if (lights[light_index].enabled && timer_elapsed(lights[light_index].timer) > 10) {
- rgblight_fadeout *light = &lights[light_index];
- litup = true;
+ rgblight_fadeout *light = &lights[light_index];
+ litup = true;
- if (light->life) {
- light->life -= 1;
- if (biton32(layer_state) == 0) {
- sethsv(light->hue + rand() % 0xF, 255, light->life, (LED_TYPE *)&led[light_index]);
- }
- light->timer = timer_read();
- }
- else {
- if (light->enabled && biton32(layer_state) == 0) {
- rgblight_sethsv_default_helper(light_index);
+ if (light->life) {
+ light->life -= 1;
+ if (get_highest_layer(layer_state) == 0) {
+ sethsv(light->hue + rand() % 0xF, 255, light->life, (LED_TYPE *)&led[light_index]);
+ }
+ light->timer = timer_read();
+ } else {
+ if (light->enabled && get_highest_layer(layer_state) == 0) {
+ rgblight_sethsv_default_helper(light_index);
+ }
+ litup = light->enabled = false;
}
- litup = light->enabled = false;
- }
}
}
- if (litup && biton32(layer_state) == 0) {
+ if (litup && get_highest_layer(layer_state) == 0) {
rgblight_set();
}
}
+/* Triggers a LED to fade/twinkle.
+ * This function handles the selection of the LED and prepres for it to be used.
+ */
void start_rgb_light(void) {
-
uint8_t indices[RGBLED_NUM];
- uint8_t indices_count = 0;
- uint8_t min_life = 0xFF;
+ uint8_t indices_count = 0;
+ uint8_t min_life = 0xFF;
uint8_t min_life_index = -1;
- for (uint8_t index = 0 ; index < RGBLED_NUM ; ++index ) {
- if (rgblight_twinkle_is_led_used(index)) { continue; }
- if (lights[index].enabled) {
- if (min_life_index == -1 ||
- lights[index].life < min_life)
- {
- min_life = lights[index].life;
- min_life_index = index;
+ for (uint8_t index = 0; index < RGBLED_NUM; ++index) {
+ if (rgblight_twinkle_is_led_used(index)) {
+ continue;
+ }
+ if (lights[index].enabled) {
+ if (min_life_index == -1 || lights[index].life < min_life) {
+ min_life = lights[index].life;
+ min_life_index = index;
+ }
+ continue;
}
- continue;
- }
- indices[indices_count] = index;
- ++indices_count;
+ indices[indices_count] = index;
+ ++indices_count;
}
uint8_t light_index;
if (!indices_count) {
light_index = min_life_index;
- }
- else {
- light_index = indices[rand() % indices_count];
+ } else {
+ light_index = indices[rand() % indices_count];
}
rgblight_fadeout *light = &lights[light_index];
- light->enabled = true;
- light->timer = timer_read();
- light->life = 0xC0 + rand() % 0x40;
+ light->enabled = true;
+ light->timer = timer_read();
+ light->life = 0xC0 + rand() % 0x40;
light->hue = rgblight_config.hue + (rand() % 0xB4) - 0x54;
rgblight_sethsv_at(light->hue, 255, light->life, light_index);
}
-#endif
-
+# endif
+#endif // RGBLIGHT_ENABLE
bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) {
+ uint16_t temp_keycode = keycode;
+ // Filter out the actual keycode from MT and LT keys.
if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) {
- keycode = keycode & 0xFF;
+ temp_keycode &= 0xFF;
+ }
+
+#if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
+ hypno_timer = timer_read32();
+ if (userspace_config.rgb_matrix_idle_anim && rgb_matrix_get_mode() == RGB_MATRIX_REST_MODE) {
+ rgb_matrix_mode_noeeprom(RGB_MATRIX_TYPING_HEATMAP);
}
- switch (keycode) {
+#endif
+
+ switch (temp_keycode) {
#ifdef RGBLIGHT_TWINKLE
case KC_A ... KC_SLASH:
case KC_F1 ... KC_F12:
@@ -214,133 +236,214 @@ bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) {
case KC_KP_SLASH ... KC_KP_DOT:
case KC_F13 ... KC_F24:
case KC_AUDIO_MUTE ... KC_MEDIA_REWIND:
- if (record->event.pressed) { start_rgb_light(); }
- return true; break;
-#endif // RGBLIGHT_TWINKLE
+ if (record->event.pressed) {
+ start_rgb_light();
+ }
+ break;
+#endif // RGBLIGHT_TWINKLE
case KC_RGB_T: // This allows me to use underglow as layer indication, or as normal
#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
if (record->event.pressed) {
userspace_config.rgb_layer_change ^= 1;
- xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change);
+ dprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change);
eeconfig_update_user(userspace_config.raw);
if (userspace_config.rgb_layer_change) {
- layer_state_set(layer_state); // This is needed to immediately set the layer color (looks better)
+ layer_state_set(layer_state); // This is needed to immediately set the layer color (looks better)
}
}
-#endif // RGBLIGHT_ENABLE
- return false; break;
+#endif // RGBLIGHT_ENABLE
+ break;
+ case RGB_IDL: // This allows me to use underglow as layer indication, or as normal
+#if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
+ if (record->event.pressed) {
+ userspace_config.rgb_matrix_idle_anim ^= 1;
+ dprintf("RGB Matrix Idle Animation [EEPROM]: %u\n", userspace_config.rgb_matrix_idle_anim);
+ eeconfig_update_user(userspace_config.raw);
+ if (userspace_config.rgb_matrix_idle_anim) {
+ rgb_matrix_mode_noeeprom(RGB_MATRIX_TYPING_HEATMAP);
+ }
+ }
+#endif
+ break;
+ case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // quantum_keycodes.h L400 for definitions
+ if (record->event.pressed) {
+ bool is_eeprom_updated = false;
#ifdef RGBLIGHT_ENABLE
- case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // quantum_keycodes.h L400 for definitions
- if (record->event.pressed) { //This disables layer indication, as it's assumed that if you're changing this ... you want that disabled
+ // 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;
- xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change);
+ dprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change);
+ is_eeprom_updated = true;
+ }
+#endif
+#if defined(RGB_MATRIX_ENABLE) && 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(userspace_config.raw);
}
}
- return true; break;
-#endif // RGBLIGHT_ENABLE
- }
+ break;
+ }
return true;
}
-
-
void keyboard_post_init_rgb(void) {
-#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_STARTUP_ANIMATION)
- if (userspace_config.rgb_layer_change) { rgblight_enable_noeeprom(); }
+#if defined(RGBLIGHT_ENABLE)
+# if defined(RGBLIGHT_STARTUP_ANIMATION)
+ bool is_enabled = rgblight_config.enable;
+ if (userspace_config.rgb_layer_change) {
+ rgblight_enable_noeeprom();
+ }
if (rgblight_config.enable) {
layer_state_set_user(layer_state);
uint16_t old_hue = rgblight_config.hue;
rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
for (uint16_t i = 255; i > 0; i--) {
- rgblight_sethsv_noeeprom( ( i + old_hue) % 255, 255, 255);
+ rgblight_sethsv_noeeprom((i + old_hue) % 255, 255, 255);
matrix_scan();
wait_ms(10);
}
}
-#endif
+ if (!is_enabled) {
+ rgblight_disable_noeeprom();
+ }
+
+# endif
layer_state_set_user(layer_state);
+#endif
+#if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
+ if (userspace_config.rgb_matrix_idle_anim) {
+ rgb_matrix_mode_noeeprom(RGB_MATRIX_REST_MODE);
+ }
+#endif
}
void matrix_scan_rgb(void) {
-#ifdef RGBLIGHT_TWINKLE
+#ifdef RGBLIGHT_ENABLE
+# ifdef RGBLIGHT_TWINKLE
scan_rgblight_fadeout();
-#endif // RGBLIGHT_ENABLE
+# endif // RGBLIGHT_ENABLE
-#ifdef INDICATOR_LIGHTS
+# ifdef INDICATOR_LIGHTS
matrix_scan_indicator();
+# endif
#endif
+#if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
+ if (userspace_config.rgb_matrix_idle_anim && rgb_matrix_get_mode() == RGB_MATRIX_TYPING_HEATMAP && timer_elapsed32(hypno_timer) > 15000) {
+ rgb_matrix_mode_noeeprom(RGB_MATRIX_REST_MODE);
+ }
+#endif
}
+#ifdef RGBLIGHT_ENABLE
+void rgblight_set_hsv_and_mode(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode) {
+ rgblight_sethsv_noeeprom(hue, sat, val);
+ wait_us(175); // Add a slight delay between color and mode to ensure it's processed correctly
+ rgblight_mode_noeeprom(mode);
+}
+#endif
layer_state_t layer_state_set_rgb(layer_state_t state) {
#ifdef RGBLIGHT_ENABLE
if (userspace_config.rgb_layer_change) {
- switch (biton32(state)) {
+ switch (get_highest_layer(state)) {
case _MACROS:
- rgblight_sethsv_noeeprom_orange();
- userspace_config.is_overwatch ? rgblight_mode_noeeprom(RGBLIGHT_MODE_SNAKE + 2) : rgblight_mode_noeeprom(RGBLIGHT_MODE_SNAKE + 3);
+ rgblight_set_hsv_and_mode(HSV_ORANGE, userspace_config.is_overwatch ? RGBLIGHT_MODE_SNAKE + 2 : RGBLIGHT_MODE_SNAKE + 3);
break;
case _MEDIA:
- rgblight_sethsv_noeeprom_chartreuse();
- rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 1);
+ rgblight_set_hsv_and_mode(HSV_CHARTREUSE, RGBLIGHT_MODE_KNIGHT + 1);
break;
case _GAMEPAD:
- rgblight_sethsv_noeeprom_orange();
- rgblight_mode_noeeprom(RGBLIGHT_MODE_SNAKE + 2);
+ rgblight_set_hsv_and_mode(HSV_ORANGE, RGBLIGHT_MODE_SNAKE + 2);
break;
case _DIABLO:
- rgblight_sethsv_noeeprom_red();
- rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3);
+ rgblight_set_hsv_and_mode(HSV_RED, RGBLIGHT_MODE_BREATHING + 3);
break;
case _RAISE:
- rgblight_sethsv_noeeprom_yellow();
- rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3);
+ rgblight_set_hsv_and_mode(HSV_YELLOW, RGBLIGHT_MODE_BREATHING + 3);
break;
case _LOWER:
- rgblight_sethsv_noeeprom_green();
- rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3);
+ rgblight_set_hsv_and_mode(HSV_GREEN, RGBLIGHT_MODE_BREATHING + 3);
break;
case _ADJUST:
- rgblight_sethsv_noeeprom_red();
- rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2);
+ rgblight_set_hsv_and_mode(HSV_RED, RGBLIGHT_MODE_KNIGHT + 2);
break;
- default: // for any other layers, or the default layer
- switch (biton32(default_layer_state)) {
+ default: // for any other layers, or the default layer
+ {
+ uint8_t mode = get_highest_layer(state) == _MODS ? RGBLIGHT_MODE_BREATHING : RGBLIGHT_MODE_STATIC_LIGHT;
+ switch (get_highest_layer(default_layer_state)) {
case _COLEMAK:
- rgblight_sethsv_noeeprom_magenta(); break;
+ rgblight_set_hsv_and_mode(HSV_MAGENTA, mode);
+ break;
case _DVORAK:
- rgblight_sethsv_noeeprom_springgreen(); break;
+ rgblight_set_hsv_and_mode(HSV_SPRINGGREEN, mode);
+ break;
case _WORKMAN:
- rgblight_sethsv_noeeprom_goldenrod(); break;
+ rgblight_set_hsv_and_mode(HSV_GOLDENROD, mode);
+ break;
case _NORMAN:
- rgblight_sethsv_noeeprom_coral(); break;
+ rgblight_set_hsv_and_mode(HSV_CORAL, mode);
+ break;
case _MALTRON:
- rgblight_sethsv_noeeprom_yellow(); break;
+ rgblight_set_hsv_and_mode(HSV_YELLOW, mode);
+ break;
case _EUCALYN:
- rgblight_sethsv_noeeprom_pink(); break;
+ rgblight_set_hsv_and_mode(HSV_PINK, mode);
+ break;
case _CARPLAX:
- rgblight_sethsv_noeeprom_blue(); break;
+ rgblight_set_hsv_and_mode(HSV_BLUE, mode);
+ break;
default:
- rgblight_sethsv_noeeprom_cyan(); break;
+ rgblight_set_hsv_and_mode(HSV_CYAN, mode);
+ break;
}
- biton32(state) == _MODS ? rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING) : rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); // if _MODS layer is on, then breath to denote it
break;
+ }
}
}
-#endif // RGBLIGHT_ENABLE
+#endif // RGBLIGHT_ENABLE
return state;
}
#ifdef RGB_MATRIX_ENABLE
+# include "lib/lib8tion/lib8tion.h"
extern led_config_t g_led_config;
-void rgb_matrix_layer_helper (uint8_t red, uint8_t green, uint8_t blue, uint8_t led_type) {
- for (int i = 0; i < DRIVER_LED_TOTAL; i++) {
- if (HAS_FLAGS(g_led_config.flags[i], led_type)) {
- rgb_matrix_set_color( i, red, green, blue );
+
+void rgb_matrix_layer_helper(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode, uint8_t speed, uint8_t led_type) {
+ HSV hsv = {hue, sat, val};
+ if (hsv.v > rgb_matrix_config.hsv.v) {
+ hsv.v = rgb_matrix_config.hsv.v;
+ }
+
+ switch (mode) {
+ case 1: // breathing
+ {
+ uint16_t time = scale16by8(g_rgb_counters.tick, speed / 8);
+ hsv.v = scale8(abs8(sin8(time) - 128) * 2, hsv.v);
+ RGB rgb = hsv_to_rgb(hsv);
+ for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) {
+ if (HAS_FLAGS(g_led_config.flags[i], led_type)) {
+ rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
+ }
+ }
+ break;
+ }
+ default: // Solid Color
+ {
+ RGB rgb = hsv_to_rgb(hsv);
+ for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) {
+ if (HAS_FLAGS(g_led_config.flags[i], led_type)) {
+ rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
+ }
+ }
+ break;
}
}
}
diff --git a/users/drashna/rgb_stuff.h b/users/drashna/rgb_stuff.h
index f5bbd0f3b5..50b73c1c3c 100644
--- a/users/drashna/rgb_stuff.h
+++ b/users/drashna/rgb_stuff.h
@@ -1,23 +1,32 @@
#pragma once
#include "quantum.h"
#ifdef RGB_MATRIX_ENABLE
- #include "rgb_matrix.h"
+# include "rgb_matrix.h"
#endif
+#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_TWINKLE)
typedef struct {
- bool enabled;
- uint8_t hue;
+ bool enabled;
+ uint8_t hue;
uint16_t timer;
- uint8_t life;
+ uint8_t life;
} rgblight_fadeout;
+#endif
-bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record);
-void scan_rgblight_fadeout(void);
-void keyboard_post_init_rgb(void);
-void matrix_scan_rgb(void);
+bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record);
+void keyboard_post_init_rgb(void);
+void matrix_scan_rgb(void);
layer_state_t layer_state_set_rgb(layer_state_t state);
layer_state_t default_layer_state_set_rgb(layer_state_t state);
+
+#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_TWINKLE)
+void scan_rgblight_fadeout(void);
+#endif
+#if defined(RGBLIGHT_ENABLE)
void rgblight_sethsv_default_helper(uint8_t index);
-void rgb_matrix_set_color_all( uint8_t red, uint8_t green, uint8_t blue );
+#endif
-void rgb_matrix_layer_helper (uint8_t red, uint8_t green, uint8_t blue, uint8_t led_type);
+#ifdef RGB_MATRIX_ENABLE
+void rgb_matrix_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
+void rgb_matrix_layer_helper(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode, uint8_t speed, uint8_t led_type);
+#endif
diff --git a/users/drashna/rgblight_breathe_table.h b/users/drashna/rgblight_breathe_table.h
index 05d347fcd3..4c6ae38faa 100644
--- a/users/drashna/rgblight_breathe_table.h
+++ b/users/drashna/rgblight_breathe_table.h
@@ -1,9 +1,10 @@
#ifndef RGBLIGHT_EFFECT_BREATHE_TABLE
#define RGBLIGHT_EFFECT_BREATHE_TABLE
+// clang-format off
const uint8_t rgblight_effect_breathe_table[] PROGMEM = {
- /* #define RGBLIGHT_EFFECT_BREATHE_CENTER 0.00 */
- /* #define RGBLIGHT_EFFECT_BREATHE_MAX 255 */
+/* #define RGBLIGHT_EFFECT_BREATHE_CENTER 0.00 */
+/* #define RGBLIGHT_EFFECT_BREATHE_MAX 255 */
#if RGBLIGHT_BREATHE_TABLE_SIZE == 256
0x44, 0x45, 0x47, 0x48, 0x4a, 0x4b, 0x4c, 0x4e,
@@ -110,7 +111,8 @@ const uint8_t rgblight_effect_breathe_table[] PROGMEM = {
0x4e, 0x48
#endif /* 64 bytes table */
};
+// clang-format on
-static const int table_scale = 256/sizeof(rgblight_effect_breathe_table);
+static const int table_scale = 256 / sizeof(rgblight_effect_breathe_table);
#endif /* RGBLIGHT_EFFECT_BREATHE_TABLE */
diff --git a/users/drashna/rules.mk b/users/drashna/rules.mk
index cdb9e54360..882857fc86 100644
--- a/users/drashna/rules.mk
+++ b/users/drashna/rules.mk
@@ -1,10 +1,16 @@
SRC += drashna.c \
process_records.c
-LINK_TIME_OPTIMIZATION_ENABLE = yes
+LTO_ENABLE = yes
+SPACE_CADET_ENABLE = no
-ifneq ("$(wildcard $(USER_PATH)/secrets.c)","")
- SRC += secrets.c
+ifneq ($(strip $(NO_SECRETS)), yes)
+ ifneq ("$(wildcard $(USER_PATH)/secrets.c)","")
+ SRC += secrets.c
+ endif
+ ifeq ($(strip $(NO_SECRETS)), lite)
+ OPT_DEFS += -DNO_SECRETS
+ endif
endif
ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
@@ -13,9 +19,7 @@ endif
-ifeq ($(strip $(NO_SECRETS)), yes)
- OPT_DEFS += -DNO_SECRETS
-endif
+
ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
SRC += rgb_stuff.c
@@ -39,10 +43,6 @@ ifneq ($(strip $(RGB_MATRIX_ENABLE)), no)
endif
-ifeq ($(strip $(MACROS_ENABLED)), yes)
- OPT_DEFS += -DMACROS_ENABLED
-endif
-
ifdef CONSOLE_ENABLE
ifeq ($(strip $(KEYLOGGER_ENABLE)), yes)
OPT_DEFS += -DKEYLOGGER_ENABLE
@@ -52,3 +52,10 @@ endif
ifeq ($(strip $(MAKE_BOOTLOADER)), yes)
OPT_DEFS += -DMAKE_BOOTLOADER
endif
+
+# At least until build.mk or the like drops, this is here to prevent
+# VUSB boards from enabling NKRO, as they do not support it. Ideally
+# this should be handled per keyboard, but until that happens ...
+ifeq ($(strip $(PROTOCOL)), VUSB)
+ NKRO_ENABLE = no
+endif \ No newline at end of file
diff --git a/users/drashna/send_unicode.h b/users/drashna/send_unicode.h
deleted file mode 100644
index 743abc58b4..0000000000
--- a/users/drashna/send_unicode.h
+++ /dev/null
@@ -1,71 +0,0 @@
-#pragma once
-
-#include "quantum.h"
-
-void send_unicode_hex_string(const char* str);
-
-/* use X(n) to call the */
-#ifdef UNICODEMAP_ENABLE
-enum unicode_name {
- THINK, // thinking face 🤔
- GRIN, // grinning face 😊
- SMRK, // smirk 😏
- WEARY, // good shit 😩
- UNAMU, // unamused 😒
-
- SNEK, // snke 🐍
- PENGUIN, // 🐧
- DRAGON, // 🐉
- MONKEY, // 🐒
- CHICK, // 🐥
- BOAR, // 🐗
-
- OKOK, // 👌
- EFFU, // 🖕
- INUP, // 👆
- THUP, // 👍
- THDN, // 👎
-
- BBB, // dat B 🅱
- POO, // poop 💩
- HUNDR, // 100 💯
- EGGPL, // EGGPLANT 🍆
- WATER, // wet 💦
- TUMBLER, // 🥃
-
- LIT, // fire 🔥
- BANG, // ‽
- IRONY, // ⸮
- DEGREE // °
-};
-
-
-const uint32_t PROGMEM unicode_map[] = {
- [THINK] = 0x1F914,
- [GRIN] = 0x1F600,
- [BBB] = 0x1F171,
- [POO] = 0x1F4A9,
- [HUNDR] = 0x1F4AF,
- [SMRK] = 0x1F60F,
- [WEARY] = 0x1F629,
- [EGGPL] = 0x1F346,
- [WATER] = 0x1F4A6,
- [LIT] = 0x1F525,
- [UNAMU] = 0x1F612,
- [SNEK] = 0x1F40D,
- [PENGUIN] = 0x1F427,
- [BOAR] = 0x1F417,
- [MONKEY] = 0x1F412,
- [CHICK] = 0x1F425,
- [DRAGON] = 0x1F409,
- [OKOK] = 0x1F44C,
- [EFFU] = 0x1F595,
- [INUP] = 0x1F446,
- [THDN] = 0x1F44E,
- [THUP] = 0x1F44D,
- [TUMBLER] = 0x1F943,
- [BANG] = 0x0203D,
- [IRONY] = 0x02E2E,
- [DEGREE] = 0x000B0
- };
-#endif // UNICODEMAP_ENABLE
diff --git a/users/drashna/tap_dances.c b/users/drashna/tap_dances.c
index 18ca96e187..65019ab751 100644
--- a/users/drashna/tap_dances.c
+++ b/users/drashna/tap_dances.c
@@ -1,65 +1,56 @@
#include "tap_dances.h"
+#define NUM_OF_DIABLO_KEYS 4
+// define diablo macro timer variables
+diablo_timer_t diablo_timer[NUM_OF_DIABLO_KEYS];
-//define diablo macro timer variables
-diablo_timer_t diablo_timer[4];
-
-uint8_t diablo_times[] = { 0, 0, 1, 3, 5, 10, 30 };
-
-// has the correct number of seconds elapsed (as defined by diablo_times)
-bool check_dtimer(uint8_t dtimer) { return (timer_elapsed(diablo_timer[dtimer].key_time) < (diablo_timer[dtimer].timer * 1000)) ? false : true; };
+// 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};
// Cycle through the times for the macro, starting at 0, for disabled.
-// Max of six values, so don't exceed
void diablo_tapdance_master(qk_tap_dance_state_t *state, void *user_data) {
- int index = (int)user_data;
- if (state->count >= 7) {
- diablo_timer[index].key_time = diablo_times[0];
+ 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 >= (sizeof(diablo_times) / sizeof(uint8_t))) {
+ diablo_timer[diablo_keys->index].key_interval = 0;
reset_tap_dance(state);
- } else {
- diablo_timer[index].key_time = diablo_times[state->count];
+ } 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];
}
}
-// One funtion to rule them all!!
-#define ACTION_TAP_DANCE_DIABLO(arg) { \
+// 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 *)arg, \
+ .user_data = (void *)&((diable_keys_t) { index, keycode }), \
}
+// clang-format on
-//Tap Dance Definitions
+// Tap Dance Definitions, sets the index and the keycode.
qk_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),
- [TD_D3_2] = ACTION_TAP_DANCE_DIABLO(1),
- [TD_D3_3] = ACTION_TAP_DANCE_DIABLO(2),
- [TD_D3_4] = ACTION_TAP_DANCE_DIABLO(3),
+ [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),
};
-// Sends the key press to system, but only if on the Diablo layer
-void send_diablo_keystroke(uint8_t diablo_key) {
- if (IS_LAYER_ON(_DIABLO)) {
- switch (diablo_key) {
- case 0:
- tap_code(KC_1); break;
- case 1:
- tap_code(KC_2); break;
- case 2:
- tap_code(KC_3); break;
- case 3:
- tap_code(KC_4); break;
- }
- }
-}
-
// Checks each of the 4 timers/keys to see if enough time has elapsed
-// Runs the "send string" command if enough time has passed, and resets the timer.
void run_diablo_macro_check(void) {
- uint8_t dtime;
- for (dtime = 0; dtime < 4; dtime++) {
- if (check_dtimer(dtime) && diablo_timer[dtime].key_time) {
- diablo_timer[dtime].timer = timer_read();
- send_diablo_keystroke(dtime);
+ 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/tap_dances.h b/users/drashna/tap_dances.h
index 4a293b2582..44fa0b9348 100644
--- a/users/drashna/tap_dances.h
+++ b/users/drashna/tap_dances.h
@@ -1,22 +1,30 @@
#pragma once
#include "drashna.h"
-//define diablo macro timer variables
+// define diablo macro timer variables
extern uint8_t diablo_times[];
typedef struct {
uint16_t timer;
- uint8_t key_time;
+ uint8_t key_interval;
+ uint8_t keycode;
} diablo_timer_t;
-extern diablo_timer_t diablo_timer[4];
+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
+// clang-format off
enum {
TD_D3_1 = 0,
TD_D3_2,
TD_D3_3,
TD_D3_4
};
-#endif // TAP_DANCE_ENABLE
+// clang-format on
+#endif // TAP_DANCE_ENABLE
diff --git a/users/drashna/template.c b/users/drashna/template.c
index d90e6bdecf..833447daac 100644
--- a/users/drashna/template.c
+++ b/users/drashna/template.c
@@ -1,124 +1,82 @@
#include "template.h"
-
// Add reconfigurable functions here, for keymap customization
// This allows for a global, userspace functions, and continued
// customization of the keymap. Use _keymap instead of _user
// functions in the keymaps
-__attribute__ ((weak))
-void matrix_init_keymap(void) {}
+__attribute__((weak)) void matrix_init_keymap(void) {}
// Call user matrix init, then call the keymap's init function
-void matrix_init_user(void) {
- matrix_init_keymap();
-}
+void matrix_init_user(void) { matrix_init_keymap(); }
-
-__attribute__ ((weak))
-void matrix_scan_keymap(void) {}
+__attribute__((weak)) void matrix_scan_keymap(void) {}
// No global matrix scan code, so just run keymap's matix
// scan function
-void matrix_scan_user(void) {
- matrix_scan_keymap();
-}
+void matrix_scan_user(void) { matrix_scan_keymap(); }
-
-__attribute__ ((weak))
-bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
- return true;
-}
+__attribute__((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { return true; }
// Defines actions tor my global custom keycodes. Defined in drashna.h file
// Then runs the _keymap's recod handier if not processed here,
// And use "NEWPLACEHOLDER" for new safe range
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
-
- switch (keycode) {
- case KC_MAKE:
- if (!record->event.pressed) {
- SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP
-#if (defined(BOOTLOADER_DFU) || defined(BOOTLOADER_LUFA_DFU) || defined(BOOTLOADER_QMK_DFU))
- ":dfu"
+ switch (keycode) {
+ case KC_MAKE:
+ if (!record->event.pressed) {
+ SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP
+#if (defined(BOOTLOADER_DFU) || defined(BOOTLOADER_LUFA_DFU) || defined(BOOTLOADER_QMK_DFU))
+ ":dfu"
#elif defined(BOOTLOADER_HALFKAY)
- ":teensy"
+ ":teensy"
#elif defined(BOOTLOADER_CATERINA)
- ":avrdude"
+ ":avrdude"
#endif
- SS_TAP(X_ENTER));
+ SS_TAP(X_ENTER));
+ }
+ return false;
+ break;
+
+ case VRSN:
+ if (record->event.pressed) {
+ SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
+ }
+ return false;
+ break;
}
- return false;
- break;
-
- case VRSN:
- if (record->event.pressed) {
- SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
- }
- return false;
- break;
- }
- return process_record_keymap(keycode, record);
-}
-
-
-__attribute__ ((weak))
-layer_state_t layer_state_set_keymap (layer_state_t state) {
- return state;
-}
-
-layer_state_t layer_state_set_user (layer_state_t state) {
- return layer_state_set_keymap (state);
+ return process_record_keymap(keycode, record);
}
+__attribute__((weak)) layer_state_t layer_state_set_keymap(layer_state_t state) { return state; }
+layer_state_t layer_state_set_user(layer_state_t state) { return layer_state_set_keymap(state); }
-__attribute__ ((weak))
-void led_set_keymap(uint8_t usb_led) {}
-
-void led_set_user(uint8_t usb_led) {
- led_set_keymap(usb_led);
-}
-
+__attribute__((weak)) void led_set_keymap(uint8_t usb_led) {}
+void led_set_user(uint8_t usb_led) { led_set_keymap(usb_led); }
-__attribute__ ((weak))
-void suspend_power_down_keymap(void) {}
-
-void suspend_power_down_user(void)
-{
- suspend_power_down_keymap();
-}
-
+__attribute__((weak)) void suspend_power_down_keymap(void) {}
+void suspend_power_down_user(void) { suspend_power_down_keymap(); }
-__attribute__ ((weak))
-void suspend_wakeup_init_keymap(void) {}
+__attribute__((weak)) void suspend_wakeup_init_keymap(void) {}
-void suspend_wakeup_init_user(void)
-{
- suspend_wakeup_init_keymap();
- #ifdef KEYBOARD_ergodox_ez
- wait_ms(10);
- #endif
+void suspend_wakeup_init_user(void) {
+ suspend_wakeup_init_keymap();
+#ifdef KEYBOARD_ergodox_ez
+ wait_ms(10);
+#endif
}
+__attribute__((weak)) void startup_keymap(void) {}
-
-__attribute__ ((weak))
-void startup_keymap(void) {}
-
-void startup_user (void) {
- #ifdef RGBLIGHT_ENABLE
+void startup_user(void) {
+#ifdef RGBLIGHT_ENABLE
matrix_init_rgb();
- #endif //RGBLIGHT_ENABLE
- startup_keymap();
+#endif // RGBLIGHT_ENABLE
+ startup_keymap();
}
+__attribute__((weak)) void shutdown_keymap(void) {}
-
-__attribute__ ((weak))
-void shutdown_keymap(void) {}
-
-void shutdown_user (void) {
- shutdown_keymap();
-}
+void shutdown_user(void) { shutdown_keymap(); }
diff --git a/users/drashna/template.h b/users/drashna/template.h
index dd1c487604..178f96e220 100644
--- a/users/drashna/template.h
+++ b/users/drashna/template.h
@@ -1,7 +1,6 @@
-#ifndef USERSPACE
-#define USERSPACE
+#pragma once
-#include "quantum.h"
+#include QMK_KEYBOARD_H
#include "version.h"
#include "eeprom.h"
@@ -9,10 +8,8 @@
#define BASE 0
enum custom_keycodes {
- VRSN = SAFE_RANGE, // can always be here
- KC_MAKE,
- KC_RESET,
- NEWPLACEHOLDER //use "NEWPLACEHOLDER for keymap specific codes
+ VRSN = SAFE_RANGE, // can always be here
+ KC_MAKE,
+ KC_RESET,
+ NEWPLACEHOLDER // use "NEWPLACEHOLDER for keymap specific codes
};
-
-#endif
diff --git a/users/drashna/wrappers.h b/users/drashna/wrappers.h
index 93f842f4b2..d22e2959cf 100644
--- a/users/drashna/wrappers.h
+++ b/users/drashna/wrappers.h
@@ -6,9 +6,10 @@ arguments, we need a wrapper in order for these definitions to be
expanded before being used as arguments to the LAYOUT_xxx macro.
*/
#if (!defined(LAYOUT) && defined(KEYMAP))
-# define LAYOUT KEYMAP
+# define LAYOUT KEYMAP
#endif
+// clang-format off
#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__)
#define LAYOUT_ergodox_pretty_wrapper(...) LAYOUT_ergodox_pretty(__VA_ARGS__)
#define KEYMAP_wrapper(...) LAYOUT(__VA_ARGS__)
@@ -135,6 +136,15 @@ NOTE: These are all the same length. If you do a search/replace
#define _____________CARPLAX_QGMLWY_R3_____________ KC_K, KC_P, 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 ________________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
@@ -164,9 +174,11 @@ NOTE: These are all the same length. If you do a search/replace
#define _________________ADJUST_L1_________________ RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_TOG
-#define _________________ADJUST_L2_________________ MU_TOG , CK_TOGG, AU_ON, AU_OFF, AG_NORM
+#define _________________ADJUST_L2_________________ MU_TOG , 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_________________ AG_SWAP, QWERTY, COLEMAK, DVORAK, WORKMAN
+#define _________________ADJUST_R2_________________ CG_SWAP, QWERTY, COLEMAK, DVORAK, WORKMAN
#define _________________ADJUST_R3_________________ MG_NKRO, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT
+
+// clang-format on
diff --git a/users/dshields/config.h b/users/dshields/config.h
new file mode 100644
index 0000000000..aa10814763
--- /dev/null
+++ b/users/dshields/config.h
@@ -0,0 +1,57 @@
+#pragma once
+
+#define RGB_MATRIX_FRAMEBUFFER_EFFECTS
+#define USB_MAX_POWER_CONSUMPTION 100
+#define ONESHOT_TAP_TOGGLE 2
+#define ONESHOT_TIMEOUT 3000
+#define RETRO_TAPPING
+#define BACKLIGHT_BREATHING
+#define DYNAMIC_MACRO_NO_NESTING
+
+#define MOUSEKEY_INTERVAL 20
+#define MOUSEKEY_DELAY 0
+#define MOUSEKEY_TIME_TO_MAX 40
+#define MOUSEKEY_MAX_SPEED 7
+#define MOUSEKEY_WHEEL_DELAY 0
+
+#define DISABLE_RGB_MATRIX_ALPHAS_MODS
+#define DISABLE_RGB_MATRIX_BREATHING
+#define DISABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
+#define DISABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
+#define DISABLE_RGB_MATRIX_BAND_SAT
+#define DISABLE_RGB_MATRIX_BAND_SPIRAL_SAT
+#define DISABLE_RGB_MATRIX_BAND_SPIRAL_VAL
+#define DISABLE_RGB_MATRIX_BAND_VAL
+#define DISABLE_RGB_MATRIX_CYCLE_ALL
+#define DISABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
+#define DISABLE_RGB_MATRIX_CYCLE_OUT_IN
+#define DISABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
+#define DISABLE_RGB_MATRIX_CYCLE_PINWHEEL
+#define DISABLE_RGB_MATRIX_CYCLE_SPIRAL
+#define DISABLE_RGB_MATRIX_CYCLE_UP_DOWN
+#define DISABLE_RGB_MATRIX_DUAL_BEACON
+#define DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
+#define DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
+#define DISABLE_RGB_MATRIX_RAINBOW_PINWHEELS
+#define DISABLE_RGB_MATRIX_SOLID_REACTIVE
+#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
+#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
+#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
+#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
+#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
+#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
+#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
+#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
+#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
+#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
+#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
+#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
+#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
+#define DISABLE_RGB_MATRIX_SOLID_SPLASH
+#define DISABLE_RGB_MATRIX_SOLID_MULTISPLASH
+#define DISABLE_RGB_MATRIX_SOLID_SPLASH
+#define DISABLE_RGB_MATRIX_SOLID_MULTISPLASH
+#define DISABLE_RGB_MATRIX_SPLASH
+#define DISABLE_RGB_MATRIX_MULTISPLASH
+#define DISABLE_RGB_MATRIX_SPLASH
+#define DISABLE_RGB_MATRIX_MULTISPLASH
diff --git a/users/dshields/dshields.c b/users/dshields/dshields.c
new file mode 100644
index 0000000000..8f432a317c
--- /dev/null
+++ b/users/dshields/dshields.c
@@ -0,0 +1,26 @@
+#include "quantum.h"
+#include "dshields.h"
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (keycode == KC_ESC && record->event.pressed) {
+ bool rc = true;
+ uint8_t mods = 0;
+ if ((mods = get_oneshot_mods()) && !has_oneshot_mods_timed_out()) {
+ clear_oneshot_mods();
+ unregister_mods(mods);
+ rc = false;
+ }
+ if ((mods = get_oneshot_locked_mods())) {
+ clear_oneshot_locked_mods();
+ unregister_mods(mods);
+ rc = false;
+ }
+ if (is_oneshot_layer_active()) {
+ layer_clear();
+ rc = false;
+ }
+ return rc;
+ }
+ return true;
+}
+
diff --git a/users/dshields/dshields.h b/users/dshields/dshields.h
new file mode 100644
index 0000000000..e1aa07a5db
--- /dev/null
+++ b/users/dshields/dshields.h
@@ -0,0 +1,42 @@
+#pragma once
+
+// one-shot layer keys
+#define OSL_RSE OSL(RSE)
+#define OSL_LWR OSL(LWR)
+#define OSL_FUN OSL(FUN)
+
+// one-shot modifier keys
+#define OSMLCTL OSM(MOD_LCTL)
+#define OSMRCTL OSM(MOD_RCTL)
+#define OSMLALT OSM(MOD_LALT)
+#define OSMRALT OSM(MOD_RALT)
+#define OSMLSFT OSM(MOD_LSFT)
+#define OSMRSFT OSM(MOD_RSFT)
+
+// mod-tap keys
+#define MT_SPC SFT_T(KC_SPC)
+
+// LED/RGB controls
+#ifdef KEYBOARD_planck_light
+ #define LGT_TOG RGB_TOG
+ #define LGT_MOD RGB_MOD
+ #define LGT_BRT _______
+ #define LGT_INC RGB_HUI
+ #define LGT_DEC RGB_HUD
+#endif
+#ifdef KEYBOARD_planck_rev3
+ #define LGT_TOG BL_TOGG
+ #define LGT_MOD BL_STEP
+ #define LGT_BRT BL_BRTG
+ #define LGT_INC BL_INC
+ #define LGT_DEC BL_DEC
+#endif
+#ifdef KEYBOARD_planck_rev6
+ #define LGT_TOG _______
+ #define LGT_MOD _______
+ #define LGT_BRT _______
+ #define LGT_INC _______
+ #define LGT_DEC _______
+#endif
+
+enum layers { DEF, LWR, RSE, FUN };
diff --git a/users/dshields/rules.mk b/users/dshields/rules.mk
new file mode 100644
index 0000000000..abfbe5e40e
--- /dev/null
+++ b/users/dshields/rules.mk
@@ -0,0 +1,32 @@
+SRC += dshields.c
+
+MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
+COMMAND_ENABLE = no # Commands for debug and configuration
+CONSOLE_ENABLE = no # Console for debug(+400)
+EXTRAKEY_ENABLE = no
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+API_SYSEX_ENABLE = no
+SPACE_CADET_ENABLE = no
+LEADER_ENABLE = no
+DYNAMIC_MACRO_ENABLE = yes
+
+LINK_TIME_OPTIMIZATION_ENABLE = yes
+
+ifeq ($(strip $(KEYBOARD)), planck/rev3)
+ AUDIO_ENABLE = no
+ BACKLIGHT_ENABLE = yes
+ RGB_MATRIX_ENABLE = no
+endif
+ifeq ($(strip $(KEYBOARD)), planck/rev6)
+ CFLAGS += -Wno-error=deprecated
+ EXTRALDFLAGS = -Wl,--build-id=none
+ AUDIO_ENABLE = no
+ BACKLIGHT_ENABLE = no
+ RGB_MATRIX_ENABLE = no
+endif
+ifeq ($(strip $(KEYBOARD)), planck/light)
+ AUDIO_ENABLE = yes
+ BACKLIGHT_ENABLE = no
+ RGB_MATRIX_ENABLE = yes
+endif
+
diff --git a/users/gary/gary.c b/users/gary/gary.c
new file mode 100644
index 0000000000..aa49e7d659
--- /dev/null
+++ b/users/gary/gary.c
@@ -0,0 +1 @@
+#include "gary.h"
diff --git a/users/gary/gary.h b/users/gary/gary.h
new file mode 100644
index 0000000000..10f2331591
--- /dev/null
+++ b/users/gary/gary.h
@@ -0,0 +1,43 @@
+#include QMK_KEYBOARD_H
+
+#pragma once
+#define USE_SERIAL
+#define MASTER_LEFT
+
+// Layers
+// #define BASE 0 // Base layer
+// #define FCTN 4 // Function
+#define _QWERTY 0
+#define _LOWER 1
+#define _RAISE 2
+
+enum custom_keycodes {
+ QWERTY = SAFE_RANGE,
+ LOWER,
+ RAISE,
+};
+
+#define KC_RST RESET
+#define KC_ KC_TRNS
+
+#define KC_LOWR MO(_LOWER) // Lower layer
+#define KC_RASE MO(_RAISE) // Raise layer
+#define KC_CTLC C(KC_C)
+#define KC_CLTB C(KC_TAB)
+#define KC_OPASS G(KC_BSLS) // GUI + Back Slash
+#define KC_GARY LT(_RAISE, KC_SPC) // Hold for Raise, Tap for Space
+
+#define KC_SHOT SCMD(C(KC_4)) // Screenshot to Paste
+
+// Window Management
+#define KC_FULL A(G(KC_F)) // Full Screen
+#define KC_CNTR A(G(KC_C)) // Center
+#define KC_LHLF A(G(KC_LEFT)) // Left Half
+#define KC_RHLF A(G(KC_RGHT)) // Right Half
+
+#define KC_UPLF C(G(KC_LEFT)) // Upper Left
+#define KC_UPRG C(G(KC_RGHT)) // Upper Right
+#define KC_DNLF S(C(G(KC_LEFT))) // Lower Left
+#define KC_DNRG S(C(G(KC_RGHT))) // Lower Right
+
+#define KC_NEXT LCAG(KC_LEFT) // Move the Window to next display
diff --git a/users/gary/readme.md b/users/gary/readme.md
new file mode 100644
index 0000000000..a8c22e5ae7
--- /dev/null
+++ b/users/gary/readme.md
@@ -0,0 +1,14 @@
+Copyright 2019 Gary @garyjzhao
+
+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/>.
diff --git a/users/gary/rules.mk b/users/gary/rules.mk
new file mode 100644
index 0000000000..b6aa3490ba
--- /dev/null
+++ b/users/gary/rules.mk
@@ -0,0 +1 @@
+SRC += gary.c
diff --git a/users/hvp/hvp.c b/users/hvp/hvp.c
new file mode 100644
index 0000000000..7e484535c8
--- /dev/null
+++ b/users/hvp/hvp.c
@@ -0,0 +1,2 @@
+
+#include "hvp.h"
diff --git a/users/hvp/hvp.h b/users/hvp/hvp.h
new file mode 100644
index 0000000000..2b2210f873
--- /dev/null
+++ b/users/hvp/hvp.h
@@ -0,0 +1,6 @@
+#pragma once
+
+#ifdef TAP_DANCE_ENABLE
+# include "tap_dances.h"
+#endif
+#include "quantum.h"
diff --git a/users/hvp/readme.md b/users/hvp/readme.md
new file mode 100644
index 0000000000..2d8f9d8597
--- /dev/null
+++ b/users/hvp/readme.md
@@ -0,0 +1 @@
+Personal user space for hvpcode / cablegore at discord
diff --git a/users/hvp/rules.mk b/users/hvp/rules.mk
new file mode 100644
index 0000000000..0a7e679631
--- /dev/null
+++ b/users/hvp/rules.mk
@@ -0,0 +1,4 @@
+SRC += hvp.c
+ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
+ SRC += tap_dances.c
+endif \ No newline at end of file
diff --git a/users/hvp/tap_dances.c b/users/hvp/tap_dances.c
new file mode 100644
index 0000000000..bb102b30ab
--- /dev/null
+++ b/users/hvp/tap_dances.c
@@ -0,0 +1,75 @@
+#include "tap_dances.h"
+
+// Tap dance function for enable swedish characters on first layer. Unregister to not let tap bleed over to next keypress.
+// Tap dance 1
+void dance_1_finished(qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count == 2) {
+ tap_code(KC_SCLN);
+ } else {
+ register_code(KC_RALT);
+ register_code(KC_O);
+ unregister_code(KC_RALT);
+ unregister_code(KC_O);
+ }
+}
+
+void dance_1_reset(qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count == 2) {
+ unregister_code(KC_SCLN);
+ } else {
+ unregister_code(KC_RALT);
+ unregister_code(KC_O);
+ }
+}
+
+// Tap dance 2
+void dance_2_finished(qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count == 2) {
+ tap_code(KC_QUOT);
+ } else {
+ register_code(KC_RALT);
+ register_code(KC_A);
+ unregister_code(KC_RALT);
+ unregister_code(KC_A);
+ }
+}
+
+void dance_2_reset(qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count == 2) {
+ unregister_code(KC_QUOT);
+ } else {
+ unregister_code(KC_RALT);
+ unregister_code(KC_A);
+ }
+}
+
+// Tap dance 3
+void dance_3_finished(qk_tap_dance_state_t *state, void *user_data) {
+ // if (state->count == 2)
+ if (state->count == 2) {
+ tap_code(KC_SLSH);
+ } else {
+ register_code(KC_RALT);
+ register_code(KC_W);
+ unregister_code(KC_RALT);
+ unregister_code(KC_W);
+ }
+}
+
+void dance_3_reset(qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count == 2) {
+ unregister_code(KC_SLSH);
+ } else {
+ unregister_code(KC_RALT);
+ unregister_code(KC_W);
+ }
+}
+
+// Tap Dance Definitions
+qk_tap_dance_action_t tap_dance_actions[] = {
+ // simple tap dance
+ [TD1] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_1_finished, dance_1_reset),
+
+ [TD2] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_2_finished, dance_2_reset),
+
+ [TD3] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_3_finished, dance_3_reset)}; \ No newline at end of file
diff --git a/users/hvp/tap_dances.h b/users/hvp/tap_dances.h
new file mode 100644
index 0000000000..705985faac
--- /dev/null
+++ b/users/hvp/tap_dances.h
@@ -0,0 +1,10 @@
+#pragma once
+#include "hvp.h"
+
+// Tap Dance Declarations
+enum tapdance_id
+{
+ TD1 = 0,
+ TD2,
+ TD3
+};
diff --git a/users/issmirnov/config.h b/users/issmirnov/config.h
new file mode 100644
index 0000000000..664ebfe8a3
--- /dev/null
+++ b/users/issmirnov/config.h
@@ -0,0 +1,45 @@
+#pragma once
+
+// Allows sending more than one key per scan. Useful for chords.
+#define QMK_KEYS_PER_SCAN 4
+
+// how long before a tap becomes a hold
+#undef TAPPING_TERM
+#define TAPPING_TERM 100
+
+// makes tap and hold keys work better for fast typers who don't want
+// tapping term set above 500
+#define PERMISSIVE_HOLD
+
+// tap anyway, even after TAPPING_TERM, if there was no other key
+// interruption between press and release
+#define RETRO_TAPPING
+
+// how many taps before triggering the toggle
+#undef ONESHOT_TAP_TOGGLE
+#define ONESHOT_TAP_TOGGLE 2
+
+// how long before oneshot modifier key times out (currently only shift)
+#undef ONESHOT_TIMEOUT
+#define ONESHOT_TIMEOUT 2000
+
+// Enable combos for vim
+#define COMBO_COUNT 5 // Specify the number of combos used. BE SURE TO INCREMENT AS NEEDED
+#define COMBO_TERM 50 // window in milliseconds to trigger combo
+
+// Allow more than 4 keys to be sent to the system. Useful for gaming.
+// #define FORCE_NKRO
+
+// Save 200 bytes on unused keycodes
+#undef LOCKING_SUPPORT_ENABLE
+#undef LOCKING_RESYNC_ENABLE
+
+// Enable HID_listen commands.
+#define NO_DEBUG
+#undef NO_PRINT
+#define USER_PRINT
+
+// Note: Defining the following does not have any impact on space:
+// - NO_ACTION_MACRO
+// - NO_ACTION_FUNCTION
+// - DISABLE_LEADER
diff --git a/users/issmirnov/issmirnov.c b/users/issmirnov/issmirnov.c
new file mode 100644
index 0000000000..665afbcfd7
--- /dev/null
+++ b/users/issmirnov/issmirnov.c
@@ -0,0 +1,43 @@
+#include "issmirnov.h"
+
+enum combo_events {
+ JK_ESC,
+ DF_CLN,
+ SD_SLASH,
+ XC_COPY,
+ XV_PASTE
+};
+
+
+const uint16_t PROGMEM jk_combo[] = {KC_J, KC_K, COMBO_END};
+const uint16_t PROGMEM df_combo[] = {KC_D, KC_F, COMBO_END};
+const uint16_t PROGMEM sd_combo[] = {KC_S, KC_D, COMBO_END};
+const uint16_t PROGMEM copy_combo[] = {KC_X, KC_C, COMBO_END};
+const uint16_t PROGMEM paste_combo[] = {KC_X, KC_V, COMBO_END};
+
+
+// BE SURE TO UPDATE THE CONFIG.H "COMBO_COUNT" value when you add elements here!
+combo_t key_combos[COMBO_COUNT] = {
+ COMBO(jk_combo, KC_ESC),
+ COMBO(df_combo, KC_COLON),
+ COMBO(sd_combo, KC_SLASH),
+ [XC_COPY] = COMBO_ACTION(copy_combo),
+ [XV_PASTE] = COMBO_ACTION(paste_combo),
+};
+
+
+void process_combo_event(uint8_t combo_index, bool pressed) {
+ switch(combo_index) {
+ case XC_COPY:
+ if (pressed) {
+ tap_code16(LCTL(KC_C));
+ }
+ break;
+
+ case XV_PASTE:
+ if (pressed) {
+ tap_code16(LCTL(KC_V));
+ }
+ break;
+ }
+}
diff --git a/users/issmirnov/issmirnov.h b/users/issmirnov/issmirnov.h
new file mode 100644
index 0000000000..eef80dfc47
--- /dev/null
+++ b/users/issmirnov/issmirnov.h
@@ -0,0 +1,35 @@
+#pragma once
+
+#include QMK_KEYBOARD_H
+
+#include "rows.h"
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers
+enum {
+ _QWERTY = 0,
+ _SYMB,
+ _NUMP,
+ _OVERWATCH,
+ _NAVI
+};
+
+enum custom_keycodes {
+ PLACEHOLDER = SAFE_RANGE,
+ TAP_TOG_LAYER,
+ CLEAR_EEPROM,
+ WKSP_LEFT, // Smart key that only activates when we are momentarily in a layer
+ WKSP_RIGHT, // Smart key that only activates when we are momentarily in a layer
+};
+
+
+#define LOWER MO(_SYMB)
+#define RAISE MO(_NUMP)
+
+#define CTL_SPC MT(MOD_LCTL, KC_SPC)
+#define OSMSFT OSM(MOD_LSFT)
+#define LOCK LGUI(KC_L)
+#define MODSFT LSFT(KC_LGUI)
+#define APPS LGUI(KC_SPC)
diff --git a/users/issmirnov/rows.h b/users/issmirnov/rows.h
new file mode 100644
index 0000000000..d35af2175c
--- /dev/null
+++ b/users/issmirnov/rows.h
@@ -0,0 +1,55 @@
+#pragma once
+
+#include QMK_KEYBOARD_H
+
+// This wrapper is required in order to expand the row macro inside the keymap configs.
+#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__)
+#define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__)
+
+// Share common config. We'll skip the mod rows and func rows.
+// Note, it's also really neat the way the scoping works. Since we perform the expansion in the keymap.c file
+// so we can use our enums for custom keycodes
+#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 , TAP_TOG_LAYER
+#define _________________QWERTY_R3_________________ KC_N , KC_M , KC_DOT , KC_COMMA , TG(_NUMP)
+
+#define ___________________BLANK___________________ _______ , _______ , _______ , _______ , _______
+#define ___________________XXXXX___________________ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX
+
+#define _________________SYMB_L1___________________ KC_MINS , KC_AT , KC_LCBR , KC_RCBR , KC_GRV
+#define _________________SYMB_L2___________________ KC_CIRC , KC_UNDS , KC_LPRN , KC_RPRN , KC_DLR
+#define _________________SYMB_L3___________________ KC_LABK , KC_RABK , KC_LBRACKET , KC_RBRACKET , KC_TILD
+
+#define _________________SYMB_R1___________________ KC_ASTR , KC_EXLM , KC_PIPE , KC_PERC , KC_PLUS
+#define _________________SYMB_R2___________________ KC_HASH , KC_EQL , KC_COLN , KC_SCLN , TAP_TOG_LAYER
+#define _________________SYMB_R3___________________ KC_AMPR , KC_QUES , KC_SLASH , KC_BSLASH , TG(_NUMP)
+
+
+#define _________________NUMP_L1___________________ KC_NO , KC_NO , LGUI(KC_UP) , XXXXXXX , XXXXXXX
+#define _________________NUMP_L2___________________ XXXXXXX , LGUI(KC_LEFT) , LGUI(KC_DOWN) , LGUI(KC_RIGHT) , XXXXXXX
+#define _________________NUMP_L3___________________ XXXXXXX , XXXXXXX , XXXXXXX , KC_AUDIO_VOL_DOWN , KC_AUDIO_VOL_UP
+
+#define _________________NUMP_R1___________________ KC_COMM , KC_7 , KC_8 , KC_9 , XXXXXXX
+#define _________________NUMP_R2___________________ KC_0 , KC_4 , KC_5 , KC_6 , TO(_SYMB)
+#define _________________NUMP_R3___________________ KC_DOT , KC_1 , KC_2 , KC_3 , TO(_QWERTY)
+
+// Note: These are 6x1 blocks, since modifiers are also adjusted.
+#define ______________OVERWATCH_L1_________________ KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T
+#define ______________OVERWATCH_L2_________________ KC_LCTL , KC_A , KC_S , KC_D , KC_F , KC_P
+#define ______________OVERWATCH_L3_________________ KC_LSHIFT , KC_Z , KC_X , KC_C , KC_V , KC_GRAVE
+// Ergodox only has 5 keys on bottom row:
+#define ______________OVERWATCH_L4_________________ KC_LCTL , KC_F9 , KC_PSCREEN , KC_H , KC_R
+
+
+
+#define _________________NAVI_L1___________________ XXXXXXX , XXXXXXX , KC_UP , XXXXXXX , XXXXXXX
+#define _________________NAVI_L2___________________ XXXXXXX , KC_LEFT , KC_DOWN , KC_RGHT , XXXXXXX
+#define _________________NAVI_L3___________________ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX
+
+#define _________________NAVI_R1___________________ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX
+#define _________________NAVI_R2___________________ XXXXXXX , KC_LCTL , XXXXXXX , XXXXXXX , XXXXXXX
+#define _________________NAVI_R3___________________ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX
diff --git a/users/issmirnov/rules.mk b/users/issmirnov/rules.mk
new file mode 100644
index 0000000000..096d7b4c0d
--- /dev/null
+++ b/users/issmirnov/rules.mk
@@ -0,0 +1,25 @@
+
+SRC += tap_tog.c
+SRC += issmirnov.c
+
+# https://www.reddit.com/r/olkb/comments/bmpgjm/programming_help/
+# Should shave 2000 bytes
+LINK_TIME_OPTIMIZATION_ENABLE = yes
+
+# Enable debugging only when needed.
+CONSOLE_ENABLE = yes # +400 bytes (hid_listen support)
+
+# Enable combo keys for vim usage.
+# https://github.com/qmk/qmk_firmware/blob/master/docs/feature_combo.md
+COMBO_ENABLE = yes
+
+# This allows the keyboard to tell the host OS that up to 248 keys are held down at once
+NKRO_ENABLE = no # note: also needs FORCE_NKRO in config.h
+
+# Disable unused features to save on space
+# https://thomasbaart.nl/2018/12/01/reducing-firmware-size-in-qmk/
+MOUSEKEY_ENABLE = no # 2000 bytes
+BOOTMAGIC_ENABLE = no
+COMMAND_ENABLE = no # https://beta.docs.qmk.fm/features/feature_command
+UNICODE_ENABLE = no # Unicode
+SWAP_HANDS_ENABLE = no # Allow swapping hands of keyboard
diff --git a/users/issmirnov/tap_tog.c b/users/issmirnov/tap_tog.c
new file mode 100644
index 0000000000..02cea08b1d
--- /dev/null
+++ b/users/issmirnov/tap_tog.c
@@ -0,0 +1,52 @@
+#include QMK_KEYBOARD_H
+
+#include "tap_tog.h"
+
+bool tap_tog_layer_other_key_pressed = false;
+bool tap_tog_layer_toggled_on = false;
+uint8_t tap_tog_count = 0;
+
+void process_tap_tog(uint8_t layer, keyrecord_t *record) {
+ tap_tog_count++;
+ // press
+ if (record->event.pressed) {
+
+ // TTL has already been pressed and we are toggled into that layer
+ // so now we need to leave
+ if(tap_tog_layer_toggled_on) {
+ layer_clear();
+ tap_tog_layer_toggled_on = false;
+ }
+
+ // this means we're in our default layer
+ // so switch the layer immediately
+ // whether we'll switch back when it's released depends on if a button gets pressed while this is held down
+ else {
+ // switch layer
+ layer_on(layer);
+ tap_tog_layer_other_key_pressed = false; // if this becomes true before it gets released, it will act as a held modifier
+ }
+ }
+
+ // release
+ else {
+ // if it was used as a held modifier (like traditional shift)
+ if(tap_tog_layer_other_key_pressed) {
+ // switch layer back
+ layer_clear();
+ }
+ // if it was used as a toggle button
+ else {
+ // next time, it will turn layer off
+ tap_tog_layer_toggled_on = true;
+
+ // If it's been tapped twice, reset the toggle flag.
+ // Otherwise, we get stuck oscillating between this code block and the
+ // pressed && TTL_toggled_on block.
+ if (tap_tog_count >= 4 ) {
+ tap_tog_count = 0;
+ tap_tog_layer_toggled_on = false;
+ }
+ }
+ }
+}
diff --git a/users/issmirnov/tap_tog.h b/users/issmirnov/tap_tog.h
new file mode 100644
index 0000000000..f59711f043
--- /dev/null
+++ b/users/issmirnov/tap_tog.h
@@ -0,0 +1,10 @@
+#pragma once
+
+#include "issmirnov.h"
+
+extern bool tap_tog_layer_other_key_pressed; // set to true if any key pressed while TAP_TOG_LAYER held down
+extern bool tap_tog_layer_toggled_on; // will become true if no keys are pressed while TTL held down
+extern uint8_t tap_tog_count; // number of presses on TAP_TOG_LAYER button.
+
+// Tap dance analog with momentary toggle when held, switch when tapped
+void process_tap_tog(uint8_t layer, keyrecord_t *record);
diff --git a/users/jarred/jarred.h b/users/jarred/jarred.h
index ae48adb70c..49b1253be5 100644
--- a/users/jarred/jarred.h
+++ b/users/jarred/jarred.h
@@ -50,6 +50,7 @@ enum {
// Wrappers
#define LAYOUT_planck_grid_wrapper(...) LAYOUT_planck_grid(__VA_ARGS__)
+#define LAYOUT_plaid_grid_wrapper(...) LAYOUT_plaid_grid(__VA_ARGS__)
#define LAYOUT_atreus62_grid_wrapper(...) LAYOUT(__VA_ARGS__)
#define LAYOUT_ergotravel_grid_wrapper(...) LAYOUT(__VA_ARGS__)
diff --git a/users/jarred/readme.md b/users/jarred/readme.md
index 9d4e926e74..9f19dad13f 100644
--- a/users/jarred/readme.md
+++ b/users/jarred/readme.md
@@ -2,4 +2,16 @@
Keymaps:
+- [Ortho 4x12](../../layouts/community/ortho_4x12/jarred/readme.md)
+
- [Planck](../../keyboards/planck/keymaps/jarred/readme.md)
+- [CRKBD](../../keyboards/crkbd/keymaps/jarred/readme.md)
+- [Atreus 62](../../keyboards/ergotravel/keymaps/jarred/readme.md)
+- [ErgoTravel](../../keyboards/ergotravel/keymaps/jarred/readme.md)
+- [xd75](../../keyboards/xd75/keymaps/jarred/readme.md)
+
+- [satan](../../keyboards/satan/keymaps/jarred/readme.md)
+- [dz60](../../keyboards/dz60/keymaps/jarred/readme.md)
+- [org60](../../keyboards/org60/keymaps/jarred/readme.md)
+- [Leaf60](../../keyboards/foxlab/leaf60/universal/keymaps/jarred/readme.md)
+- [Tada68](../../keyboards/tada68/keymaps/jarred/readme.md)
diff --git a/users/konstantin/config.h b/users/konstantin/config.h
index 4edab2baab..bc1987c357 100644
--- a/users/konstantin/config.h
+++ b/users/konstantin/config.h
@@ -13,11 +13,18 @@
#define NO_ACTION_MACRO
#define NO_ACTION_ONESHOT
+#undef RGBLIGHT_ANIMATIONS
+#define RGBLIGHT_EFFECT_BREATHING
+#define RGBLIGHT_EFFECT_RAINBOW_MOOD
+#define RGBLIGHT_EFFECT_RAINBOW_SWIRL
+#define RGBLIGHT_EFFECT_SNAKE
+
#define PERMISSIVE_HOLD
-#define TAPPING_TERM 200
-#define TAPPING_TOGGLE 2
-#define TAP_HOLD_CAPS_DELAY 50
+#define TAPPING_TERM 200
+#define TAPPING_TOGGLE 2
#define UNICODE_CYCLE_PERSIST false
#define UNICODE_SELECTED_MODES UC_WINC, UC_WIN, UC_LNX
#define UNICODE_KEY_WINC KC_RGUI
+
+#define USB_POLLING_INTERVAL_MS 1
diff --git a/users/konstantin/konstantin.c b/users/konstantin/konstantin.c
index 9e3caca414..9cee25ac66 100644
--- a/users/konstantin/konstantin.c
+++ b/users/konstantin/konstantin.c
@@ -32,32 +32,21 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
switch (keycode) {
- case CLEAR:
+ uint16_t kc;
+#ifdef LAYER_FN
+ static bool fn_lock = false;
+
+ case FNLK:
if (record->event.pressed) {
- SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE));
+ fn_lock = !IS_LAYER_ON(L_FN); // Fn layer will be toggled after this
}
- return false;
-
- case DST_P_R:
- (record->event.pressed ? register_code16 : unregister_code16)(
- (get_mods() & DST_MOD_MASK) ? DST_REM : DST_PRV
- );
- return false;
-
- case DST_N_A:
- (record->event.pressed ? register_code16 : unregister_code16)(
- (get_mods() & DST_MOD_MASK) ? DST_ADD : DST_NXT
- );
- return false;
-
-#ifdef LAYER_FN
- static bool fn_lock;
+ break;
case FN_FNLK:
if (record->event.pressed && record->tap.count == TAPPING_TOGGLE) {
- fn_lock = !IS_LAYER_ON(L_FN); // Fn layer will be toggled after this
+ fn_lock = !IS_LAYER_ON(L_FN);
}
- return true;
+ break;
#endif
case KC_ESC:
@@ -75,11 +64,32 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
#endif
}
- return true;
+ break;
- default:
- return true;
+ case CLEAR:
+ if (record->event.pressed) {
+ CLEAN_MODS(
+ SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE));
+ )
+ }
+ break;
+
+ case DST_P_R:
+ kc = (get_mods() & DST_MOD_MASK) ? DST_REM : DST_PRV;
+ CLEAN_MODS(
+ (record->event.pressed ? register_code16 : unregister_code16)(kc);
+ )
+ break;
+
+ case DST_N_A:
+ kc = (get_mods() & DST_MOD_MASK) ? DST_ADD : DST_NXT;
+ CLEAN_MODS(
+ (record->event.pressed ? register_code16 : unregister_code16)(kc);
+ )
+ break;
}
+
+ return true;
}
__attribute__((weak))
@@ -91,7 +101,7 @@ uint32_t layer_state_set_user(uint32_t state) {
state = layer_state_set_keymap(state);
#ifdef LAYER_NUMPAD
- bool numpad = state & 1UL<<L_NUMPAD;
+ bool numpad = IS_LAYER_ON_STATE(state, L_NUMPAD);
bool num_lock = IS_HOST_LED_ON(USB_LED_NUM_LOCK);
if (numpad != num_lock) {
tap_code(KC_NLCK); // Toggle Num Lock to match Numpad layer state
@@ -100,3 +110,10 @@ uint32_t layer_state_set_user(uint32_t state) {
return state;
}
+
+__attribute__((weak))
+void led_set_keymap(uint8_t usb_led) {}
+
+void led_set_user(uint8_t usb_led) {
+ led_set_keymap(usb_led);
+}
diff --git a/users/konstantin/konstantin.h b/users/konstantin/konstantin.h
index d43712b965..da21058312 100644
--- a/users/konstantin/konstantin.h
+++ b/users/konstantin/konstantin.h
@@ -13,6 +13,7 @@
#ifdef LAYER_FN
#define FN MO(L_FN)
+ #define FNLK TG(L_FN)
#define FN_CAPS LT(L_FN, KC_CAPS)
#define FN_ESC LT(L_FN, KC_ESC)
#define FN_FNLK TT(L_FN)
@@ -22,9 +23,8 @@
#define NUMPAD TG(L_NUMPAD)
#endif
-#define KC_SYSR LALT(KC_PSCR)
-#undef KC_BRK
-#define KC_BRK LCTL(KC_PAUS)
+#define BREAK LCTL(KC_PAUS)
+#define SYSRQ LALT(KC_PSCR)
#define MV_UP LCTL(KC_UP)
#define MV_DOWN LCTL(KC_DOWN)
@@ -46,16 +46,18 @@
#endif
#define LCT_CPS LCTL_T(KC_CAPS)
+#define RSF_SLS RSFT_T(KC_SLSH)
-#ifdef SEND_STRING_CLEAN
- #undef SEND_STRING
- #define SEND_STRING(string) { \
- uint8_t ss_mods = get_mods(); \
- clear_mods(); \
- send_string_P(PSTR(string)); \
- set_mods(ss_mods); \
- }
-#endif
+#define IS_LAYER_ON_STATE(state, layer) ( (state) & (1UL << (layer)))
+#define IS_LAYER_OFF_STATE(state, layer) (~(state) & (1UL << (layer)))
+
+// Clear mods, perform action, restore mods
+#define CLEAN_MODS(action) { \
+ uint8_t mods = get_mods(); \
+ clear_mods(); \
+ action; \
+ set_mods(mods); \
+ }
enum keycodes_user {
CLEAR = SAFE_RANGE,
@@ -81,5 +83,6 @@ void keyboard_pre_init_keymap(void);
void eeconfig_init_keymap(void);
void keyboard_post_init_keymap(void);
-bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
+bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
uint32_t layer_state_set_keymap(uint32_t state);
+void led_set_keymap(uint8_t usb_led);
diff --git a/users/konstantin/rgb.c b/users/konstantin/rgb.c
index a96cad019d..fffa250f25 100644
--- a/users/konstantin/rgb.c
+++ b/users/konstantin/rgb.c
@@ -20,6 +20,7 @@ const uint8_t PROGMEM RGBLED_SNAKE_INTERVALS[] = { 20, 50, 100 };
const uint8_t PROGMEM RGBLED_KNIGHT_INTERVALS[] = { 20, 50, 100 };
#endif
-const HSV GODSPEED_BLUE = { .h = 198, .s = 68, .v = 255 };
-const HSV GODSPEED_YELLOW = { .h = 27, .s = 153, .v = 255 };
-const HSV MODERN_DOLCH_RED = { .h = 252, .s = 255, .v = 144 };
+const HSV godspeed_blue = { GODSPEED_BLUE };
+const HSV godspeed_yellow = { GODSPEED_YELLOW };
+const HSV modern_dolch_cyan = { MODERN_DOLCH_CYAN };
+const HSV modern_dolch_red = { MODERN_DOLCH_RED };
diff --git a/users/konstantin/rgb.h b/users/konstantin/rgb.h
index 36a9d9cd74..cc7d91808a 100644
--- a/users/konstantin/rgb.h
+++ b/users/konstantin/rgb.h
@@ -2,6 +2,12 @@
#include "quantum.h"
-extern const HSV GODSPEED_BLUE;
-extern const HSV GODSPEED_YELLOW;
-extern const HSV MODERN_DOLCH_RED;
+#define GODSPEED_BLUE 198, 68, 255
+#define GODSPEED_YELLOW 27, 153, 255
+#define MODERN_DOLCH_CYAN 110, 255, 108
+#define MODERN_DOLCH_RED 251, 255, 108
+
+extern const HSV godspeed_blue;
+extern const HSV godspeed_yellow;
+extern const HSV modern_dolch_cyan;
+extern const HSV modern_dolch_red;
diff --git a/users/konstantin/tap_dance.c b/users/konstantin/tap_dance.c
index ba1453fc05..4ec8caa63f 100644
--- a/users/konstantin/tap_dance.c
+++ b/users/konstantin/tap_dance.c
@@ -107,12 +107,13 @@ void td_layer_mod_reset(qk_tap_dance_state_t *state, void *user_data) {
qk_tap_dance_action_t tap_dance_actions[] = {
[TD_DST_A_R] = ACTION_TAP_DANCE_DOUBLE(DST_ADD, DST_REM),
- [TD_RAL_LAL] = ACTION_TAP_DANCE_DOUBLE_MOD(KC_RALT, KC_LALT),
[TD_RAL_RGU] = ACTION_TAP_DANCE_DOUBLE_MOD(KC_RALT, KC_RGUI),
[TD_RCT_RSF] = ACTION_TAP_DANCE_DOUBLE_MOD(KC_RCTL, KC_RSFT),
[TD_RSF_RCT] = ACTION_TAP_DANCE_DOUBLE_MOD(KC_RSFT, KC_RCTL),
+#ifdef LAYER_FN
[TD_LSFT_FN] = ACTION_TAP_DANCE_MOD_LAYER(KC_LSFT, L_FN),
[TD_RCTL_FN] = ACTION_TAP_DANCE_MOD_LAYER(KC_RCTL, L_FN),
[TD_FN_RCTL] = ACTION_TAP_DANCE_LAYER_MOD(L_FN, KC_RCTL),
+#endif
};
diff --git a/users/konstantin/tap_dance.h b/users/konstantin/tap_dance.h
index d2f00c8cb3..56889a19ef 100644
--- a/users/konstantin/tap_dance.h
+++ b/users/konstantin/tap_dance.h
@@ -4,24 +4,26 @@
#define DST_A_R TD(TD_DST_A_R)
-#define RAL_LAL TD(TD_RAL_LAL)
#define RAL_RGU TD(TD_RAL_RGU)
#define RCT_RSF TD(TD_RCT_RSF)
#define RSF_RCT TD(TD_RSF_RCT)
-#define LSFT_FN TD(TD_LSFT_FN)
-#define RCTL_FN TD(TD_RCTL_FN)
-#define FN_RCTL TD(TD_FN_RCTL)
+#ifdef LAYER_FN
+ #define LSFT_FN TD(TD_LSFT_FN)
+ #define RCTL_FN TD(TD_RCTL_FN)
+ #define FN_RCTL TD(TD_FN_RCTL)
+#endif
enum tap_dance {
TD_DST_A_R,
- TD_RAL_LAL,
TD_RAL_RGU,
TD_RCT_RSF,
TD_RSF_RCT,
+#ifdef LAYER_FN
TD_LSFT_FN,
TD_RCTL_FN,
TD_FN_RCTL,
+#endif
};
diff --git a/users/kuchosauronad0/.gitignore b/users/kuchosauronad0/.gitignore
new file mode 100644
index 0000000000..6878d13e7c
--- /dev/null
+++ b/users/kuchosauronad0/.gitignore
@@ -0,0 +1,3 @@
+secrets.c
+secrets.h
+kuchosauronad0_song_list.h
diff --git a/users/kuchosauronad0/combo.c b/users/kuchosauronad0/combo.c
new file mode 100644
index 0000000000..b4e8e84ae5
--- /dev/null
+++ b/users/kuchosauronad0/combo.c
@@ -0,0 +1,27 @@
+#include "combo.h"
+
+void process_combo_event(uint8_t combo_index, bool pressed){
+ switch(combo_index) {
+ case ZV_COPY:
+ if (pressed) {
+ tap_code16(LCTL(KC_C));
+ }
+ break;
+ case XV_CUT:
+ if (pressed) {
+ tap_code16(LCTL(KC_X));
+ }
+ break;
+
+ case CV_PASTE:
+ if (pressed) {
+ tap_code16(LCTL(KC_V));
+ }
+ break;
+ case QP_SLEEP:
+ if (pressed) {
+ tap_code16(KC_SYSTEM_SLEEP);
+ }
+ break;
+ }
+}
diff --git a/users/kuchosauronad0/combo.h b/users/kuchosauronad0/combo.h
new file mode 100644
index 0000000000..e2ff09ab5a
--- /dev/null
+++ b/users/kuchosauronad0/combo.h
@@ -0,0 +1,21 @@
+#pragma once
+#include "quantum.h"
+enum combo_events {
+ ZV_COPY,
+ XV_CUT,
+ CV_PASTE,
+ QP_SLEEP
+};
+
+const uint16_t PROGMEM copy_combo[] = {KC_Z, KC_V, COMBO_END};
+const uint16_t PROGMEM cut_combo[] = {KC_X, KC_V, COMBO_END};
+const uint16_t PROGMEM paste_combo[] = {KC_C, KC_V, COMBO_END};
+const uint16_t PROGMEM sleep_combo[] = {KC_Q, KC_P, COMBO_END};
+
+combo_t key_combos[COMBO_COUNT] = {
+ [ZV_COPY] = COMBO_ACTION(copy_combo),
+ [XV_CUT] = COMBO_ACTION(cut_combo),
+ [CV_PASTE] = COMBO_ACTION(paste_combo),
+ [QP_SLEEP] = COMBO_ACTION(sleep_combo),
+};
+
diff --git a/users/kuchosauronad0/config.h b/users/kuchosauronad0/config.h
new file mode 100644
index 0000000000..b06c9e2c56
--- /dev/null
+++ b/users/kuchosauronad0/config.h
@@ -0,0 +1,90 @@
+#pragma once
+
+#ifdef AUDIO_ENABLE
+# define DEFAULT_LAYER_SONGS \
+ { SONG(QWERTY_SOUND), SONG(COLEMAK_SOUND), SONG(DVORAK_SOUND), SONG(PLOVER_SOUND) }
+# define AUDIO_CLICKY
+# define STARTUP_SONG SONG(RICK_ROLL)
+# define GOODBYE_SONG SONG(SONIC_RING)
+# define AUDIO_CLICKY_FREQ_RANDOMNESS 1.5f
+# ifndef __arm__
+# undef NOTE_REST
+# define NOTE_REST 1.00f
+# endif // !__arm__
+# define UNICODE_SONG_OSX SONG(RICK_ROLL)
+# define UNICODE_SONG_LNX SONG(RICK_ROLL)
+# define UNICODE_SONG_WIN SONG(RICK_ROLL)
+# define UNICODE_SONG_BSD SONG(RICK_ROLL)
+# define UNICODE_SONG_WINC SONG(RICK_ROLL)
+#endif // !AUDIO_ENABLE
+
+#ifdef RGBLIGHT_ENABLE
+# define RGBLIGHT_SLEEP
+# undef RGBLIGHT_ANIMATIONS
+# define RGBLIGHT_HUE_STEP 16
+# define RGBLIGHT_SAT_STEP 16
+# define RGBLIGHT_VAL_STEP 16
+# define RGBLIGHT_LIMIT_VAL 255
+# define RGBLIGHT_EFFECT_BREATHING
+# define RGBLIGHT_EFFECT_STATIC_GRADIENT
+//# define RGBLIGHT_EFFECT_KNIGHT
+//# define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2
+//# define RGBLIGHT_EFFECT_SNAKE
+//# define RGBLIGHT_EFFECT_SNAKE_LENGTH 2
+#endif // !RGBLIGHT_ENABLE
+
+#ifndef ONESHOT_TAP_TOGGLE
+# define ONESHOT_TAP_TOGGLE 2
+#endif // !ONESHOT_TAP_TOGGLE
+
+#ifndef ONESHOT_TIMEOUT
+# define ONESHOT_TIMEOUT 3000
+#endif// !ONESHOT_TIMEOUT
+
+#ifndef QMK_KEYS_PER_SCAN
+# define QMK_KEYS_PER_SCAN 4
+#endif // !QMK_KEYS_PER_SCAN
+
+#if defined(LEADER_ENABLE)
+# define LEADER_PER_KEY_TIMING
+# define LEADER_TIMEOUT 250
+#endif // !LEADER_ENABLE
+
+#if defined(COMBO_ENABLE)
+# define COMBO_COUNT 4
+# define COMBO_TERM 150
+#endif // !COMBO_ENABLE
+
+#if defined(NKRO_ENABLE)
+# define FORCE_NKRO
+#endif // !NKRO_ENABLE
+
+// this makes it possible to do rolling combos (zx) with keys that
+// convert to other keys on hold (z becomes ctrl when you hold it,
+// and when this option isn't enabled, z rapidly followed by x
+// actually sends Ctrl-x. That's bad.)
+#define IGNORE_MOD_TAP_INTERRUPT
+#undef PERMISSIVE_HOLD
+//#define TAPPING_FORCE_HOLD
+//#define RETRO_TAPPING
+
+#ifndef TAPPING_TOGGLE
+# define TAPPING_TOGGLE 1
+#endif
+
+#ifdef TAPPING_TERM
+# undef TAPPING_TERM
+#endif // !TAPPING_TERM
+#if defined(KEYBOARD_handwired_kuchosauronad0_planckenstein)
+# define TAPPING_TERM 185
+#elif defined(KEYBOARD_c39)
+# define TAPPING_TERM 200
+#else
+# define TAPPING_TERM 180
+#endif
+
+
+#define TAP_CODE_DELAY 5
+
+#define MACRO_TIMER 5
+
diff --git a/users/kuchosauronad0/encoder.c b/users/kuchosauronad0/encoder.c
new file mode 100644
index 0000000000..06b7b51233
--- /dev/null
+++ b/users/kuchosauronad0/encoder.c
@@ -0,0 +1,63 @@
+#include "encoder.h"
+void encoder_update_user(uint8_t index, bool clockwise) {
+ static uint16_t kc;
+ uint8_t temp_mod = get_mods();
+ if (index == 0) { /* first encoder */
+ if (clockwise) {
+ //if (temp_mod & MOD_BIT(KC_HYPR)){ // TODO: not how this works, only registers CTRL
+ if ((temp_mod & MOD_MASK_CTRL) && (temp_mod & MOD_MASK_SHIFT) && (temp_mod & MOD_MASK_ALT) && (temp_mod & MOD_MASK_GUI)) { // HYPER
+ kc = encoder_actions[0][8];
+ } else if ( (temp_mod & MOD_MASK_SHIFT) && (temp_mod & MOD_MASK_ALT) ) { // ALT+SHIFT
+ kc = encoder_actions[0][7];
+ } else if ( (temp_mod & MOD_MASK_SHIFT) && (temp_mod & MOD_MASK_CTRL) ) { // CTRL+SHIFT
+ kc = encoder_actions[0][6];
+ } else if ( (temp_mod & MOD_MASK_CTRL) && (temp_mod & MOD_MASK_ALT) ) { // CTRL+ALT
+ kc = encoder_actions[0][5];
+ } else if (temp_mod & MOD_MASK_GUI) { // GUI
+ kc = encoder_actions[0][4];
+ } else if (temp_mod & MOD_MASK_SHIFT) { // SHIFT
+ kc = encoder_actions[0][3];
+ } else if (temp_mod & MOD_MASK_ALT) { // ALT
+ kc = encoder_actions[0][2];
+ } else if (temp_mod & MOD_MASK_CTRL) { // CTRL
+ kc = encoder_actions[0][1];
+ } else { // None
+ kc = encoder_actions[0][0];
+ }
+ } else { // Counter Clockwise
+ if ((temp_mod & MOD_MASK_CTRL) && (temp_mod & MOD_MASK_SHIFT) && (temp_mod & MOD_MASK_ALT) && (temp_mod & MOD_MASK_GUI)) { // HYPER
+ kc = encoder_actions[1][8];
+ } else if ( (temp_mod & MOD_MASK_SHIFT) && (temp_mod & MOD_MASK_ALT) ) { // ALT+SHIFT
+ kc = encoder_actions[1][7];
+ } else if ( (temp_mod & MOD_MASK_SHIFT) && (temp_mod & MOD_MASK_CTRL) ) { // CTRL+SHIFT
+ kc = encoder_actions[1][6];
+ } else if ( (temp_mod & MOD_MASK_CTRL) && (temp_mod & MOD_MASK_ALT) ) { // CTRL+ALT
+ kc = encoder_actions[1][5];
+ } else if (temp_mod & MOD_MASK_GUI) { // GUI
+ kc = encoder_actions[1][4];
+ } else if (temp_mod & MOD_MASK_SHIFT) { // SHIFT
+ kc = encoder_actions[1][3];
+ } else if (temp_mod & MOD_MASK_ALT) { // ALT
+ kc = encoder_actions[1][2];
+ } else if (temp_mod & MOD_MASK_CTRL) { // CTRL
+ kc = encoder_actions[1][1];
+ } else { // None
+ kc = encoder_actions[1][0];
+ }
+ }
+ clear_mods();
+ tap_code16(kc);
+ set_mods(temp_mod);
+ } else if (index == 1){ // second Encoder
+ if (clockwise) {
+ tap_code(KC_0);
+ } else{
+ tap_code(KC_1);
+ }
+ }
+}
+const uint16_t PROGMEM encoder_actions[][9] = { \
+// None CTRL ALT SHIFT GUI CTRL+ALT CTRL+SHFT ALT+SHFT HYPER
+ { KC_PGDN, KC_DOWN, KC_AUDIO_VOL_UP, KC_END, KC_WWW_FORWARD, KC_AUDIO_MUTE, KC_RIGHT, LSFT(KC_TAB), KC_MEDIA_NEXT_TRACK}, \
+ { KC_PGUP, KC_UP, KC_AUDIO_VOL_DOWN, KC_HOME, KC_WWW_BACK, KC_MEDIA_PLAY_PAUSE, KC_LEFT, KC_TAB, KC_MEDIA_PREV_TRACK}
+};
diff --git a/users/kuchosauronad0/encoder.h b/users/kuchosauronad0/encoder.h
new file mode 100644
index 0000000000..2610c9677a
--- /dev/null
+++ b/users/kuchosauronad0/encoder.h
@@ -0,0 +1,4 @@
+#pragma once
+#include "quantum.h"
+const uint16_t PROGMEM encoder_actions[][9];
+void encoder_update_user(uint8_t index, bool clockwise);
diff --git a/users/kuchosauronad0/kuchosauronad0.c b/users/kuchosauronad0/kuchosauronad0.c
new file mode 100644
index 0000000000..6c38d0f106
--- /dev/null
+++ b/users/kuchosauronad0/kuchosauronad0.c
@@ -0,0 +1,197 @@
+/*
+Copyright 2019 Andre Poley <andre.poley@mailbox.org>
+
+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 "quantum.h"
+#include "kuchosauronad0.h"
+
+userspace_config_t userspace_config;
+#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
+# define KUCHOSAURONAD0_UNICODE_MODE UC_WINC
+#else
+# define KUCHOSAURONAD0_UNICODE_MODE 2 // set to 2 for UC_WIN, set to 4 for UC_WINC
+#endif
+
+
+// Add reconfigurable functions here, for keymap customization
+// This allows for a global, userspace functions, and continued
+// customization of the keymap. Use _keymap instead of _user
+// functions in the keymaps
+__attribute__ ((weak))
+void matrix_init_keymap(void) {}
+
+// Call user matrix init, set default RGB colors and then
+// call the keymap's init function
+void matrix_init_user(void) {
+ userspace_config.raw = eeconfig_read_user();
+
+ #ifdef BOOTLOADER_CATERINA
+ DDRD &= ~(1<<5);
+ PORTD &= ~(1<<5);
+
+ DDRB &= ~(1<<0);
+ PORTB &= ~(1<<0);
+ #endif
+
+ #if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
+ set_unicode_input_mode(KUCHOSAURONAD0_UNICODE_MODE);
+ get_unicode_input_mode();
+ #endif //UNICODE_ENABLE
+ matrix_init_keymap();
+}
+
+__attribute__((weak))
+void keyboard_post_init_keymap(void){ }
+
+void keyboard_post_init_user(void){
+#ifdef RGBLIGHT_ENABLE
+ keyboard_post_init_rgb();
+#endif
+ keyboard_post_init_keymap();
+}
+
+__attribute__ ((weak))
+void shutdown_keymap(void) {}
+
+void shutdown_user (void) {
+ #ifdef RGBLIGHT_ENABLE
+ rgblight_enable_noeeprom();
+ rgblight_mode_noeeprom(1);
+ rgblight_setrgb_teal();
+ #endif // RGBLIGHT_ENABLE
+ #ifdef RGB_MATRIX_ENABLE
+ // uint16_t timer_start = timer_read();
+ // rgb_matrix_set_color_all( 0xFF, 0x00, 0x00 );
+ // while(timer_elapsed(timer_start) < 250) { wait_ms(1); }
+ #endif //RGB_MATRIX_ENABLE
+ shutdown_keymap();
+}
+
+__attribute__ ((weak))
+void suspend_power_down_keymap(void) {}
+
+void suspend_power_down_user(void) {
+ suspend_power_down_keymap();
+}
+
+__attribute__ ((weak))
+void suspend_wakeup_init_keymap(void) {}
+
+void suspend_wakeup_init_user(void) {
+ suspend_wakeup_init_keymap();
+}
+
+
+__attribute__ ((weak))
+void matrix_scan_keymap(void) {}
+
+__attribute__ ((weak))
+void matrix_scan_user(void){
+ static bool has_ran_yet;
+ if (!has_ran_yet) {
+ has_ran_yet = true;
+ startup_user();
+ }
+
+#ifdef TAP_DANCE_ENABLE // Run Diablo 3 macro checking code.
+// run_diablo_macro_check();
+#endif // !TAP_DANCE_ENABLE
+
+#ifdef RGBLIGHT_ENABLE
+ matrix_scan_rgb();
+#endif // !RGBLIGHT_ENABLE
+
+ matrix_scan_keymap();
+}
+
+__attribute__ ((weak))
+uint32_t layer_state_set_keymap (uint32_t state) {
+ return state;
+}
+
+// on layer change, no matter where the change was initiated
+// Then runs keymap's layer change check
+uint32_t layer_state_set_user(uint32_t state) {
+ state = update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST);
+#ifdef RGBLIGHT_ENABLE
+ state = layer_state_set_rgb(state);
+#endif // RGBLIGHT_ENABLE
+ return layer_state_set_keymap (state);
+}
+
+
+__attribute__ ((weak))
+uint32_t default_layer_state_set_keymap (uint32_t state) {
+ return state;
+}
+
+// Runs state check and changes underglow color and animation
+uint32_t default_layer_state_set_user(uint32_t state) {
+ state = default_layer_state_set_keymap(state);
+#if 0
+#ifdef RGBLIGHT_ENABLE
+ state = default_layer_state_set_rgb(state);
+#endif // RGBLIGHT_ENABLE
+#endif
+ return state;
+}
+
+__attribute__ ((weak))
+void led_set_keymap(uint8_t usb_led) {}
+
+// Any custom LED code goes here.
+// So far, I only have keyboard specific code,
+// So nothing goes here.
+void led_set_user(uint8_t usb_led) {
+ led_set_keymap(usb_led);
+}
+__attribute__ ((weak))
+void eeconfig_init_keymap(void) {}
+
+void eeconfig_init_user(void) {
+ userspace_config.raw = 0;
+ userspace_config.rgb_layer_change = true;
+ eeconfig_update_user(userspace_config.raw);
+ #if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
+ set_unicode_input_mode(KUCHOSAURONAD0_UNICODE_MODE);
+ get_unicode_input_mode();
+ #else
+ eeprom_update_byte(EECONFIG_UNICODEMODE, KUCHOSAURONAD0_UNICODE_MODE);
+ #endif
+ eeconfig_init_keymap();
+ keyboard_init();
+}
+
+// TMUX stuff
+void tmux_prefix(void) {
+ register_code(KC_LCTL);
+ tap_code(KC_B);
+ unregister_code(KC_LCTL);
+}
+
+
+void tmux_pane_last(void) {
+ tmux_prefix();
+ tap_code(KC_SCLN);
+}
+
+void tmux_pane_switch_repeat(void) {
+ tmux_pane_last();
+ tap_code(KC_UP);
+ tap_code(KC_ENT);
+ tmux_pane_last();
+}
+
+/* vi: ft=c:tw=80:sw=2:ts=2:sts=2:et */
diff --git a/users/kuchosauronad0/kuchosauronad0.h b/users/kuchosauronad0/kuchosauronad0.h
new file mode 100644
index 0000000000..da996457c6
--- /dev/null
+++ b/users/kuchosauronad0/kuchosauronad0.h
@@ -0,0 +1,109 @@
+#pragma once
+
+#include "quantum.h"
+
+#include "version.h"
+#include "eeprom.h"
+#include "wrappers.h"
+#include "process_records.h"
+
+#ifdef TAP_DANCE_ENABLE
+# include "tap_dances.h"
+# define KC_TMX TD(TD_TMX) // tap1: 't' tap2: <CTL>+b
+# define KC_EOL TD(TD_EOL) // tap1: 'e' tap2: <CTL>+e
+# define KC_BOL TD(TD_BOL) // tap1: 'a' tap2: <CTL>+a
+# define KC_NW TD(TD_NW) // tap1: 'f' tap2: <ALT>+f
+# define KC_PW TD(TD_PW) // tap1: 'b' tap2: <ALT>+b
+# define KC_DW TD(TD_DW) // tap1: 'w' tap2: <CTL>+w
+#endif //!TAP_DANCE_ENABLE
+
+#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
+# include "rgblight_user.h"
+#endif
+
+#if defined(UNICODEMAP_ENABLE) || defined(UNICODE_ENABLE)
+# include "unicode.h"
+#endif //!UNICODE_ENABLE
+
+// Keycode aliases
+#define TM_X LCTL(KC_B) // Tmux leader key
+// Unix QoL macros
+#define MC_BOL LCTL(KC_A) // jump to beginning of line
+#define MC_EOL LCTL(KC_E) // jump to end of line
+#define MC_NW LALT(KC_F) // next word
+#define MC_PW LALT(KC_B) // previous word
+#define MC_DW LCTL(KC_W) // delete word
+
+// Define layer names
+enum userspace_layers {
+ _QWERTY = 0,
+ _NUMLOCK = 0,
+ _COLEMAK,
+ _DVORAK,
+ _WORKMAN,
+/* _NORMAN,
+ _MALTRON,
+ _EUCALYN,
+ _CARPLAX, */
+ _PLOVER,
+ _UNICODE,
+ _MODS, /* layer 8 now 9*/
+ _GAMEPAD,
+ _DIABLO,
+ _MACROS,
+ _MEDIA,
+ _LOWER,
+ _RAISE,
+ _ADJUST,
+};
+
+bool mod_key_press_timer (uint16_t code, uint16_t mod_code, bool pressed);
+bool mod_key_press (uint16_t code, uint16_t mod_code, bool pressed, uint16_t this_timer);
+bool send_game_macro(const char *str, keyrecord_t *record, bool override);
+void matrix_init_keymap(void);
+void shutdown_keymap(void);
+void suspend_power_down_keymap(void);
+void suspend_wakeup_init_keymap(void);
+void matrix_scan_keymap(void);
+uint32_t layer_state_set_keymap (uint32_t state);
+uint32_t default_layer_state_set_keymap (uint32_t state);
+void led_set_keymap(uint8_t usb_led);
+void eeconfig_init_keymap(void);
+
+void tmux_prefix(void);
+void tmux_pane_zoom(void);
+void tmux_pane_last(void);
+void tmux_pane_switch_repeat(void);
+void tmux_pane_switch(uint16_t keycode);
+
+typedef union {
+ uint32_t raw;
+ struct {
+ bool rgb_layer_change :1;
+ bool is_overwatch :1;
+ bool nuke_switch :1;
+ uint8_t unicode_mod :4;
+ bool swapped_numbers :1;
+ };
+} userspace_config_t;
+
+extern userspace_config_t userspace_config;
+
+/*
+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
+# 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
+
+/* vi: ft=c:tw=80:sw=2:ts=2:sts=2:et */
diff --git a/users/kuchosauronad0/leader.c b/users/kuchosauronad0/leader.c
new file mode 100644
index 0000000000..22674eef05
--- /dev/null
+++ b/users/kuchosauronad0/leader.c
@@ -0,0 +1,116 @@
+#include "leader.h"
+#ifdef RGBLIGHT_ENABLE
+extern rgblight_config_t rgblight_config;
+#endif
+bool leader_succeed;
+
+LEADER_EXTERNS();
+
+void matrix_scan_user(void) {
+ static bool has_ran_yet;
+ if (!has_ran_yet) {
+ has_ran_yet = true;
+ startup_user();
+ }
+#ifdef TAP_DANCE_ENABLE // Run Diablo 3 macro checking code.
+// run_diablo_macro_check();
+#endif
+#ifdef RGBLIGHT_ENABLE
+ matrix_scan_rgb();
+#endif
+ LEADER_DICTIONARY() {
+ leader_succeed = leading = false;
+
+ SEQ_ONE_KEY(KC_W) {
+ // vim/tmux: Use in command mode in vim: write to file, switch tmux pane in the current session window and repeat the last command
+ SEND_STRING(":w" SS_TAP(X_ENTER));
+ tmux_pane_switch_repeat();
+ leader_succeed = true;
+ } else
+ SEQ_ONE_KEY(KC_T) {
+ // Send the Tmux Prefix
+ tmux_prefix();
+ leader_succeed = true;
+ } else
+ SEQ_ONE_KEY(KC_A) {
+ // tmux: Send the prefix and press 'right' arrow
+ tmux_prefix();
+ tap_code(KC_RIGHT);
+ leader_succeed = true;
+ } else
+ SEQ_TWO_KEYS(KC_T, KC_T) {
+ // tmux: Send the prefix to a nested session
+ tmux_prefix();
+ tmux_prefix();
+ leader_succeed = true;
+ } else
+ SEQ_TWO_KEYS(KC_T, KC_R) {
+ // tmux: Switch pane and repeat last action
+ tmux_pane_switch_repeat();
+ leader_succeed = true;
+ } else
+ SEQ_TWO_KEYS(KC_V, KC_Z){
+ // vim: Zoom pane
+ tap_code16(LCTL(KC_W));
+ tap_code16(LSFT(KC_BSLS));
+ leader_succeed = true;
+ } else
+ SEQ_TWO_KEYS(KC_V, KC_R) {
+ // vim: Substitute and place cursor
+ SEND_STRING(":%s///g" SS_TAP(X_LEFT));
+ tap_code(KC_LEFT);
+ tap_code(KC_LEFT);
+ leader_succeed = true;
+ } else
+ SEQ_TWO_KEYS(KC_V, KC_T) {
+ // vim: move current pane to new tab
+ tap_code16(LCTL(KC_W));
+ tap_code16(LSFT(KC_T));
+ leader_succeed = true;
+ } else
+ SEQ_ONE_KEY(KC_R){
+ // Toggle RGB Layer indicator
+ tap_code16(KC_RGB_T);
+ leader_succeed = true;
+ } else
+ SEQ_ONE_KEY(KC_SPC){
+ // One Shot Unicode layer
+//TODO tap_code16(OS_UNI);
+ leader_succeed = true;
+ } else
+ SEQ_TWO_KEYS(KC_SPC, KC_SPC){
+ // Toggle _MODS
+ tap_code16(TG_MODS);
+ leader_succeed = true;
+ } else
+ SEQ_THREE_KEYS(KC_BSPC, KC_BSPC, KC_BSPC){
+ // Reset the keyboard
+ reset_keyboard();
+ leader_succeed = true;
+ }
+ leader_end();
+ }
+// matrix_scan_keymap();
+}
+
+void leader_start(void) {
+#ifdef RGBLIGHT_ENABLE
+ rgblight_savebase();
+ rgblight_mode_noeeprom(1);
+ rgblight_sethsv_noeeprom_goldenrod();
+#endif
+}
+
+void leader_end(void) {
+// pick color depending of success /fail
+// fade leader_start from 100 to 0
+// fade new color from 0 to 100 to 0
+// fade old color from 0 to 100
+#ifdef RGBLIGHT_ENABLE
+ if (leader_succeed) {
+ fadeflash_leds(HSV_GREEN);
+ } else {
+ fadeflash_leds(HSV_RED);
+ }
+#endif
+}
diff --git a/users/kuchosauronad0/leader.h b/users/kuchosauronad0/leader.h
new file mode 100644
index 0000000000..ed904f3063
--- /dev/null
+++ b/users/kuchosauronad0/leader.h
@@ -0,0 +1,6 @@
+#pragma once
+#include "kuchosauronad0.h"
+
+#include "leader.h"
+
+void matrix_scan_user(void);
diff --git a/users/kuchosauronad0/process_records.c b/users/kuchosauronad0/process_records.c
new file mode 100644
index 0000000000..bec6fa5ad0
--- /dev/null
+++ b/users/kuchosauronad0/process_records.c
@@ -0,0 +1,244 @@
+#include "kuchosauronad0.h"
+
+uint16_t copy_paste_timer;
+
+__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;
+}
+
+// Defines actions for my global custom keycodes. Defined in kuchosauronad0.h file
+// Then runs the _keymap's record handier if not processed here
+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
+ #if defined(KEYBOARD_ergodox_ez) || defined(KEYBOARD_keebio_iris_rev2)
+ xprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.row, record->event.key.col, record->event.pressed);
+ #else
+ xprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed);
+ #endif
+#endif //KEYLOGGER_ENABLE
+
+ switch (keycode) {
+ case KC_QWERTY ... KC_PLOVER:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(keycode - KC_QWERTY);
+ }
+ break;
+
+ case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader
+ if (!record->event.pressed) {
+ uint8_t temp_mod = get_mods();
+ uint8_t temp_osm = get_oneshot_mods();
+ clear_mods(); clear_oneshot_mods();
+ send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), TAP_CODE_DELAY);
+#ifndef MAKE_BOOTLOADER
+ if ( ( temp_mod | temp_osm ) & MOD_MASK_SHIFT )
+#endif
+ {
+ #if defined(__arm__)
+ send_string_with_delay_P(PSTR(":dfu-util"), TAP_CODE_DELAY);
+ #elif defined(BOOTLOADER_DFU)
+ send_string_with_delay_P(PSTR(":dfu"), TAP_CODE_DELAY);
+ #elif defined(BOOTLOADER_HALFKAY)
+ send_string_with_delay_P(PSTR(":teensy"), TAP_CODE_DELAY);
+ #elif defined(BOOTLOADER_CATERINA)
+ send_string_with_delay_P(PSTR(":avrdude"), TAP_CODE_DELAY);
+ #endif // bootloader options
+ }
+ if ( ( temp_mod | temp_osm ) & MOD_MASK_CTRL) { send_string_with_delay_P(PSTR(" -j8 --output-sync"), TAP_CODE_DELAY); }
+ send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), TAP_CODE_DELAY);
+ }
+ break;
+// FLEDERMAUSLAND
+ case MC_QT1: // ""
+ if(record->event.pressed){
+ SEND_STRING("\"\"");
+ tap_code(KC_LEFT);
+ }
+ break;
+ case MC_QT2: // ''
+ if(record->event.pressed){
+ SEND_STRING("''");
+ tap_code(KC_LEFT);
+ }
+ break;
+ case MC_QT3: // `'
+ if(record->event.pressed){
+ SEND_STRING("`'");
+ tap_code(KC_LEFT);
+ }
+ break;
+ case MC_PAR: // Parenthesis
+ if(record->event.pressed){
+ SEND_STRING("()");
+ tap_code(KC_LEFT);
+ }
+ break;
+ case MC_CUR: // Curly bracket
+ if(record->event.pressed){
+ SEND_STRING("{}");
+ tap_code(KC_LEFT);
+ }
+ break;
+ case MC_SQR: // Square bracket
+ if(record->event.pressed){
+ SEND_STRING("[]");
+ tap_code(KC_LEFT);
+ }
+ break;
+ case MC_ABR: // Angle bracket
+ if(record->event.pressed){
+ SEND_STRING("<>");
+ tap_code(KC_LEFT);
+ }
+ break;
+ case MCT_NEW: // New Tmux Session
+ if(record->event.pressed){
+ tmux_prefix();
+ SEND_STRING(":neww");
+ tap_code(KC_ENT);
+ }
+ break;
+ case MCT_SH: // Tmux horizontal split
+ if(record->event.pressed){
+ tmux_prefix();
+ SEND_STRING("%");
+ }
+ break;
+ case MCT_SV: // Tmux vertical split
+ if(record->event.pressed){
+ tmux_prefix();
+ SEND_STRING("\"");
+ }
+ break;
+ case MCT_ZM: // Tmux zoom
+ if(record->event.pressed){
+ tmux_prefix();
+ tap_code(KC_Z);
+ }
+ break;
+ case MCT_SCR: // Tmux scroll mode
+ if(record->event.pressed){
+ tmux_prefix();
+ tap_code(KC_PGUP);
+ }
+ break;
+ case MCT_UP: // Tmux up
+ break;
+ case MCT_DW: // Tmux down
+ break;
+ case MCT_LFT: // Tmux left
+ break;
+ case MCT_RGT: // Tmux right
+ tmux_prefix();
+ tap_code(KC_RIGHT);
+ break;
+ case MCV_B: // Vim begin of line
+ if(record->event.pressed){
+ tap_code(KC_0);
+ }
+ break;
+ case MCV_E: // Vim end of line
+ if(record->event.pressed){
+ SEND_STRING(":vsplit");
+ tap_code(KC_ENT);
+ }
+ break;
+ case MCT_F: // Vim for loop
+ if(record->event.pressed){
+ SEND_STRING(":help");
+ tap_code(KC_ENT);
+ }
+ break;
+ 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;
+// These are a series of gaming macros.
+// Only enables for the viterbi, basically,
+// to save on firmware space, since it's limited.
+#ifdef MACROS_ENABLED
+ case KC_OVERWATCH: // Toggle's if we hit "ENTER" or "BACKSPACE" to input macros
+ if (record->event.pressed) { userspace_config.is_overwatch ^= 1; eeconfig_update_user(userspace_config.raw); }
+#ifdef RGBLIGHT_ENABLE
+// userspace_config.is_overwatch ? rgblight_mode_noeeprom(17) : rgblight_mode_noeeprom(18);
+#endif //RGBLIGHT_ENABLE
+ break;
+ case KC_SALT:
+ return send_game_macro("Salt, salt, salt...", record, false);
+ case KC_MORESALT:
+ return send_game_macro("Please sir, can I have some more salt?!", record, false);
+ case KC_SALTHARD:
+ return send_game_macro("Your salt only makes me harder, and even more aggressive!", record, false);
+ case KC_GOODGAME:
+ return send_game_macro("Good game, everyone!", record, false);
+ case KC_GLHF:
+ return send_game_macro("Good luck, have fun!!!", record, false);
+ case KC_SYMM:
+ return send_game_macro("Left click to win!", record, false);
+ case KC_JUSTGAME:
+ return send_game_macro("It may be a game, but if you don't want to actually try, please go play AI, so that people that actually want to take the game seriously and \"get good\" have a place to do so without trolls like you throwing games.", record, false);
+ case KC_TORB:
+ return send_game_macro("That was positively riveting!", record, false);
+ case KC_AIM:
+ send_game_macro("That aim is absolutely amazing. It's almost like you're a machine!", record, true);
+ return send_game_macro("Wait! That aim is TOO good! You're clearly using an aim hack! CHEATER!", record, false);
+ case KC_C9:
+ return send_game_macro("OMG!!! C9!!!", record, false);
+ case KC_GGEZ:
+ return send_game_macro("That was a fantastic game, though it was a bit easy. Try harder next time!", record, false);
+#endif // MACROS_ENABLED
+
+ 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
+ register_code(KC_LCTL);
+ tap_code(KC_C);
+ unregister_code(KC_LCTL);
+ } else { // Tap, paste
+ register_code(KC_LCTL);
+ tap_code(KC_V);
+ unregister_code(KC_LCTL);
+ }
+ }
+ break;
+
+// Unicode
+#ifdef UNICODE_ENABLE
+ case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻
+ if (record->event.pressed) {
+ send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B");
+ }
+ break;
+ case UC_TABL: // ┬┬ノ( º _ ºノ)
+ if (record->event.pressed) {
+ send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 30CE 0029");
+ }
+ break;
+ case UC_SHRG: // ¯\_(ツ)_/¯
+ if (record->event.pressed) {
+ send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF");
+ }
+ break;
+ case UC_DISA: // ಠ_ಠ
+ if (record->event.pressed) {
+ send_unicode_hex_string("0CA0 005F 0CA0");
+ }
+ break;
+#endif //!Unicode
+}
+ return process_record_keymap(keycode, record) &&
+#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
+ process_record_user_rgb(keycode, record) &&
+#endif // RGBLIGHT_ENABLE
+ process_record_secrets(keycode, record);
+}
diff --git a/users/kuchosauronad0/process_records.h b/users/kuchosauronad0/process_records.h
new file mode 100644
index 0000000000..d3d4c4fe83
--- /dev/null
+++ b/users/kuchosauronad0/process_records.h
@@ -0,0 +1,91 @@
+#pragma once
+#include "kuchosauronad0.h"
+
+#if defined(KEYMAP_SAFE_RANGE)
+# define PLACEHOLDER_SAFE_RANGE KEYMAP_SAFE_RANGE
+#else
+# define PLACEHOLDER_SAFE_RANGE SAFE_RANGE
+#endif
+
+enum userspace_custom_keycodes{
+ VRSN = PLACEHOLDER_SAFE_RANGE, // Prints QMK Firmware and board info
+ KC_QWERTY, // Sets default layer to QWERTY
+ KC_COLEMAK, // Sets default layer to COLEMAK
+ KC_DVORAK, // Sets default layer to DVORAK
+ KC_WORKMAN, // Sets default layer to WORKMAN
+ KC_PLOVER, // Sets default layer to PLOVER
+
+ KC_MAKE, // Run keyboard's customized make command
+ KC_RGB_T, // Toggles RGB Layer Indication mode
+ KC_SECRET_1,
+ KC_SECRET_2,
+ KC_SECRET_3,
+ KC_SECRET_4,
+ KC_SECRET_5,
+ KC_CCCV, // Hold to copy, tap to paste
+ KC_NUKE, // NUCLEAR LAUNCH DETECTED!!!
+ UC_FLIP, // (ಠ痊ಠ)┻━┻
+ UC_TABL, // ┬┬ノ( º _ ºノ)
+ UC_SHRG, // ¯\_(ツ)_/¯
+ UC_DISA, // ಠ_ಠ
+
+ MC_QT1, // ""
+ MC_QT2, // ''
+ MC_QT3, // `'
+ MC_PAR, // Parenthesis
+ MC_CUR, // Curly bracket
+ MC_SQR, // Square bracket
+ MC_ABR, // Angle bracket
+ MCT_NEW, // New Tmux Session
+ MCT_SH, // Tmux horizontal split
+ MCT_SV, // Tmux vertical split
+ MCT_ZM, // Tmux zoom
+ MCT_SCR, // Tmux scroll mode
+ MCT_UP, // Tmux up
+ MCT_DW, // Tmux down
+ MCT_LFT, // Tmux left
+ MCT_RGT, // Tmux right
+ MCV_B, // Vim begin of line
+ MCV_E, // Vim end of line
+ MCT_F, // Vim for loop
+ MCG_A, // Git add
+ MCG_C, // Git commit
+ MCG_P, // Git push
+ MCG_R, // Git revert
+ MCG_L, // Git log
+ MCG_S, // Git status
+
+ NEW_SAFE_RANGE //use "NEWPLACEHOLDER for keymap specific codes
+ };
+
+bool process_record_secrets(uint16_t keycode, keyrecord_t *record);
+bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record);
+bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
+
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+#define ADJUST MO(_ADJUST)
+#define TG_MODS TG(_MODS)
+#define TG_GAME TG(_GAMEPAD)
+#define OS_LWR OSL(_LOWER)
+#define OS_RSE OSL(_RAISE)
+#define OS_UNI OSL(_UNICODE)
+
+#define SEC1 KC_SECRET_1
+#define SEC2 KC_SECRET_2
+#define SEC3 KC_SECRET_3
+#define SEC4 KC_SECRET_4
+#define SEC5 KC_SECRET_5
+#define SEC6 KC_SECRET_6
+
+#define QWERTY KC_QWERTY
+#define DVORAK KC_DVORAK
+#define COLEMAK KC_COLEMAK
+#define WORKMAN KC_WORKMAN
+#define PLOVER KC_PLOVER
+
+#define KC_RESET RESET
+#define KC_RST KC_RESET
+
+#define UC_IRNY UC(0x2E2E)
+#define UC_CLUE UC(0x203D)
diff --git a/users/kuchosauronad0/readme.md b/users/kuchosauronad0/readme.md
new file mode 100644
index 0000000000..b577eedb70
--- /dev/null
+++ b/users/kuchosauronad0/readme.md
@@ -0,0 +1,217 @@
+# Table of Contents
+1. [Overview](#overview)[[documentation](https://docs.qmk.fm/#/feature_userspace)]
+2. [Keyboard Layout Templates](#keyboard-layout-templates)
+3. [Custom Keycodes](#custom-keycodes) [[documentation](https://docs.qmk.fm/#/feature_macros?id=the-new-way-send_string-amp-process_record_user)]
+4. [Tap Dances](#tap-dances) [[documentation](https://docs.qmk.fm/#/feature_tap_dance)]
+5. [Encoders](#encoders) [[documentation](https://docs.qmk.fm/#/feature_encoders)]
+6. [Leader Key](#leader-key) [[documentation](https://docs.qmk.fm/#/feature_leader_key)]
+7. [Unicode](#unicode) [[documentation](https://docs.qmk.fm/#/feature_unicode)]
+8. [Combo Keys](#combo-keys) [[documentation](https://docs.qmk.fm/#/feature_combo)]
+9. [Secret Macros](#secret-macros) [[documentation](https://github.com/qmk/qmk_firmware/blob/master/users/drashna/readme_secrets.md)]
+
+# [Overview](#overview)
+Thanks to [drashna](https://github.com/drashna) and the people of the discord server and everyone else in the qmk_firmware/users/ directory :)
+
+## [Keyboard Layout Templates](#keyboard-layout-temple)
+This borrows from [jola5](https://github.com/jola5)'s "Not quite neo" code. The code of the userspace is shared between all keyboards, so that one can maintain functionality of all keyboards at once by modifying a few files in a central location.
+
+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.
+
+Credit goes to [jola5](https://github.com/jola5) for first implementing this awesome idea.
+
+## [Custom Keycodes](#custom-keycodes)
+Declared in `process_records.h` and `template.h` and defined in `process_record_user` in template.c
+
+## [Tap Dances](#tap-dances)
+To enable set `TAP_DANCE_ENABLE = yes` in *rules.mk*. See file *tap_dances.{c,h}*
+
+TODO: Command-line movement stuff is a pain when typing normally
+
+TODO: Make use of `TD_SPC` and `TD_QT{1..3}`
+
+## [Leader Key](#leader-key)
+To enable set `LEADER_ENABLE = yes` in file *rules.mk*
+
+|LEADER_DICTIONARY()|program| description |
+|---|---|---|
+| W |vim/tmux| save file, switch pane and repeat last command |
+| T |tmux| send default prefix |
+| A |tmux| switch pane|
+|T + T|tmux| send default prefix to a nested session |
+|T + R|tmux| switch pane and repeat last command |
+|V + Z|vim | zoom current split|
+|V + R|vim | search and replace|
+|V + T|vim | move current split to its own tab|
+|3x Backspace|keyboard| Reset Keyboard |
+
+`LEADER_DICTIONARY()` is defined in *leader.c*
+
+## [Combo Keys](#combo-keys)
+To enable set `COMBO_ENABLE = yes` in file *rules.mk*.
+Number of combos and timeout are defined in *config.h*
+
+Press key chord to use.
+
+|Combo|description |
+|---|---|
+| CV | Paste |
+| XC | Cut |
+| ZV | Copy |
+| QP | KC_SLEEP |
+
+Combos are defined in *combo.h* and *combo.c*
+
+## [Unicode](#unicode)
+To enable set `UNICODE_ENABLE = yes` or `UNICODEMAP_ENABLE = yes` in file *rules.mk*
+
+## [Encoders](#encoders)
+To enable set `ENCODER_ENABLE = yes` in *rules.mk*.
+
+In the keyboard's *config.h* adjust according to your keyboard:
+
+```c
+// Example ProMicro
+#define ENCODERS_PAD_A { F4 } //PIN A3
+#define ENCODERS_PAD_B { F5 } //PIN A2
+```
+
+Check the [documentation](https://docs.qmk.fm/#/feature_encoders) for more information
+The first rotary encoder is configured such as:
+
+|Modifier|description|
+|---|---|
+| None | General navigation. Page up/down |
+| SHIFT | Fast navigation. Home/end |
+| CTRL | Vertical navigation. Up/down |
+| CTRL+SHIFT | Horizontal navigation. Left/right |
+| ALT | Audio volume control. |
+| GUI | Browser navigation(windows). Forward/backward |
+| ALT+SHIFT | Form navigation. Tab up/down |
+| ALT+CTRL | Media control. (Play|pause)/mute |
+| HYPER | Media navigation. Next/prev track |
+
+Key codes are stored as `uint16_t encoder_actions[2][9]` in *encoder.c*
+
+
+## Diablo Layer
+Currently not in use.
+[Back to Top](#table-of-contents)
+
+# [Secret Macros](#secret-macros)
+To enable set `NO_SECRETS = yes` in *rules.mk*.
+
+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 defined in your *<name>.h* file to define the keycodes for the new macros.
+
+
+### .git/info/exclude
+
+```console
+# git ls-files --others --exclude-from=.git/info/exclude
+# Lines that start with '#' are comments.
+# For a project mostly in C, the following would be a good set of
+# exclude patterns (uncomment them if you want to use them):
+# *.[oa]
+# *~
+/users/<name>/secrets.c
+/users/<name>/secrets.h
+```
+
+Then you can create these files:
+
+### secrets.c
+
+```c
+#include "<name>.h" // replace <name> with your keymap's "h" file, or whatever file stores the keycodes
+
+#if (__has_include("secrets.h") && !defined(NO_SECRETS))
+#include "secrets.h"
+#else
+// `PROGMEM const char secret[][x]` may work better, but it takes up more space in the firmware
+// And I'm not familiar enough to know which is better or why...
+static const char * const secret[] = {
+ "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_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
+ send_string_with_delay(secret[keycode - KC_SECRET_1], MACRO_TIMER);
+ }
+ return false;
+ break;
+ }
+ return true;
+}
+```
+
+### secrets.h
+
+```c
+static const char * const secrets[] = {
+ "secret1",
+ "secret2",
+ "secret3",
+ "secret4",
+ "secret5"
+};
+```
+
+Replacing the strings with the codes that you need.
+
+### name.c
+
+In the *<name>.c* file, 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
+ 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. To do so, add this block:
+
+```make
+ifneq ("$(wildcard $(USER_PATH)/secrets.c)","")
+ SRC += secrets.c
+endif
+```
+
+Additionally, 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
+ifeq ($(strip $(NO_SECRETS)), yes)
+ OPT_DEFS += -DNO_SECRETS
+endif
+```
+
+Then, if you run `make keyboard:name NO_SECRETS=yes`, it will default to the test strings in your *<name>.c* file, rather than reading from your file.
+[Back to Top](#table-of-contents)
diff --git a/users/kuchosauronad0/rgblight_user.c b/users/kuchosauronad0/rgblight_user.c
new file mode 100644
index 0000000000..63e412c557
--- /dev/null
+++ b/users/kuchosauronad0/rgblight_user.c
@@ -0,0 +1,156 @@
+#include "rgblight_user.h"
+extern rgblight_config_t rgblight_config;
+bool has_initialized;
+uint8_t base_hue; // Hue value of base state
+uint8_t base_sat; // Saturation value of base state
+uint8_t base_val; // Brightness value of base state
+uint8_t base_mod; // Animation mode of the base state
+
+void rgblight_savebase(void) { // Save the current settings to ram
+ base_hue = rgblight_config.hue;
+ base_sat = rgblight_config.sat;
+ base_val = rgblight_config.val;
+ base_mod = rgblight_config.mode;
+}
+void rgblight_loadbase(void) { // Load settings from ram to eeprom
+ rgblight_mode( base_mod );
+ rgblight_sethsv_eeprom_helper(base_hue, base_sat, base_val, true);
+}
+
+
+
+bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) {
+ if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) {
+ keycode = keycode & 0xFF;
+ }
+ switch (keycode) {
+ case KC_RGB_T: // Switch between underglow layer indication and normal qmk behaviour
+#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
+ if (record->event.pressed) {
+ userspace_config.rgb_layer_change ^= 1;
+ xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change);
+ eeconfig_update_user(userspace_config.raw);
+ if (userspace_config.rgb_layer_change) {
+ layer_state_set(layer_state); // Immediately set the layer color (looks better)
+ }
+ }
+#endif // RGBLIGHT_ENABLE
+ return false;
+ break;
+#ifdef RGBLIGHT_ENABLE
+ case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // quantum_keycodes.h L400 for definitions
+ if (record->event.pressed) { // 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;
+ xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change);
+ eeconfig_update_user(userspace_config.raw);
+ }
+ }
+ return true;
+ break;
+#endif // RGBLIGHT_ENABLE
+ }
+ return true;
+}
+
+void keyboard_post_init_rgb(void) {
+# if defined(RGBLIGHT_ENABLE) || defined(RGBLIGHT_STARTUP_ANIMATION)
+ bool is_enabled = rgblight_config.enable;
+ if (userspace_config.rgb_layer_change) {
+ rgblight_enable_noeeprom();
+ }
+ if (rgblight_config.enable) {
+ layer_state_set_user(layer_state);
+ uint16_t old_hue = rgblight_config.hue;
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
+ for (uint16_t i = 255; i > 0; i--) {
+ rgblight_sethsv_noeeprom((i + old_hue) % 255, 255, 255);
+ wait_ms(5);
+ }
+ }
+ if (!is_enabled) {
+ rgblight_disable_noeeprom();
+ }
+# endif // !RGBLIGHT_ENABLE || RGBLIGHT_STARTUP_ANIMATION
+ layer_state_set_user(layer_state);
+}
+
+void matrix_scan_rgb(void) {
+# ifdef INDICATOR_LIGHTS
+ matrix_scan_indicator();
+# endif
+}
+
+layer_state_t layer_state_set_rgb(layer_state_t state) {
+# ifdef RGBLIGHT_ENABLE
+ if (userspace_config.rgb_layer_change) {
+ switch (biton32(state)) { // _RAISE, _LOWER and _ADJUST use a custom color and the breathing effect
+ case _RAISE:
+ rgblight_sethsv_noeeprom_green();
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3);
+ break;
+ case _LOWER:
+ rgblight_sethsv_noeeprom_red();
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3);
+ break;
+ case _ADJUST:
+ rgblight_sethsv_noeeprom_white();
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 2);
+ break;
+ default: // Use a solid color for normal layers
+ switch (biton32(default_layer_state)) {
+ case _QWERTY:
+ rgblight_sethsv_noeeprom_magenta();
+ break;
+ case _COLEMAK:
+ rgblight_sethsv_noeeprom_green();
+ break;
+ case _DVORAK:
+ rgblight_sethsv_noeeprom_blue();
+ break;
+ case _WORKMAN:
+ rgblight_sethsv_noeeprom_goldenrod();
+ break;
+ case _PLOVER:
+ rgblight_sethsv_noeeprom_pink();
+ break;
+ default:
+ rgblight_sethsv_noeeprom_white();
+ break;
+ }
+ biton32(state) == _MODS ? rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING) : rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); // if _MODS layer is on, then breath to denote it
+ break;
+ }
+ }
+# endif // !RGBLIGHT_ENABLE
+ return state;
+}
+
+#ifdef INDICATOR_LIGHTS
+void matrix_scan_indicator(void) {
+ if (has_initialized) {
+ set_rgb_indicators(get_mods(), host_keyboard_leds(), get_oneshot_mods());
+ }
+}
+#endif // !INDICATOR_LIGHTS
+
+void rgblight_fade_helper(bool direction){
+ // true: increase val = fade in
+ // false: decrease val = fade out
+ for (uint8_t index = 0; index < RGBLIGHT_VAL_STEP ; index++) {
+ direction ? rgblight_increase_val() : rgblight_decrease_val();
+ wait_ms(5);
+ }
+}
+void fadeflash_leds(uint8_t hue, uint8_t sat, uint8_t val){
+ // indicate success / fail of a leader sequence
+ // fade out, set new hue and saturation, fade in, fade out, set old color, fade in
+ // this is used in leader.c
+ // TODO: come up with a better name maybe
+ rgblight_fade_helper(false);
+ rgblight_sethsv_noeeprom(hue, sat, 0);
+ rgblight_fade_helper(true);
+ rgblight_fade_helper(false);
+ rgblight_sethsv_noeeprom(base_hue, base_sat, 0);
+ rgblight_fade_helper(true);
+}
diff --git a/users/kuchosauronad0/rgblight_user.h b/users/kuchosauronad0/rgblight_user.h
new file mode 100644
index 0000000000..eab15b8325
--- /dev/null
+++ b/users/kuchosauronad0/rgblight_user.h
@@ -0,0 +1,23 @@
+#pragma once
+#include "kuchosauronad0.h"
+
+typedef struct {
+ bool enabled;
+ uint8_t hue;
+ uint16_t timer;
+ uint8_t life;
+} rgblight_fadeout;
+const uint8_t RGBLIGHT_FADE_SPEED[6] PROGMEM;
+
+layer_state_t layer_state_set_rgb(layer_state_t state);
+layer_state_t default_layer_state_set_rgb(layer_state_t state);
+
+bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record);
+void scan_rgblight_fadeout(void);
+void keyboard_post_init_rgb(void);
+void matrix_scan_rgb(void);
+void rgblight_sethsv_default_helper(uint8_t index);
+void rgblight_savebase(void);
+void rgblight_loadbase(void);
+void rgblight_fade_helper(bool direction);
+void fadeflash_leds(uint8_t hue, uint8_t sat, uint8_t val);
diff --git a/users/kuchosauronad0/rules.mk b/users/kuchosauronad0/rules.mk
new file mode 100644
index 0000000000..b844d12c92
--- /dev/null
+++ b/users/kuchosauronad0/rules.mk
@@ -0,0 +1,49 @@
+SRC += kuchosauronad0.c \
+ process_records.c
+
+LINK_TIME_OPTIMIZATION_ENABLE = yes
+SPACE_CADET_ENABLE = no
+
+ifneq ($(strip $(RGBLIGHT_ENABLE)),yes )
+ SRC += rgblight_user.c
+endif
+
+ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
+ SRC += tap_dances.c
+endif
+
+ifeq ($(strip $(ENCODER_ENABLE)), yes)
+ SRC += encoder.c
+endif
+
+ifeq ($(strip $(COMBO_ENABLE)), yes)
+ SRC += combo.c
+endif
+
+ifeq ($(strip $(LEADER_ENABLE)), yes)
+ SRC += leader.c
+endif
+
+ifneq ("$(wildcard $(USER_PATH)/secrets.c)","")
+ SRC += secrets.c
+endif
+ifeq ($(strip $(NO_SECRETS)), yes)
+ OPT_DEFS += -DNO_SECRETS
+endif
+ifeq ($(strip $(UNICODEMAP_ENABLE)), yes)
+ SRC += unicode.c
+endif
+
+ifeq ($(strip $(MACROS_ENABLED)), yes)
+ OPT_DEFS += -DMACROS_ENABLED
+endif
+
+ifdef CONSOLE_ENABLE
+ ifeq ($(strip $(KEYLOGGER_ENABLE)), yes)
+ OPT_DEFS += -DKEYLOGGER_ENABLE
+ endif
+endif
+
+ifeq ($(strip $(MAKE_BOOTLOADER)), yes)
+ OPT_DEFS += -DMAKE_BOOTLOADER
+endif
diff --git a/users/kuchosauronad0/tap_dances.c b/users/kuchosauronad0/tap_dances.c
new file mode 100644
index 0000000000..7bdd3d3375
--- /dev/null
+++ b/users/kuchosauronad0/tap_dances.c
@@ -0,0 +1,55 @@
+#include "tap_dances.h"
+void td_parenthesis (qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count == 1) {
+// SEND_STRING ("\(");
+ tap_code(KC_QUOT);
+ reset_tap_dance (state);
+ }
+ else if (state->count == 2) {
+ SEND_STRING("()" SS_TAP(X_LEFT));
+ reset_tap_dance (state);
+ }
+ else if (state->count == 3) {
+ SEND_STRING("[]" SS_TAP(X_LEFT));
+ reset_tap_dance (state);
+ }
+ else if (state->count == 4) {
+ SEND_STRING("{}" SS_TAP(X_LEFT));
+ reset_tap_dance (state);
+ }
+ else if (state->count >= 5) {
+ SEND_STRING("<>" SS_TAP(X_LEFT));
+ reset_tap_dance (state);
+ }
+}
+
+void safe_reset(qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count >= 3) {
+ // Reset the keyboard if you tap the key more than three times
+ reset_keyboard();
+ reset_tap_dance(state);
+ }
+}
+
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [TD_RESET] = ACTION_TAP_DANCE_FN(safe_reset),
+ [TD_NUM1] = ACTION_TAP_DANCE_DOUBLE(KC_1, KC_4),
+ [TD_NUM2] = ACTION_TAP_DANCE_DOUBLE(KC_2, KC_5),
+ [TD_NUM3] = ACTION_TAP_DANCE_DOUBLE(KC_3, KC_6),
+ [TD_QT1] = ACTION_TAP_DANCE_DOUBLE(KC_QUOT, MC_QT1),
+ [TD_QT2] = ACTION_TAP_DANCE_DOUBLE(LSFT(KC_QUOT), MC_QT2),
+ [TD_QT3] = ACTION_TAP_DANCE_DOUBLE(KC_GRV, MC_QT3),
+
+ [TD_TMX] = ACTION_TAP_DANCE_DOUBLE(KC_T, TM_X),
+ [TD_EOL] = ACTION_TAP_DANCE_DOUBLE(KC_E, MC_EOL), // end of line
+ [TD_BOL] = ACTION_TAP_DANCE_DOUBLE(KC_A, MC_BOL), // beginning of line
+ [TD_NW] = ACTION_TAP_DANCE_DOUBLE(KC_F, MC_NW), // next word
+ [TD_PW] = ACTION_TAP_DANCE_DOUBLE(KC_B, MC_PW), // pevious word
+ [TD_DW] = ACTION_TAP_DANCE_DOUBLE(KC_W, MC_DW), // pevious word
+
+ [TD_SPC] = ACTION_TAP_DANCE_FN(td_parenthesis), // \(, (), [], {}, <>
+ [TD_PAR] = ACTION_TAP_DANCE_DOUBLE(KC_LPRN, MC_PAR), // ()
+ [TD_SQR] = ACTION_TAP_DANCE_DOUBLE(KC_LBRC, MC_SQR), // []
+ [TD_CUR] = ACTION_TAP_DANCE_DOUBLE(LSFT(KC_LCBR), MC_CUR),// {}
+ [TD_ABR] = ACTION_TAP_DANCE_DOUBLE(LSFT(KC_COMM), MC_ABR),//
+};
diff --git a/users/kuchosauronad0/tap_dances.h b/users/kuchosauronad0/tap_dances.h
new file mode 100644
index 0000000000..19da8d69dc
--- /dev/null
+++ b/users/kuchosauronad0/tap_dances.h
@@ -0,0 +1,26 @@
+#pragma once
+#include "kuchosauronad0.h"
+
+#ifdef TAP_DANCE_ENABLE
+enum {
+ TD_RESET = 0,
+ TD_SPC, // for special function td_parenthesis testing
+ TD_NUM1, // compact gaming numpad
+ TD_NUM2, //
+ TD_NUM3, //
+ TD_TMX, // tmux control sequence
+ TD_EOL, // end of line
+ TD_BOL, // beginning of line
+ TD_NW, // next word
+ TD_PW, // pevious word
+ TD_DW, // delete word
+ TD_QT1, // single double quote for '
+ TD_QT2, // single double quote for "
+ TD_QT3, // single double quote for `
+ TD_PAR, // single double parenthesis
+ TD_CUR, // single double curly braces
+ TD_SQR, // single double square brackets
+ TD_ABR // single double angle brackets
+};
+#endif // TAP_DANCE_ENABLE
+void td_parenthesis (qk_tap_dance_state_t *state, void *user_data);
diff --git a/users/kuchosauronad0/template.c b/users/kuchosauronad0/template.c
new file mode 100644
index 0000000000..475e45d391
--- /dev/null
+++ b/users/kuchosauronad0/template.c
@@ -0,0 +1,125 @@
+#include "template.h"
+
+
+// Add reconfigurable functions here, for keymap customization
+// This allows for a global, userspace functions, and continued
+// customization of the keymap. Use _keymap instead of _user
+// functions in the keymaps
+__attribute__ ((weak))
+void matrix_init_keymap(void) {}
+
+// Call user matrix init, then call the keymap's init function
+void matrix_init_user(void) {
+ matrix_init_keymap();
+}
+
+
+__attribute__ ((weak))
+void matrix_scan_keymap(void) {}
+
+// No global matrix scan code, so just run keymap's matix
+// scan function
+__attribute__ ((weak))
+void matrix_scan_user(void) {
+ matrix_scan_keymap();
+}
+
+
+__attribute__ ((weak))
+bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
+ return true;
+}
+
+// Defines actions tor my global custom keycodes. Defined in drashna.h file
+// Then runs the _keymap's recod handier if not processed here,
+// And use "NEWPLACEHOLDER" for new safe range
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+
+ switch (keycode) {
+ case KC_MAKE:
+ if (!record->event.pressed) {
+ SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP
+#if (defined(BOOTLOADER_DFU) || defined(BOOTLOADER_LUFA_DFU) || defined(BOOTLOADER_QMK_DFU))
+ ":dfu"
+#elif defined(BOOTLOADER_HALFKAY)
+ ":teensy"
+#elif defined(BOOTLOADER_CATERINA)
+ ":avrdude"
+#endif
+ SS_TAP(X_ENTER));
+ }
+ return false;
+ break;
+
+ case VRSN:
+ if (record->event.pressed) {
+ SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
+ }
+ return false;
+ break;
+ }
+ return process_record_keymap(keycode, record);
+}
+
+
+__attribute__ ((weak))
+uint32_t layer_state_set_keymap (uint32_t state) {
+ return state;
+}
+
+uint32_t layer_state_set_user (uint32_t state) {
+ return layer_state_set_keymap (state);
+}
+
+
+
+__attribute__ ((weak))
+void led_set_keymap(uint8_t usb_led) {}
+
+void led_set_user(uint8_t usb_led) {
+ led_set_keymap(usb_led);
+}
+
+
+
+__attribute__ ((weak))
+void suspend_power_down_keymap(void) {}
+
+void suspend_power_down_user(void)
+{
+ suspend_power_down_keymap();
+}
+
+
+
+__attribute__ ((weak))
+void suspend_wakeup_init_keymap(void) {}
+
+void suspend_wakeup_init_user(void)
+{
+ suspend_wakeup_init_keymap();
+ #ifdef KEYBOARD_ergodox_ez
+ wait_ms(10);
+ #endif
+}
+
+
+
+__attribute__ ((weak))
+void startup_keymap(void) {}
+
+void startup_user (void) {
+ #ifdef RGBLIGHT_ENABLE
+ matrix_init_rgb();
+ #endif //RGBLIGHT_ENABLE
+ startup_keymap();
+}
+
+
+
+__attribute__ ((weak))
+void shutdown_keymap(void) {}
+
+void shutdown_user (void) {
+ shutdown_keymap();
+}
diff --git a/users/kuchosauronad0/template.h b/users/kuchosauronad0/template.h
new file mode 100644
index 0000000000..dd1c487604
--- /dev/null
+++ b/users/kuchosauronad0/template.h
@@ -0,0 +1,18 @@
+#ifndef USERSPACE
+#define USERSPACE
+
+#include "quantum.h"
+#include "version.h"
+#include "eeprom.h"
+
+// Define layer names
+#define BASE 0
+
+enum custom_keycodes {
+ VRSN = SAFE_RANGE, // can always be here
+ KC_MAKE,
+ KC_RESET,
+ NEWPLACEHOLDER //use "NEWPLACEHOLDER for keymap specific codes
+};
+
+#endif
diff --git a/users/kuchosauronad0/unicode.c b/users/kuchosauronad0/unicode.c
new file mode 100644
index 0000000000..8b312deb66
--- /dev/null
+++ b/users/kuchosauronad0/unicode.c
@@ -0,0 +1,62 @@
+#include "unicode.h"
+
+//#ifdef UNICODEMAP_ENABLE
+const uint32_t PROGMEM unicode_map[] = {
+ [BANG] = 0x0203D,// ‽
+ [IRONY] = 0x02E2E,// ⸮
+ [DEGREE] = 0x000B0,// °
+ [THINK] = 0x1F914,// 🤔
+ [GRIN] = 0x1F600,// �
+ [MONOCL] = 0x1F9D0,// 🧐
+ [DRUG0] = 0x1F92A,// 🤪
+ [DRUG1] = 0x1F974,// 🥴
+ [CLOWN] = 0x1F921,// 🤡
+ [MNDBLWN] = 0x1F92F,// 🤯
+ [MONEY] = 0x1F911,// 🤑
+ [SHTUP] = 0x1F910,// 🤐
+ [PARTY] = 0x1F973,// 🥳
+ [SMRK] = 0x1F60F,// 😏
+ [WEARY] = 0x1F629,// 😩
+ [UNAMU] = 0x1F612,// 😒
+ [SPY] = 0x1F575,//🕵
+ [DAFUQ] = 0x1F47A,// 👺
+ [FIST0] = 0x1F91B,// 🤛
+ [FIST1] = 0x1F91C,// 🤜
+ [FIST2] = 0x270A, // ✊
+ [FIST3] = 0x1F44A,// 👊
+ [WIFIHAND] = 0x1F44B,// 👋
+ [OKOK] = 0x1F44C,// 👌
+ [EFFU] = 0x1F595,// 🖕
+ [SPOCK] = 0x1F596,// 🖖
+ [INUP] = 0x1F446,// 👆
+ [THDN] = 0x1F44E,// 👎
+ [THUP] = 0x1F44D,// 👍
+ [TUMBLER] = 0x1F943,// 🥃
+ [DRAGON0] = 0x1F409,// 🐉
+ [DRAGON1] = 0x1F432,// 🐲
+ [TIGER0] = 0x1F405,// 🐅
+ [TIGER1] = 0x1F42F,// 🐯
+ [COOL] = 0x1F192,// 🆒
+ [UCHART] = 0x1F4C8,// 📈
+ [DCHART] = 0x1F4C9,// 📉
+ [BCHART] = 0x1F4CA,// 📊
+ [NOPRCY] = 0x1F572,// 🕲
+ [PRCY] = 0x1F571,// 🕱
+ [BBB] = 0x1F171,// 🅱
+ [POO] = 0x1F4A9,// 💩
+ [HUNDR] = 0x1F4AF,// 💯
+ [EGGPL] = 0x1F346,// 🍆
+ [WATER] = 0x1F4A6,// 💦
+ [LIT] = 0x1F525,// 🔥
+ [SNEK] = 0x1F40D,// 🐍
+ [PENGUIN] = 0x1F427,// 🐧
+ [BOAR] = 0x1F417,// 🐗
+ [MONKEY] = 0x1F412,// 🐒
+ [CHICK] = 0x1F425,// 🐥
+ [DASH] = 0x1F4A8,// 💨
+ [DIZZY] = 0x1F4AB,// 💫
+ [KEEB] = 0x1F5AE,// 🖮
+ [HOLE] = 0x1F573,// 🕳
+ [SAUCER] = 0x1F6F8// 🛸
+ };
+//#endif // UNICODEMAP_ENABLE
diff --git a/users/kuchosauronad0/unicode.h b/users/kuchosauronad0/unicode.h
new file mode 100644
index 0000000000..cb550243ee
--- /dev/null
+++ b/users/kuchosauronad0/unicode.h
@@ -0,0 +1,67 @@
+#pragma once
+
+#include "quantum.h"
+
+void send_unicode_hex_string(const char* str);
+
+/* use X(n) to call the */
+#ifdef UNICODEMAP_ENABLE
+enum unicode_name {
+OKOK, //
+BANG, // ‽
+IRONY, // ⸮
+DEGREE, // °
+THINK, // 🤔
+GRIN, // �
+MONOCL, // 🧐
+DRUG0, // 🤪
+DRUG1, // 🥴
+CLOWN, // 🤡
+MNDBLWN, // 🤯
+MONEY, // 🤑
+SHTUP, // 🤐
+PARTY, // 🥳
+SMRK, // 😏
+WEARY, // 😩
+UNAMU, // 😒
+SPY, // 🕵
+DAFUQ, // 👺
+FIST0, // 🤛
+FIST1, // 🤜
+FIST2, // ✊
+FIST3, // 👊
+WIFIHAND, // 👌
+EFFU, // 🖕
+SPOCK, // 🖖
+INUP, // 👆
+THDN, // 👎
+THUP, // 👍
+TUMBLER, // 🥃
+DRAGON0, // 🐉
+DRAGON1, // 🐅
+TIGER0, // 🐅
+TIGER1, // 🐯
+COOL, // 🆒
+UCHART, // 📈
+DCHART, // 📉
+BCHART, // 📊
+NOPRCY, // 🕲
+PRCY, // 🕱
+BBB, // 🅱
+POO, // 💩
+HUNDR, // 💯
+EGGPL, // 🍆
+WATER, // 💦
+LIT, // 🔥
+SNEK, // 🐍
+PENGUIN, // 🐧
+BOAR, // 🐗
+MONKEY, // 🐒
+CHICK, // 🐥
+DASH, // 💨
+DIZZY, // 💫
+KEEB, // 🖮
+HOLE, // 🕳
+SAUCER // 🛸
+};
+#endif
diff --git a/users/kuchosauronad0/wrappers.h b/users/kuchosauronad0/wrappers.h
new file mode 100644
index 0000000000..6dc19d935e
--- /dev/null
+++ b/users/kuchosauronad0/wrappers.h
@@ -0,0 +1,212 @@
+#pragma once
+#include "kuchosauronad0.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.
+*/
+#if (!defined(LAYOUT) && defined(KEYMAP))
+# define LAYOUT KEYMAP
+#endif
+
+#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__)
+#define LAYOUT_ergodox_pretty_wrapper(...) LAYOUT_ergodox_pretty(__VA_ARGS__)
+#define KEYMAP_wrapper(...) LAYOUT(__VA_ARGS__)
+#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
+#define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__)
+#define LAYOUT_ortho_5x12_wrapper(...) LAYOUT_ortho_5x12(__VA_ARGS__)
+
+#define LAYOUT_collide39_base_wrapper(...) LAYOUT_collide39_base(__VA_ARGS__)
+
+/*
+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.
+*/
+
+#define ___________________BLANK___________________ _______, _______, _______, _______, _______
+
+#ifdef TAP_DANCE_ENABLE
+# define _________________QWERTY_L1_________________ KC_Q, KC_DW, KC_EOL, KC_R, KC_TMX
+# define _________________QWERTY_L2_________________ KC_BOL, KC_S, KC_D, KC_NW, KC_G
+# define _________________QWERTY_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_PW
+#else
+# 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
+#endif
+
+#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
+#define _________________QWERTY_R3_________________ KC_N, KC_M, KC_COMM, KC_DOT, KC_SLASH
+
+#define _________________PLOVER_L1_________________ KC_Q, KC_W, KC_E, KC_R, KC_T
+#define _________________PLOVER_L2_________________ KC_A, KC_S, KC_D, KC_F, KC_G
+#define _________________PLOVER_L3_________________ KC_NO, KC_NO, KC_C, KC_V, KC_NO
+
+#define _________________PLOVER_R1_________________ KC_Y, KC_U, KC_I, KC_O, KC_P
+#define _________________PLOVER_R2_________________ KC_H, KC_J, KC_K, KC_L, KC_SCLN
+#define _________________PLOVER_R3_________________ KC_NO, KC_NO, KC_N, KC_M, KC_NO
+
+#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
+#define _________________COLEMAK_R3________________ KC_K, KC_M, KC_COMM, KC_DOT, KC_SLASH
+
+#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
+#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
+#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
+#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
+#define _________________WORKMAN_R3________________ KC_K, KC_L, KC_COMM, KC_DOT, KC_SLASH
+
+#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
+#define _________________NORMAN_R3_________________ KC_P, KC_M, KC_COMM, KC_DOT, KC_SLASH
+
+#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
+#define _________________MALTRON_R3________________ KC_DOT, KC_W, KC_K, KC_MINS, KC_X
+
+#define _________________EUCALYN_L1________________ KC_SLSH, KC_COMM, KC_DOT, KC_F, KC_Q
+#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_W
+
+#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
+#define _________________EUCALYN_R3________________ KC_B, KC_H, KC_J, KC_L, KC_SCLN
+
+#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
+#define _____________CARPLAX_QFMLWY_R3_____________ KC_P, KC_K, KC_COMM, KC_DOT, KC_SLSH
+
+#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
+#define _____________CARPLAX_QGMLWB_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, KC_SLSH
+
+#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
+#define _____________CARPLAX_QGMLWY_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, KC_SLSH
+
+#ifdef UNICODE_ENABLE
+# define _______________UNICODE_L1__________________ UC_DISA,UC_DISA, UC_DISA, UC_DISA, UC_DISA
+# define _______________UNICODE_L2__________________ UC_DISA,UC_DISA, UC_DISA, UC_DISA, UC_DISA
+# define _______________UNICODE_L3__________________ UC_DISA,UC_DISA, UC_DISA, UC_DISA, UC_DISA
+
+# define _______________UNICODE_R1__________________ UC_SHRG, UC_SHRG, UC_SHRG, UC_SHRG, UC_SHRG
+# define _______________UNICODE_R2__________________ UC_SHRG, UC_SHRG, UC_SHRG, UC_SHRG, UC_SHRG
+# define _______________UNICODE_R3__________________ UC_SHRG, UC_SHRG, UC_SHRG, UC_SHRG, UC_SHRG
+#endif
+
+#ifdef UNICODEMAP_ENABLE
+# define _______________UNICODE_L1__________________ X(SMRK), X(THINK), X(CLOWN), X(HUNDR), X(BANG)
+# define _______________UNICODE_L2__________________ X(GRIN), X(MONKEY), X(OKOK), X(EGGPL), X(LIT)
+# define _______________UNICODE_L3__________________ X(WEARY), X(UNAMU), X(EFFU), X(MONOCL), X(IRONY)
+
+# define _______________UNICODE_R1__________________ X(DRUG0), X(THUP), X(INUP), X(DIZZY), X(COOL)
+# define _______________UNICODE_R2__________________ X(FIST0), X(FIST2), X(FIST3), X(FIST1), X(OKOK)
+# define _______________UNICODE_R3__________________ X(MNDBLWN), X(THDN), X(SPOCK), X(HOLE), X(DASH)
+#endif
+
+#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 _________________MEDIA_RIGHT_______________ KC_MUTE, KC_MPRV, KC_MPLY, KC_MNXT, KC_MSTP
+#define _________________MEDIA_LEFT________________ KC_VOLD, KC_VOLD, KC_MUTE, KC_VOLU, KC_VOLU
+
+#define _________________LOWER_L1__________________ KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC
+#define _________________LOWER_L2__________________ ___________________BLANK___________________
+#define _________________LOWER_L3__________________ _______, _______, _______, OS_UNI, TM_X
+
+#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_LEFT, KC_DOWN, KC_UP, KC_RGHT
+
+#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_HOME, KC_PGDN, KC_PGUP, KC_END
+
+#define _________________ADJUST_L1_________________ QWERTY, COLEMAK, DVORAK, WORKMAN, PLOVER
+#define _________________ADJUST_L2_________________ _________________FUNC_LEFT_________________
+#define _________________ADJUST_L3_________________ _________________MEDIA_LEFT________________
+
+#define _________________ADJUST_R1_________________ SEC1, SEC2, SEC3, SEC4, SEC5
+#define _________________ADJUST_R2_________________ _________________FUNC_RIGHT________________
+#define _________________ADJUST_R3_________________ _________________MEDIA_RIGHT_______________
+
+#define _________________RGB_UP____________________ RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_TOG
+#define _________________RGB_CENTER________________ MU_TOG , CK_TOGG, AU_ON, AU_OFF, AG_NORM
+#define _________________RGB_DOWN__________________ RGB_RMOD, RGB_HUD, RGB_SAD, RGB_VAD, KC_RGB_T
+
+#define _________________RGB_R1____________________ RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_TOG
+#define _________________RGB_R2____________________ MU_TOG , CK_TOGG, AU_ON, AU_OFF, AG_NORM
+#define _________________RGB_R3____________________ RGB_RMOD, RGB_HUD, RGB_SAD, RGB_VAD, KC_RGB_T
+
+#define __________________GAMEPAD_L1_______________ _______, KC_Q, KC_W, KC_E, _______
+#define __________________GAMEPAD_L2_______________ _______, KC_A, KC_S, KC_D, _______
+#define __________________GAMEPAD_L3_______________ KC_1, KC_2, KC_3, KC_4, KC_5
+
+#define __________________GAMEPAD_R1_______________ _______, KC_U, KC_UP, KC_O, _______
+#define __________________GAMEPAD_R2_______________ _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______
+#define __________________GAMEPAD_R3_______________ KC_6, KC_7, KC_8, KC_9, KC_0
+/* vi: ft=c:tw=80:sw=2:ts=2:sts=2:et */
+
diff --git a/users/manna-harbour_miryoku/manna-harbour_miryoku.c b/users/manna-harbour_miryoku/manna-harbour_miryoku.c
index bb4770afc2..a50677008a 100644
--- a/users/manna-harbour_miryoku/manna-harbour_miryoku.c
+++ b/users/manna-harbour_miryoku/manna-harbour_miryoku.c
@@ -14,43 +14,43 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[BASE] = LAYOUT_miryoku(
KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_QUOT,
LGUI_T(KC_A), LALT_T(KC_R), LCTL_T(KC_S), LSFT_T(KC_T), KC_G, KC_M, LSFT_T(KC_N), LCTL_T(KC_E), LALT_T(KC_I), LGUI_T(KC_O),
- KC_Z, KC_X, KC_C, KC_D, KC_V, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH,
+ KC_Z, ALGR_T(KC_X), KC_C, KC_D, KC_V, KC_K, KC_H, KC_COMM, ALGR_T(KC_DOT), KC_SLSH,
KC_NP, KC_NP, LT(MEDR, KC_ESC), LT(NAVR, KC_SPC), LT(MOUR, KC_TAB), LT(NSSL, KC_ENT), LT(NSL, KC_BSPC), LT(FUNL, KC_DEL), KC_NP, KC_NP
),
[NAVR] = LAYOUT_miryoku(
KC_RST, KC_NA, KC_NA, KC_NA, KC_NA, KC_AGIN, KC_UNDO, KC_CUT, KC_COPY, KC_PSTE,
KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, KC_NA, KC_CAPS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT,
- KC_NA, KC_NA, KC_NA, KC_NA, KC_NA, KC_INS, KC_HOME, KC_PGDN, KC_PGUP, KC_END,
+ KC_NA, KC_ALGR, KC_NA, KC_NA, KC_NA, KC_INS, KC_HOME, KC_PGDN, KC_PGUP, KC_END,
KC_NP, KC_NP, KC_NA, KC_NA, KC_NA, KC_ENT, KC_BSPC, KC_DEL, KC_NP, KC_NP
),
[MOUR] = LAYOUT_miryoku(
KC_RST, KC_NA, KC_NA, KC_NA, KC_NA, KC_NU, KC_NU, KC_NU, KC_NU, KC_NU,
KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, KC_NA, KC_NU, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R,
- KC_NA, KC_NA, KC_NA, KC_NA, KC_NA, KC_NU, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R,
+ KC_NA, KC_ALGR, KC_NA, KC_NA, KC_NA, KC_NU, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R,
KC_NP, KC_NP, KC_NA, KC_NA, KC_NA, KC_BTN3, KC_BTN1, KC_BTN2, KC_NP, KC_NP
),
[MEDR] = LAYOUT_miryoku(
KC_RST, KC_NA, KC_NA, KC_NA, KC_NA, KC_NU, KC_NU, KC_NU, KC_NU, KC_NU,
KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, KC_NA, KC_NU, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT,
- KC_NA, KC_NA, KC_NA, KC_NA, KC_NA, KC_NU, KC_NU, KC_NU, KC_NU, KC_NU,
+ KC_NA, KC_ALGR, KC_NA, KC_NA, KC_NA, KC_NU, KC_NU, KC_NU, KC_NU, KC_NU,
KC_NP, KC_NP, KC_NA, KC_NA, KC_NA, KC_MSTP, KC_MPLY, KC_MUTE, KC_NP, KC_NP
),
[FUNL] = LAYOUT_miryoku(
KC_F12, KC_F7, KC_F8, KC_F9, KC_PSCR, KC_NA, KC_NA, KC_NA, KC_NA, KC_RST,
KC_F11, KC_F4, KC_F5, KC_F6, KC_SLCK, KC_NA, KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI,
- KC_F10, KC_F1, KC_F2, KC_F3, KC_PAUS, KC_NA, KC_NA, KC_NA, KC_NA, KC_NA,
+ KC_F10, KC_F1, KC_F2, KC_F3, KC_PAUS, KC_NA, KC_NA, KC_NA, KC_ALGR, KC_NA,
KC_NP, KC_NP, KC_APP, KC_SPC, KC_TAB, KC_NA, KC_NA, KC_NA, KC_NP, KC_NP
),
[NSL] = LAYOUT_miryoku(
KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, KC_NA, KC_NA, KC_NA, KC_NA, KC_RST,
KC_SCLN, KC_4, KC_5, KC_6, KC_EQL, KC_NA, KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI,
- KC_GRV, KC_1, KC_2, KC_3, KC_BSLS, KC_NA, KC_NA, KC_NA, KC_NA, KC_NA,
+ KC_GRV, KC_1, KC_2, KC_3, KC_BSLS, KC_NA, KC_NA, KC_NA, KC_ALGR, KC_NA,
KC_NP, KC_NP, KC_DOT, KC_0, KC_MINS, KC_NA, KC_NA, KC_NA, KC_NP, KC_NP
),
[NSSL] = LAYOUT_miryoku(
KC_LCBR, KC_AMPR, KC_ASTR, KC_LPRN, KC_RCBR, KC_NA, KC_NA, KC_NA, KC_NA, KC_RST,
KC_COLN, KC_DLR, KC_PERC, KC_CIRC, KC_PLUS, KC_NA, KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI,
- KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_PIPE, KC_NA, KC_NA, KC_NA, KC_NA, KC_NA,
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_PIPE, KC_NA, KC_NA, KC_NA, KC_ALGR, KC_NA,
KC_NP, KC_NP, KC_GT, KC_RPRN, KC_UNDS, KC_NA, KC_NA, KC_NA, KC_NP, KC_NP
)
};
diff --git a/users/manna-harbour_miryoku/miryoku.org b/users/manna-harbour_miryoku/miryoku.org
index 556f95f60e..c352df8fdd 100644
--- a/users/manna-harbour_miryoku/miryoku.org
+++ b/users/manna-harbour_miryoku/miryoku.org
@@ -1,18 +1,23 @@
#+Title: miryoku.org
+[[https://raw.githubusercontent.com/manna-harbour/miryoku/master/kle-miryoku-keycodes.png]]
+
The miryoku layout is an ergonomic, minimal, orthogonal layout for ergo or ortho
keyboards, implemented as part of the QMK firmware. The layout is maintained in
emacs org-mode tables and converted to QMK keymap data structures using embedded
python scripts. The layout is mapped onto keyboards with different physical
-layouts as a subset without code duplication using the QMK userland feature and
+layouts as a subset without code duplication using the QMK userspace feature and
C macros. Versions of the layout can also be seen outside of the QMK source at
[[https://github.com/manna-harbour/miryoku/]].
+After making changes here call org-babel-tangle (C-c C-v t).
+
* Contents
- [[#layout][Layout]]
- [[#code-generation][Code Generation]]
- [[#subset-mapping][Subset Mapping]]
+- [[#related-documentation][Related Documentation]]
* Layout
@@ -45,6 +50,7 @@ C macros. Versions of the layout can also be seen outside of the QMK source at
- Dual-function layer change on thumbs.
- Layers are designed orthogonally with a single purpose per hand and are
accessed by holding a thumb key on the opposite hand.
+ - All layers on the same hand are based on the same basic key arrangement.
- Holding layer change and modifiers on one hand combined with a single key
press on the other hand can produce any combination of modifiers and
single keys without any finger contortions.
@@ -53,9 +59,10 @@ C macros. Versions of the layout can also be seen outside of the QMK source at
or simultaneously without race conditions.
- As mods are only enabled on the opposite hand, auto-repeat is available on
the home row on layers for use with cursor and mouse keys.
- - Tap-hold auto-repeat is disabled to enable faster tap-hold switching on
- thumbs but thumb tap keys are mirrored onto some layers for use with
- auto-repeat.
+ - Tap-hold auto-repeat is disabled to permit faster tap-hold switching on
+ thumbs, but thumb tap keys are mirrored onto some layers for use with
+ auto-repeat. On other layers thumb keys are redefined with important
+ functions for that layer.
** Layers
@@ -92,7 +99,7 @@ included for prose, dot and slash for file and directory names.
#+NAME: hold
| RST | | | | | | | | | RST |
| LGUI | LALT | LCTL | LSFT | | | LSFT | LCTL | LALT | LGUI |
-| | | | | | | | | | |
+| | ALGR | | | | | | | ALGR | |
| NP | NP | MEDR | NAVR | MOUR | NSSL | NSL | FUNL | NP | NP |
@@ -365,7 +372,7 @@ Modifiers usable in hold table. Need to have the same name for KC_ and _T versi
- LCTL
- LALT
- LGUI
-- LAGR
+- ALGR
** Other
@@ -512,8 +519,9 @@ cd ../.. && make ergodox_ez:manna-harbour_miryoku:teensy
For the ortho_4x12 layout, the right half as is as follows: The rightmost column
bottom 3 rows is the pinkie column. The middle 4 columns top 3 rows are for the
-remaining fingers. The bottom row left 3 columns are the thumb keys. The
-remaining keys are unused.
+remaining fingers. The pinkie column is one row lower than the other columns to
+provide some column stagger on ortho keyboards. The bottom row left 3 columns
+are the thumb keys. The remaining keys are unused.
[[../../layouts/community/ortho_4x12/manna-harbour_miryoku/keymap.c][layouts/community/ortho_4x12/manna-harbour_miryoku/keymap.c]]
#+BEGIN_SRC C :noweb yes :tangle ../../layouts/community/ortho_4x12/manna-harbour_miryoku/keymap.c
@@ -588,6 +596,10 @@ cd ../.. && make crkbd:manna-harbour_miryoku:avrdude
* Related Documentation
+:PROPERTIES:
+:CUSTOM_ID: related-documentation
+:END:
+
** QMK
diff --git a/users/mattly/mattly.h b/users/mattly/mattly.h
index 08318840d0..da09ddcdb2 100644
--- a/users/mattly/mattly.h
+++ b/users/mattly/mattly.h
@@ -26,36 +26,50 @@ enum {
_FUNCT,
};
+// == Thumbs
// left hand
#define ESC_HYP MT(MOD_HYPR, KC_ESC)
-#define BSP_NUM LT(_NAVNUM, KC_BSPC)
-#define ENT_SFT MT(MOD_LSFT, KC_ENT)
+#define TAB_NUM LT(_NAVNUM, KC_TAB)
#define SPC_SFT MT(MOD_LSFT, KC_SPC)
+#define ENT_SYM LT(_SYMBOL, KC_ENT)
+
// right hand
#define SPC_SFT MT(MOD_LSFT, KC_SPC)
-#define TAB_SYM LT(_SYMBOL, KC_TAB)
+#define BSP_SYM LT(_SYMBOL, KC_BSPC)
#define DEL_WRP MT(MOD_LCTL | MOD_LALT | MOD_LGUI, KC_DEL)
#define NAVLOCK TG(_NAVNUM)
#define SYMLOCK TG(_SYMBOL)
-// QWERTY
-
+// == QWERTY
+// left hand home row
#define A_CTRL MT(MOD_LCTL, KC_A)
#define S_ALT MT(MOD_LALT, KC_S)
#define D_GUI MT(MOD_LGUI, KC_D)
#define F_SHFT MT(MOD_LSFT, KC_F)
+// left hand aux
+#define W_CTRL MT(MOD_LCTL, KC_W)
+#define E_ALT MT(MOD_LALT, KC_E)
+#define R_GUI MT(MOD_LGUI, KC_R)
+
+// right hand home row
#define J_SHFT MT(MOD_RSFT, KC_J)
#define K_GUI MT(MOD_RGUI, KC_K)
#define L_ALT MT(MOD_RALT, KC_L)
#define MINSCTL MT(MOD_RCTL, KC_MINS)
+// right hand aux
+#define U_GUI MT(MOD_RGUI, KC_U)
+#define I_ALT MT(MOD_RALT, KC_I)
+#define O_CTRL MT(MOD_RCTL, KC_O)
+// == OS X default keys
+// movement by word
#define BWORD LALT(KC_LEFT)
#define FWORD LALT(KC_RIGHT)
-// OS X default keys
+// gui navigation
#define NWIN LGUI(KC_GRV) // Next Window
#define PWIN LGUI(LSFT(KC_GRV)) // Prev Window
#define NTAB LGUI(LSFT(KC_RBRC)) // Next Tab
@@ -70,12 +84,13 @@ enum {
#define XPRVSPC HYPR(KC_F17)
#define XNOTIFY HYPR(KC_F18)
+// == UNDERGLOW
#ifdef RGBLIGHT_ENABLE
-#define HSV_CAPS 42, 255, 255
-#define HSV_DEFAULT 30, 218, 255
-#define HSV_SYMBOL 22, 255, 255
-#define HSV_NAVNUM 245, 200, 255
-#define HSV_FUNCT 233, 255, 255
+#define HSV_CAPS 60, 255, 255
+#define HSV_DEFAULT 30, 255, 255
+#define HSV_SYMBOL 18, 255, 255
+#define HSV_NAVNUM 250, 255, 255
+#define HSV_FUNCT 238, 255, 255
#define HSV_RESET 180, 255, 255
#endif
diff --git a/users/mguterl/config.h b/users/mguterl/config.h
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/users/mguterl/config.h
diff --git a/users/mguterl/mguterl.c b/users/mguterl/mguterl.c
new file mode 100644
index 0000000000..479c8d15d0
--- /dev/null
+++ b/users/mguterl/mguterl.c
@@ -0,0 +1 @@
+#include "mguterl.h"
diff --git a/users/mguterl/mguterl.h b/users/mguterl/mguterl.h
new file mode 100644
index 0000000000..0b2f3938b9
--- /dev/null
+++ b/users/mguterl/mguterl.h
@@ -0,0 +1,67 @@
+#pragma once
+#include "quantum.h"
+
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+
+/* Tap for Tab, hold for Hyper (Super+Ctrl+Shift+Alt) */
+#define HPR_TAB ALL_T(KC_TAB)
+
+/* Shift when held, Enter when tapped */
+#define SFT_ENT MT(MOD_RSFT, KC_ENT)
+
+/* Activate util layer while holding space */
+#define SPC_UTL LT(_UTIL, KC_SPC)
+
+/* Control when held, Escape when tapped */
+#define ESC_CTL MT(MOD_LCTL, KC_ESC)
+
+/* Toggle gaming layer */
+#define TG_GAME TG(_GAMING)
+
+/*
+ * Make it easy to navigate back and forward in Chrome.
+ */
+#define GO_BACK LGUI(KC_LBRC)
+#define GO_FWD LGUI(KC_RBRC)
+
+/*
+ * When using a 40% layout, these keycodes make it easy to change tabs in apps
+ * like Chrome and VSCode.
+ */
+#define GUI_1 LGUI(KC_1)
+#define GUI_2 LGUI(KC_2)
+#define GUI_3 LGUI(KC_3)
+#define GUI_4 LGUI(KC_4)
+#define GUI_5 LGUI(KC_5)
+#define GUI_6 LGUI(KC_6)
+#define GUI_7 LGUI(KC_7)
+#define GUI_8 LGUI(KC_8)
+#define GUI_9 LGUI(KC_9)
+#define GUI_0 LGUI(KC_0)
+
+/*
+ * Common layers and keycodes that are shared between Planck and Preonic
+ */
+enum ortho_layers {
+ _QWERTY,
+ _GAMING,
+ _UTIL,
+ _COLEMAK,
+ _DVORAK,
+ _LOWER,
+ _RAISE,
+ _PLOVER,
+ _ADJUST
+};
+
+enum ortho_keycodes {
+ QWERTY = SAFE_RANGE,
+ GAMING,
+ UTIL,
+ COLEMAK,
+ DVORAK,
+ PLOVER,
+ BACKLIT,
+ EXT_PLV
+};
diff --git a/users/mguterl/readme.md b/users/mguterl/readme.md
new file mode 100644
index 0000000000..9dc1a7ebbd
--- /dev/null
+++ b/users/mguterl/readme.md
@@ -0,0 +1,14 @@
+Copyright 2019 Michael Guterl michael@diminishing.org @mguterl
+
+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/>.
diff --git a/users/mguterl/rules.mk b/users/mguterl/rules.mk
new file mode 100644
index 0000000000..4ed89c987d
--- /dev/null
+++ b/users/mguterl/rules.mk
@@ -0,0 +1 @@
+SRC += mguterl.c
diff --git a/users/narze/narze.c b/users/narze/narze.c
new file mode 100644
index 0000000000..6ec3034492
--- /dev/null
+++ b/users/narze/narze.c
@@ -0,0 +1 @@
+#include "narze.h"
diff --git a/users/narze/narze.h b/users/narze/narze.h
new file mode 100644
index 0000000000..036539a9cd
--- /dev/null
+++ b/users/narze/narze.h
@@ -0,0 +1,9 @@
+#pragma once
+
+#include "quantum.h"
+#include "eeconfig.h"
+#include "keymap_colemak.h"
+
+#ifdef COMBO_ENABLE
+# include "superduper.h"
+#endif
diff --git a/users/narze/readme.md b/users/narze/readme.md
new file mode 100644
index 0000000000..124b84e6be
--- /dev/null
+++ b/users/narze/readme.md
@@ -0,0 +1,18 @@
+# TODO
+- [ ] Make SuperDuper mode fully-compatible in Windows by swapping GUI with Ctrl
+
+# LICENSE
+Copyright 2019 Manassarn Manoonchai manassarn@gmail.com @narze
+
+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/>.
diff --git a/users/narze/rules.mk b/users/narze/rules.mk
new file mode 100644
index 0000000000..565a4a7a63
--- /dev/null
+++ b/users/narze/rules.mk
@@ -0,0 +1,5 @@
+SRC += narze.c
+
+ifeq ($(strip $(COMBO_ENABLE)), yes)
+ SRC += superduper.c
+endif
diff --git a/users/narze/superduper.c b/users/narze/superduper.c
new file mode 100644
index 0000000000..b497ce2e68
--- /dev/null
+++ b/users/narze/superduper.c
@@ -0,0 +1,66 @@
+#include "superduper.h"
+#include "eeconfig.h"
+#include "eeprom.h"
+#include "keymap_colemak.h"
+
+// SuperDuper
+
+#define SUPERDUPER_COMBO_COUNT 3
+#define EECONFIG_SUPERDUPER_INDEX (uint8_t *) 19
+
+enum process_combo_event {
+ CB_SUPERDUPER,
+};
+
+enum supported_layers {
+ _QWERTY,
+ _COLEMAK,
+ _QWOC
+};
+
+const uint16_t PROGMEM superduper_combos[SUPERDUPER_COMBO_COUNT][3] = {
+ [_QWERTY] = {KC_S, KC_D, COMBO_END},
+ [_COLEMAK] = {KC_R, KC_S, COMBO_END},
+ [_QWOC] = {CM_S, CM_D, COMBO_END},
+};
+
+combo_t key_combos[COMBO_COUNT] = {
+ [CB_SUPERDUPER] = COMBO_ACTION(superduper_combos[_QWERTY]),
+};
+
+volatile bool superduper_enabled = true;
+
+const uint16_t PROGMEM empty_combo[] = {COMBO_END};
+
+bool toggle_superduper_mode(void) {
+ superduper_enabled = !superduper_enabled;
+
+ if (superduper_enabled) {
+ set_superduper_key_combos();
+ } else {
+ clear_superduper_key_combos();
+ }
+
+ return superduper_enabled;
+}
+
+void set_superduper_key_combo_layer(uint16_t layer) {
+ key_combos[CB_SUPERDUPER].keys = superduper_combos[layer];
+ eeprom_update_byte(EECONFIG_SUPERDUPER_INDEX, layer);
+}
+
+void set_superduper_key_combos(void) {
+ uint8_t layer = eeprom_read_byte(EECONFIG_SUPERDUPER_INDEX);
+
+ switch (layer) {
+ case _QWERTY:
+ case _COLEMAK:
+ case _QWOC:
+ key_combos[CB_SUPERDUPER].keys = superduper_combos[layer];
+ break;
+ }
+}
+
+void clear_superduper_key_combos(void) {
+ key_combos[CB_SUPERDUPER].keys = empty_combo;
+}
diff --git a/users/narze/superduper.h b/users/narze/superduper.h
new file mode 100644
index 0000000000..f8df2e1afb
--- /dev/null
+++ b/users/narze/superduper.h
@@ -0,0 +1,7 @@
+#pragma once
+#include "narze.h"
+
+bool toggle_superduper_mode(void);
+void set_superduper_key_combo_layer(uint16_t layer);
+void set_superduper_key_combos(void);
+void clear_superduper_key_combos(void);
diff --git a/users/ninjonas/.gitignore b/users/ninjonas/.gitignore
new file mode 100644
index 0000000000..c6df8c0139
--- /dev/null
+++ b/users/ninjonas/.gitignore
@@ -0,0 +1 @@
+secrets.c
diff --git a/users/ninjonas/README.md b/users/ninjonas/README.md
new file mode 100644
index 0000000000..1e3fe9c31f
--- /dev/null
+++ b/users/ninjonas/README.md
@@ -0,0 +1,109 @@
+# QMK User Configuration for [ninjonas](https://github.com/ninjonas/qmk-yonas)
+Tired of copying and pasting the same macros and tap dances for all my keymaps. Utilizing user keymaps functionality.
+See: https://docs.qmk.fm/#/feature_userspace
+
+## [ninjonas.c](ninjonas.c)
+- ninjonas [QMK user configuration](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_userspace.md)
+- On `keymap.c` include `ninjonas.h`
+ ```c
+ #include "ninjonas.h"
+ ```
+
+## Supported Keyboards
+- [Crkbd ](../../keyboards/crkbd/keymaps/ninjonas)
+- [Hotdox](../../keyboards/hotdox/keymaps/ninjonas)
+- [Pinky3](../../keyboards/pinky/3/keymaps/ninjonas)
+- [Lily58](../../keyboards/lily58/keymaps/ninjonas)
+
+## Features
+### [Keys](ninjonas.h#L37)
+|Code | Description |
+|---|---|
+|K_LOCK | MacOS shortcut to execute lock command  + CTRL + Q |
+|K_CSCN | MacOS shortcut to copy a portion of the screen to the clipboard |
+|K_MDSH | MacOS shortcut to get em-dash `–` |
+|K_RAPP | MacOS shortcut to switch apps to the right |
+|K_LAPP | MacOS shortcut to switch apps to the left |
+
+### [Layers](ninjonas.h#L44)
+|Code | Description |
+|---|---|
+|LT_LOW | Tap for ENTER, hold for RAISE |
+|LT_RAI | Tap for SPACE, hold for LOWER |
+|LT_LOW + LT_RAI | Hold for ADJUST |
+|LM_LOW | Dedicated key to momentarily toggle to use LOWER layer |
+|LM_RAI | Dedicated key to momentarily toggle to use RAISE layer |
+
+### [Mod-Taps](ninjonas.h#L50)
+|Code | Description |
+|---|---|
+|MT_DEL | Tap for Delete, hold for  + ALT + SHIFT |
+|MT_EQL | Tap for =, hold for ALT + SHIFT |
+
+### [Layout Blocks](ninjonas.h#L54)
+Predefined keyboard layout templates to speed up configuring split keyboards
+
+|Code | Description |
+|---|---|
+|QWERTY | Qwerty Layout |
+|DVORAK | Dvorak Layout |
+|COLEMAK | Colemak Layout |
+|NUM | Number Rows |
+|FUNC | Function Rows |
+|SYM | Symbol Rows \(When holding shift on numbers\) |
+|NAV | Navigation Cluster |
+|MOUSE | Mouse Cluster |
+|MEDIA | Media Cluster |
+|MOD | Modifier Cluster |
+
+### [Macros](process_records.c)
+|Code | Description |
+|---|---|
+|M_PYNV | macro to activate pyenv with the name `jira` |
+|M_MAKE | macro to send QMK make command to compile keyboard |
+|M_FLSH | macro to send QMK make command to compile keyboard with the correct bootloader |
+|M_VRSN | macro to send QMK version |
+|M_SHFT | Sends  + alt + shift to a keycode to activate [ShiftIt](https://github.com/fikovnik/ShiftIt) |
+|M_CODE | Opens [Visual Studio Code](https://code.visualstudio.com/) on current directory |
+|M_TERM | Launches Spotlight and calls Terminal |
+|M_XXX1 to M_XXX5 | Reserved for secret macros see [Secrets](#secrets) |
+
+### [Tap-Dance](tap_dances.h)
+|Code | Description |
+|---|---|
+|T_ESC | Tap once for ESC, double tap for CAPS_LOCK |
+|T_LBRC | Tap once for [, double for back browser |
+|T_RBRC | Tap once for ], double for forward browser |
+|T_TAB | Tap once for TAB, double for CTRL + TAB |
+|T_GRV | Tap once for GRV, double for  + GRV |
+|T_GUI | Tap once for , double to open spotlight |
+|T_W | Tap for W, double tap for  + W |
+|T_Q | Tap for Q, double tap for  + Q |
+
+### Secrets
+There's times where you have macros you don't want to share like emails, an address you need but you always forget, passwords 😱, & and private strings. Based off [drashna's secret macros](https://github.com/qmk/qmk_firmware/blob/master/users/drashna/readme_secrets.md), it's now possible to do this. All you need to do is create a `secrets.c` file. Below is an example of how this is used.
+
+```c
+// secrets.c
+#include "ninjonas.h"
+
+static const char * const secret[] = {
+ "BLANK1",
+ "BLANK2",
+ "BLANK3",
+ "BLANK4",
+ "BLANK5"
+};
+
+bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case M_XXX1...M_XXX5:
+ if (record->event.pressed) {
+ send_string(secret[keycode - M_XXX1]);
+ }
+ break;
+ }
+ return true;
+}
+
+``` \ No newline at end of file
diff --git a/users/ninjonas/config.h b/users/ninjonas/config.h
new file mode 100644
index 0000000000..1166939c65
--- /dev/null
+++ b/users/ninjonas/config.h
@@ -0,0 +1,14 @@
+#ifdef TAPPING_TERM
+ #undef TAPPING_TERM
+ #define TAPPING_TERM 200
+#endif
+
+// Mouse Settings: Smoothing out mouse movement on keypress
+#ifndef MOUSEKEY_INTERVAL
+ #undef MOUSEKEY_INTERVAL
+ #define MOUSEKEY_INTERVAL 16
+#endif
+#define MOUSEKEY_DELAY 0
+#define MOUSEKEY_TIME_TO_MAX 60
+#define MOUSEKEY_MAX_SPEED 7
+#define MOUSEKEY_WHEEL_DELAY 0 \ No newline at end of file
diff --git a/users/ninjonas/ninjonas.c b/users/ninjonas/ninjonas.c
new file mode 100644
index 0000000000..49e12e4824
--- /dev/null
+++ b/users/ninjonas/ninjonas.c
@@ -0,0 +1,20 @@
+/* Copyright 2019 @ninjonas
+ *
+ * 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 "ninjonas.h"
+
+layer_state_t layer_state_set_user (layer_state_t state) {
+ return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
+} \ No newline at end of file
diff --git a/users/ninjonas/ninjonas.h b/users/ninjonas/ninjonas.h
new file mode 100644
index 0000000000..b86ccc7333
--- /dev/null
+++ b/users/ninjonas/ninjonas.h
@@ -0,0 +1,136 @@
+/* Copyright 2019 @ninjonas
+ *
+ * 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/>.
+ */
+#pragma once
+#include "quantum.h"
+#include "version.h"
+#include "eeprom.h"
+#include "process_records.h"
+
+#ifdef TAP_DANCE_ENABLE
+ #include "tap_dances.h"
+#endif
+#if defined(KEYBOARD_lily58_rev1) & defined(PROTOCOL_LUFA)
+ #include "lufa.h"
+ #include "split_util.h"
+#endif
+
+#define _QWERTY 0
+#define _DVORAK 1
+#define _COLEMAK 2
+#define _LOWER 3
+#define _RAISE 4
+#define _ADJUST 5
+
+// Shortcut Keys
+#define K_LOCK LGUI(LCTL(KC_Q)) // Locks screen on MacOS
+#define K_CSCN LGUI(LCTL(LSFT(KC_4))) // Copy a portion of the screen to the clipboard
+#define K_MDSH LSFT(LALT(KC_MINS))
+#define K_LAPP SGUI(KC_TAB) //  + Shift + Tab
+#define K_RAPP LGUI(KC_TAB) //  + Tab
+
+// Layer Keys
+#define LM_LOW MO(_LOWER)
+#define LM_RAI MO(_RAISE)
+#define LT_LOW LT(_LOWER, KC_ENT)
+#define LT_RAI LT(_RAISE, KC_SPC)
+
+// Mod-Tap Keys
+#define MT_DEL MT(MOD_LGUI | MOD_LALT | MOD_LSFT, KC_DEL)
+#define MT_EQL MT(MOD_LALT | MOD_LSFT, KC_EQL)
+
+// Layout blocks
+#define _____________________QWERTY_L1______________________ T_TAB, T_Q, T_W, KC_E, KC_R, KC_T
+#define _____________________QWERTY_L2______________________ T_ESC, KC_A, KC_S, KC_D, KC_F, KC_G
+#define _____________________QWERTY_L3______________________ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B
+
+#define _____________________QWERTY_R1______________________ KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS
+#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, MT_EQL
+
+#define _____________________DVORAK_L1______________________ T_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y
+#define _____________________DVORAK_L2______________________ T_ESC, KC_A, KC_O, KC_E, KC_U, KC_I
+#define _____________________DVORAK_L3______________________ KC_LSFT, KC_SCLN, T_Q, KC_J, KC_K, KC_X
+
+#define _____________________DVORAK_R1______________________ KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSLS
+#define _____________________DVORAK_R2______________________ KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH
+#define _____________________DVORAK_R3______________________ KC_B, KC_M, T_W, KC_V, KC_Z, MT_EQL
+
+#define _____________________COLEMAK_L1_____________________ T_TAB, T_Q, T_W, KC_F, KC_P, KC_G
+#define _____________________COLEMAK_L2_____________________ T_ESC, KC_A, KC_R, KC_S, KC_T, KC_D
+#define _____________________COLEMAK_L3_____________________ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B
+
+#define _____________________COLEMAK_R1_____________________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSLS
+#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, MT_EQL
+
+#define _____________________NUM_LEFT_______________________ T_GRV, KC_1, KC_2, KC_3, KC_4, KC_5
+#define _____________________NUM_RIGHT______________________ KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS
+
+#define _____________________FUNC_LEFT______________________ KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5
+#define _____________________FUNC_RIGHT_____________________ KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12
+
+#define _____________________SYM_LEFT_______________________ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC
+#define _____________________SYM_RIGHT______________________ KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_UNDS
+
+#define _____________________LOWER_L1_______________________ M_XXX2, M_XXX3, _________MEDIA_1_________, K_CSCN
+#define _____________________LOWER_L2_______________________ M_XXX4, M_XXX5, _________MEDIA_2_________, XXXXXXX
+#define _____________________LOWER_L3_______________________ KC_LSFT, M_SHFT, _________MEDIA_3_________, T_LBRC
+
+#define _____________________LOWER_R1_______________________ _______________NAV_1______________, XXXXXXX, K_MDSH
+#define _____________________LOWER_R2_______________________ _______________NAV_2______________, K_LOCK, XXXXXXX
+#define _____________________LOWER_R3_______________________ T_RBRC, KC_M, M_TERM, M_CODE, M_XXX1, M_PYNV
+
+#define _____________________ADJUST_L1______________________ M_MAKE, EEP_RST, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+#ifdef RGB_MATRIX_ENABLE
+ #define _____________________ADJUST_L2______________________ M_VRSN, M_MALL, RGB_SPI, RGB_SAI, RGB_HUI, RGB_VAI
+ #define _____________________ADJUST_L3______________________ M_FLSH, XXXXXXX, RGB_SPD, RGB_SAD, RGB_HUD, RGB_VAD
+#else
+ #define _____________________ADJUST_L2______________________ M_VRSN, M_MALL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+ #define _____________________ADJUST_L3______________________ M_FLSH, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+#endif
+
+#ifdef RGB_MATRIX_ENABLE
+ #define _____________________ADJUST_R1______________________ RGB_TOG, XXXXXXX, XXXXXXX, COLEMAK, DVORAK, QWERTY
+ #define _____________________ADJUST_R3______________________ RGB_MOD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+#else
+ #define _____________________ADJUST_R1______________________ XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, DVORAK, QWERTY
+ #define _____________________ADJUST_R3______________________ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+#endif
+#define _____________________ADJUST_R2______________________ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+
+#define _______________NAV_1______________ KC_PGUP, KC_HOME, KC_UP, KC_END
+#define _______________NAV_2______________ KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT
+
+#define _____________MOUSE_1______________ KC_BTN1, KC_MS_U, KC_BTN2, KC_WH_D
+#define _____________MOUSE_2______________ KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_U
+
+#define __________________________________ _______, _______, _______, _______
+
+#define _________MEDIA_1_________ KC_BRIU, KC_MPLY, KC_MUTE
+#define _________MEDIA_2_________ KC_BRID, KC_MFFD, KC__VOLUP
+#define _________MEDIA_3_________ XXXXXXX, KC_MRWD, KC__VOLDOWN
+
+#ifdef KEYBOARD_crkbd_rev1
+ #define ________MOD_LEFT_________ T_GUI, KC_LCTL, LT_RAI
+ #define ________MOD_RIGHT________ LT_LOW, KC_BSPC, MT_DEL
+#else
+ #define ________MOD_LEFT_________ KC_LALT, T_GUI, KC_LCTL
+ #define ________MOD_RIGHT________ KC_BSPC, MT_DEL, LM_LOW
+#endif
+
+// Layout wrappers
+#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
+#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__) \ No newline at end of file
diff --git a/users/ninjonas/oled.c b/users/ninjonas/oled.c
new file mode 100644
index 0000000000..721038e15b
--- /dev/null
+++ b/users/ninjonas/oled.c
@@ -0,0 +1,91 @@
+#include QMK_KEYBOARD_H
+#include <stdio.h>
+#include "ninjonas.h"
+
+#ifdef OLED_DRIVER_ENABLE
+
+static uint32_t oled_timer = 0;
+extern uint8_t is_master;
+
+oled_rotation_t oled_init_user(oled_rotation_t rotation) {
+ if (is_master) {
+ return OLED_ROTATION_0;
+ }
+ return OLED_ROTATION_180;
+}
+
+bool process_record_oled(uint16_t keycode, keyrecord_t *record) {
+ if (record->event.pressed) {
+ oled_timer = timer_read32();
+ }
+ return true;
+}
+
+void render_default_layer_state(void) {
+ oled_write_P(PSTR("Layout: "), false);
+ switch (biton32(default_layer_state)) {
+ case _COLEMAK:
+ oled_write_P(PSTR("Colemak"), false);
+ break;
+ case _DVORAK:
+ oled_write_P(PSTR("Dvorak"), false);
+ break;
+ case _QWERTY:
+ oled_write_P(PSTR("Qwerty"), false);
+ break;
+ default:
+ oled_write_ln_P(PSTR("Undefined"), false);
+ }
+}
+
+void render_layer_state(void) {
+ oled_write_P(PSTR("\nLayer:"), false);
+ oled_write_P(PSTR(" LOW"), layer_state_is(_LOWER));
+ oled_write_P(PSTR(" RAI"), layer_state_is(_RAISE));
+ oled_write_P(PSTR(" ADJ"), layer_state_is(_ADJUST));
+}
+
+void render_mod_status(uint8_t modifiers) {
+ oled_write_P(PSTR("\nMods: "), false);
+ oled_write_P(PSTR("SHF "), (modifiers & MOD_MASK_SHIFT));
+ oled_write_P(PSTR("CTL "), (modifiers & MOD_MASK_CTRL));
+ oled_write_P(PSTR("ALT "), (modifiers & MOD_MASK_ALT));
+ oled_write_P(PSTR("GUI"), (modifiers & MOD_MASK_GUI));
+}
+
+void render_status(void){
+ render_default_layer_state();
+ oled_write_P(PSTR("\n"), false);
+ render_layer_state();
+ render_mod_status(get_mods()|get_oneshot_mods());
+}
+
+static void render_logo(void) {
+ static const char PROGMEM qmk_logo[] = {
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94,
+ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4,
+ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4,
+ 0};
+
+ oled_write_P(qmk_logo, false);
+}
+
+void oled_task_user(void) {
+ if (timer_elapsed32(oled_timer) > 30000) {
+ oled_off();
+ return;
+ }
+ #ifndef SPLIT_KEYBOARD
+ else { oled_on(); }
+ #endif
+
+ if (is_master) {
+ render_status();
+ } else {
+ render_logo();
+ oled_write_P(PSTR("\n"), false);
+ oled_scroll_left();
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/users/ninjonas/process_records.c b/users/ninjonas/process_records.c
new file mode 100644
index 0000000000..8044b49f10
--- /dev/null
+++ b/users/ninjonas/process_records.c
@@ -0,0 +1,117 @@
+#include "ninjonas.h"
+
+__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; }
+
+#ifdef OLED_DRIVER_ENABLE
+__attribute__((weak))
+bool process_record_oled(uint16_t keycode, keyrecord_t *record) { return true; }
+#endif
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+
+ // Sends pyenv to activate 'jira' environment
+ case M_PYNV:
+ if (record->event.pressed) {
+ SEND_STRING("pyenv activate jira\n");
+ }
+ break;
+
+ // Sends  + alt + shift to a keycode to activate shiftit. See: https://github.com/fikovnik/ShiftIt
+ case M_SHFT:
+ if (record->event.pressed) {
+ register_code(KC_LGUI);
+ register_code(KC_LALT);
+ register_code(KC_LCTL);
+ } else {
+ unregister_code(KC_LGUI);
+ unregister_code(KC_LALT);
+ unregister_code(KC_LCTL);
+ }
+ break;
+
+ // Sends QMK make command to compile keyboard
+ case M_MAKE:
+ if (record->event.pressed) {
+ SEND_STRING("rm -f *.hex && rm -rf .build/ && make " QMK_KEYBOARD ":" QMK_KEYMAP SS_TAP(X_ENTER));
+ }
+ break;
+
+ // Sends QMK make command to compile all keyboards
+ case M_MALL:
+ if (record->event.pressed) {
+ SEND_STRING("rm -f *.hex && rm -rf .build/ && make crkbd:ninjonas lily58:ninjonas hotdox:ninjonas pinky/3:ninjonas\n");
+ }
+ break;
+
+ // Sends QMK make command with the correct bootloader
+ case M_FLSH:
+ if (!record->event.pressed) {
+ SEND_STRING("rm -f *.hex && rm -rf .build/ && make " QMK_KEYBOARD ":" QMK_KEYMAP
+ #if (defined(BOOTLOADER_DFU) || defined(BOOTLOADER_LUFA_DFU) || defined(BOOTLOADER_QMK_DFU))
+ ":dfu "
+ #elif defined(BOOTLOADER_CATERINA)
+ ":avrdude "
+ #endif
+ SS_TAP(X_ENTER)
+ );
+
+ // Send reset_keyboard command instead of pressing reset button
+ #if (defined(BOOTLOADER_DFU) || defined(BOOTLOADER_LUFA_DFU) || defined(BOOTLOADER_QMK_DFU))
+ reset_keyboard();
+ #endif
+ }
+ break;
+
+ // Sends QMK version
+ case M_VRSN:
+ if (record->event.pressed) {
+ SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE);
+ }
+ break;
+
+ // Opens Visual Studio Code on current directory
+ case M_CODE:
+ if (record->event.pressed) {
+ SEND_STRING("code .\n");
+ }
+ break;
+
+ // Opens Terminal
+ case M_TERM:
+ if (record->event.pressed) {
+ SEND_STRING(SS_DOWN(X_LGUI) SS_TAP(X_SPACE) SS_UP(X_LGUI));
+ wait_ms(250);
+ SEND_STRING("terminal\n");
+ }
+ break;
+
+ // BEGIN: Layer macros
+ case QWERTY:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_QWERTY);
+ }
+ break;
+ case DVORAK:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_DVORAK);
+ }
+ break;
+ case COLEMAK:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_COLEMAK);
+ }
+ break;
+ // END: Layer macros
+ }
+
+ return process_record_keymap(keycode, record) && process_record_secrets(keycode, record)
+ #ifdef OLED_DRIVER_ENABLE
+ && process_record_oled(keycode, record)
+ #endif
+ ; // Close return
+}
diff --git a/users/ninjonas/process_records.h b/users/ninjonas/process_records.h
new file mode 100644
index 0000000000..2e69ca2163
--- /dev/null
+++ b/users/ninjonas/process_records.h
@@ -0,0 +1,30 @@
+#pragma once
+#include "ninjonas.h"
+
+enum custom_keycodes {
+ // Layer Macros
+ QWERTY = SAFE_RANGE,
+ DVORAK,
+ COLEMAK,
+ // Custom Macros
+ M_PYNV,
+ M_SHFT,
+ M_MAKE,
+ M_MALL,
+ M_FLSH,
+ M_VRSN,
+ M_CODE,
+ M_TERM,
+ // Secret Macros
+ M_XXX1,
+ M_XXX2,
+ M_XXX3,
+ M_XXX4,
+ M_XXX5,
+};
+
+bool process_record_secrets(uint16_t keycode, keyrecord_t *record);
+bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
+#ifdef OLED_DRIVER_ENABLE
+bool process_record_oled(uint16_t keycode, keyrecord_t *record);
+#endif
diff --git a/users/ninjonas/rules.mk b/users/ninjonas/rules.mk
new file mode 100644
index 0000000000..7b77e153d3
--- /dev/null
+++ b/users/ninjonas/rules.mk
@@ -0,0 +1,13 @@
+BOOTMAGIC_ENABLE = no # Disable Boot Magic (https://beta.docs.qmk.fm/features/feature_bootmagic)
+MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
+TAP_DANCE_ENABLE = yes # Enable Tap Dance.
+
+SRC += ninjonas.c \
+ process_records.c \
+ tap_dances.c \
+ oled.c
+
+ifneq ("$(wildcard $(USER_PATH)/secrets.c)","")
+ SRC += secrets.c
+endif \ No newline at end of file
diff --git a/users/ninjonas/tap_dances.c b/users/ninjonas/tap_dances.c
new file mode 100644
index 0000000000..0665a1607d
--- /dev/null
+++ b/users/ninjonas/tap_dances.c
@@ -0,0 +1,12 @@
+#include "ninjonas.h"
+
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS),
+ [TD_LBRC_BACK] = ACTION_TAP_DANCE_DOUBLE(KC_LBRC, LGUI(KC_LBRC)),
+ [TD_RBRC_FWD] = ACTION_TAP_DANCE_DOUBLE(KC_RBRC, LGUI(KC_RBRC)),
+ [TD_TAB_CTRLTAB] = ACTION_TAP_DANCE_DOUBLE(KC_TAB, LCTL(KC_TAB)),
+ [TD_GRV_CTRLGRV] = ACTION_TAP_DANCE_DOUBLE(KC_GRV, LGUI(KC_GRV)),
+ [TD_GUI_GUISPC] = ACTION_TAP_DANCE_DOUBLE(KC_LGUI, LGUI(KC_SPC)),
+ [TD_W_CTRLW] = ACTION_TAP_DANCE_DOUBLE(KC_W, LGUI(KC_W)),
+ [TD_Q_GUIQ] = ACTION_TAP_DANCE_DOUBLE(KC_Q, LGUI(KC_Q)),
+}; \ No newline at end of file
diff --git a/users/ninjonas/tap_dances.h b/users/ninjonas/tap_dances.h
new file mode 100644
index 0000000000..0a781ce4ed
--- /dev/null
+++ b/users/ninjonas/tap_dances.h
@@ -0,0 +1,22 @@
+#pragma once
+#include "ninjonas.h"
+
+enum custom_tapdances{
+ TD_ESC_CAPS = 0,
+ TD_LBRC_BACK,
+ TD_RBRC_FWD,
+ TD_TAB_CTRLTAB,
+ TD_GRV_CTRLGRV,
+ TD_GUI_GUISPC,
+ TD_W_CTRLW,
+ TD_Q_GUIQ,
+};
+
+#define T_ESC TD(TD_ESC_CAPS) // Tap for ESC, double tap for CAPSLOCK
+#define T_LBRC TD(TD_LBRC_BACK) // Tap for [, double tap for back browser
+#define T_RBRC TD(TD_RBRC_FWD) // Tap for ], double tap for forward browser
+#define T_TAB TD(TD_TAB_CTRLTAB) // Tap for TAB, double tap for CTRL + TAB
+#define T_GRV TD(TD_GRV_CTRLGRV) // Tap for GRV, double tap for  + GRV
+#define T_GUI TD(TD_GUI_GUISPC) // Tap for , double tap for  + Space
+#define T_W TD(TD_W_CTRLW) // Tap for W, double tap for  + W
+#define T_Q TD(TD_Q_GUIQ) // Tap for Q, double tap for  + Q \ No newline at end of file
diff --git a/users/ridingqwerty/config.h b/users/ridingqwerty/config.h
new file mode 100644
index 0000000000..2461b8b8dd
--- /dev/null
+++ b/users/ridingqwerty/config.h
@@ -0,0 +1,3 @@
+#pragma once
+#define TAPPING_TERM 175
+#define MACRO_TIMER 5
diff --git a/users/ridingqwerty/process_records.c b/users/ridingqwerty/process_records.c
new file mode 100644
index 0000000000..be72883ecb
--- /dev/null
+++ b/users/ridingqwerty/process_records.c
@@ -0,0 +1,33 @@
+#include "ridingqwerty.h"
+
+__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;
+}
+
+uint16_t user_key_timer;
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch(keycode) {
+ case RG_QUOT:
+ if (record->event.pressed) {
+ user_key_timer = timer_read();
+ layer_on(_NUMBER);
+ register_mods(MOD_BIT(KC_RGUI));
+ } else {
+ unregister_mods(MOD_BIT(KC_RGUI));
+ layer_off(_NUMBER);
+ if (timer_elapsed(user_key_timer) < TAPPING_TERM) {
+ register_code(KC_QUOT);
+ unregister_code(KC_QUOT);
+ }
+ }
+ return false; break;
+ }
+ return process_record_keymap(keycode, record) &&
+ process_record_secrets(keycode, record);
+}
diff --git a/users/ridingqwerty/process_records.h b/users/ridingqwerty/process_records.h
new file mode 100644
index 0000000000..2c453bcd93
--- /dev/null
+++ b/users/ridingqwerty/process_records.h
@@ -0,0 +1,29 @@
+#pragma once
+#include "ridingqwerty.h"
+
+#if defined(KEYMAP_SAFE_RANGE)
+ #define PLACEHOLDER_SAFE_RANGE KEYMAP_SAFE_RANGE
+#else
+ #define PLACEHOLDER_SAFE_RANGE SAFE_RANGE
+#endif
+
+bool process_record_secrets(uint16_t keycode, keyrecord_t *record);
+bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
+
+enum userspace_custom_keycodes {
+ FIRST = PLACEHOLDER_SAFE_RANGE,
+ RUSTY,
+ FUEL,
+ C0RE,
+ MUNKY,
+ AR1ST,
+ VAXIS,
+ OS_LAB,
+ CDLOCAL,
+ SYSNOC,
+ RG_QUOT,
+ LAST
+};
+
+bool process_record_secrets(uint16_t keycode, keyrecord_t *record);
+bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
diff --git a/users/ridingqwerty/ridingqwerty.c b/users/ridingqwerty/ridingqwerty.c
new file mode 100644
index 0000000000..fd39021da5
--- /dev/null
+++ b/users/ridingqwerty/ridingqwerty.c
@@ -0,0 +1 @@
+#include "ridingqwerty.h"
diff --git a/users/ridingqwerty/ridingqwerty.h b/users/ridingqwerty/ridingqwerty.h
new file mode 100644
index 0000000000..ae5262567c
--- /dev/null
+++ b/users/ridingqwerty/ridingqwerty.h
@@ -0,0 +1,37 @@
+#pragma once
+
+#include "quantum.h"
+#include "process_records.h"
+
+enum userspace_layers
+{
+ _QWERTY = 0,
+ _EDITOR,
+ _NUMBER,
+ _SYMBOL,
+ _F_KEYS,
+ _DEBUG,
+ _SECRET,
+ _FINAL
+};
+
+// modtaps
+#define LS_Z MT(MOD_LSFT, KC_Z)
+#define LC_ESC MT(MOD_LCTL, KC_ESC)
+#define LG_TAB MT(MOD_LGUI, KC_TAB)
+#define LA_LBRC MT(MOD_LALT, KC_LBRC)
+#define LS_RBRC MT(MOD_LSFT, KC_RBRC)
+#define RS_MINS MT(MOD_RSFT, KC_MINS)
+#define RA_EQL MT(MOD_RALT, KC_EQL)
+//RG_LMOT defined in process_records.h
+#define RC_ENT MT(MOD_RCTL, KC_ENT)
+#define RS_SLSH MT(MOD_RSFT, KC_SLSH)
+// layertaps
+#define ED_A LT(_EDITOR, KC_A)
+#define ED_ESC LT(_EDITOR, KC_ESC)
+#define NM_SCLN LT(_NUMBER, KC_SCLN)
+#define NM_BSPC LT(_NUMBER, KC_BSPC)
+#define SM_SPC LT(_SYMBOL, KC_SPC)
+#define SC_TAB LT(_SECRET, KC_TAB)
+#define FK_DOT LT(_F_KEYS, KC_DOT)
+
diff --git a/users/ridingqwerty/rules.mk b/users/ridingqwerty/rules.mk
new file mode 100644
index 0000000000..9c38467448
--- /dev/null
+++ b/users/ridingqwerty/rules.mk
@@ -0,0 +1,8 @@
+#LEADER_ENABLE = yes
+
+SRC += ridingqwerty.c \
+ process_records.c
+
+ifneq ("$(wildcard $(USER_PATH)/secrets.c)","")
+ SRC += secrets.c
+endif
diff --git a/users/rishka/rishka.c b/users/rishka/rishka.c
new file mode 100644
index 0000000000..c988072d63
--- /dev/null
+++ b/users/rishka/rishka.c
@@ -0,0 +1 @@
+#include "rishka.h"
diff --git a/users/rishka/rishka.h b/users/rishka/rishka.h
new file mode 100644
index 0000000000..96915993dc
--- /dev/null
+++ b/users/rishka/rishka.h
@@ -0,0 +1,74 @@
+#pragma once
+
+#if (!defined(LAYOUT) && defined(KEYMAP))
+# define LAYOUT KEYMAP
+#endif
+
+#undef MK_MOMENTARY_ACCEL
+#define MK_3_SPEED 1
+
+#define LAYOUT_ergodox_pretty_wrapper(...) LAYOUT_ergodox_pretty(__VA_ARGS__)
+#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
+#define LAYOUT_5x6_wrapper(...) LAYOUT_5x6(__VA_ARGS__)
+#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 MOUSE_L LSFT(KC_WH_D)
+#define MOUSE_R LSFT(KC_WH_U)
+#define OSX_LOCK LCTL(LGUI(KC_Q))
+
+// layout parts for easy reuse between keyboard keymaps
+// ,-----+-----+-----+-----+-----, ,-----+-----+-----+-----+-----,
+// | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 |
+// ,-----+-----+-----+-----+-----, ,-----+-----+-----+-----+-----,
+#define ________________NUMBERS_L__________________ KC_1, KC_2, KC_3, KC_4, KC_5
+#define ________________NUMBERS_R__________________ KC_6, KC_7, KC_8, KC_9, KC_0
+
+// ,-----+-----+-----+-----+-----, ,-----+-----+-----+-----+-----,
+// | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 |
+// ,-----+-----+-----+-----+-----, ,-----+-----+-----+-----+-----,
+#define ______________________F_L__________________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5
+#define ______________________F_R__________________ KC_F6, KC_F7, KC_F8, KC_F9, KC_F10
+
+// ,-----+-----+-----+-----+-----, ,-----+-----+-----+-----+-----,
+// | Q | W | E | R | T | | Y | U | I | O | P |
+// ,-----+-----+-----x-----x-----, ,-----x-----x-----+-----+-----,
+// | A | S | D | F | G | | H | J | K | L | ; |
+// ,-----+-----+-----x-----x-----, ,-----x-----x-----+-----+-----,
+// | Z | X | C | V | B | | N | M | , | . | / |
+// ,-----+-----+-----+-----+-----, ,-----+-----+-----+-----+-----,
+#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
+#define _________________QWERTY_R3_________________ KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH
+
+#define _____________MOD_QWERTY_L2_________________ CTL_T(KC_A), SFT_T(KC_S), GUI_T(KC_D), ALT_T(KC_F), KC_G
+#define _____________MOD_QWERTY_R2_________________ KC_H , ALT_T(KC_J), GUI_T(KC_K), SFT_T(KC_L), CTL_T(KC_SCLN)
+
+// ,-----+-----+-----+-----+-----, ,-----+-----+-----+-----+-----,
+// | ! | @ | { | } | _ | | \ | 7 | 8 | 9 | |
+// ,-----+-----+-----x-----x-----, ,-----x-----x-----+-----+-----,
+// | # | $ | ( | ) | - | | = | 4 | 5 | 6 | | |
+// ,-----+-----+-----x-----x-----, ,-----x-----x-----+-----+-----,
+// | % | ^ | [ | ] | + | | * | 1 | 2 | 3 | / |
+// ,-----+-----+-----+-----+-----, ,-----+-----+-----+-----+-----,
+#define _________________SYMBOL_L1_________________ KC_EXLM, KC_AT , KC_LCBR, KC_RCBR, KC_UNDS
+#define _________________SYMBOL_L2_________________ KC_HASH, KC_DLR , KC_LPRN, KC_RPRN, KC_MINS
+#define _________________SYMBOL_L3_________________ KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_PLUS
+
+#define _________________SYMBOL_R1_________________ KC_BSLS, KC_P7, KC_P8 , KC_P9, KC_PAST
+#define _________________SYMBOL_R2_________________ KC_EQL , KC_P4, KC_P5, KC_P6, KC_PPLS
+#define _________________SYMBOL_R3_________________ KC_ASTR, KC_P1, KC_P2, KC_P3, KC_PMNS
diff --git a/users/rishka/rules.mk b/users/rishka/rules.mk
new file mode 100644
index 0000000000..a0b8e58470
--- /dev/null
+++ b/users/rishka/rules.mk
@@ -0,0 +1 @@
+SRC += rishka.c
diff --git a/users/sethBarberee/config.h b/users/sethBarberee/config.h
new file mode 100644
index 0000000000..a849ac0e77
--- /dev/null
+++ b/users/sethBarberee/config.h
@@ -0,0 +1,8 @@
+#ifdef RGBLIGHT_ENABLE
+# ifndef CAPS_LOCK_MODE
+# define CAPS_LOCK_MODE 1
+# endif
+# ifndef NORMAL_MODE
+# define NORMAL_MODE 4
+# endif
+#endif
diff --git a/users/sethBarberee/readme.md b/users/sethBarberee/readme.md
new file mode 100644
index 0000000000..75d892cb85
--- /dev/null
+++ b/users/sethBarberee/readme.md
@@ -0,0 +1,6 @@
+# seth's userspace
+
+## Features
+* Escape/Caps Lock tap dance (1 for Escape / 2 for Caps Lock)
+ * RGB Mode indication for Caps Lock
+ * Solid Mode for Caps On
diff --git a/users/sethBarberee/rules.mk b/users/sethBarberee/rules.mk
new file mode 100644
index 0000000000..d8aef60523
--- /dev/null
+++ b/users/sethBarberee/rules.mk
@@ -0,0 +1 @@
+SRC += sethBarberee.c
diff --git a/users/sethBarberee/sethBarberee.c b/users/sethBarberee/sethBarberee.c
new file mode 100644
index 0000000000..10f78f63b5
--- /dev/null
+++ b/users/sethBarberee/sethBarberee.c
@@ -0,0 +1,45 @@
+#include "sethBarberee.h"
+#ifdef RGBLIGHT_ENABLE
+#ifdef TAP_DANCE_ENABLE
+
+// Initialize it now
+tap caps_status = {
+ .toggled = false,
+ .toggle_mode = CAPS_LOCK_MODE,
+ .normal_mode = NORMAL_MODE
+};
+
+void dance_ecap_finished (qk_tap_dance_state_t *state, void *user_data){
+ if(state->count == 1){
+ register_code(KC_ESC);
+ } else {
+ register_code(KC_CAPS);
+ if(!caps_status.toggled){
+ // Toggling caps so indicate
+ caps_status.toggled = true;
+ rgblight_mode_noeeprom(caps_status.toggle_mode);
+ } else {
+ // Turning off so return to normal mode
+ caps_status.toggled = false;
+ rgblight_mode_noeeprom(caps_status.normal_mode);
+ }
+ }
+}
+
+void dance_ecap_reset (qk_tap_dance_state_t *state, void *user_data){
+ if(state->count == 1){
+ unregister_code(KC_ESC);
+ } else {
+ unregister_code(KC_CAPS);
+ }
+}
+
+//Tap Dance Definitions
+qk_tap_dance_action_t tap_dance_actions[] = {
+ //Tap once for Esc, twice for Caps Lock
+ [TD_ECAP] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_ecap_finished, dance_ecap_reset),
+// Other declarations would go here, separated by commas, if you have them
+};
+
+#endif
+#endif
diff --git a/users/sethBarberee/sethBarberee.h b/users/sethBarberee/sethBarberee.h
new file mode 100644
index 0000000000..23774ba4eb
--- /dev/null
+++ b/users/sethBarberee/sethBarberee.h
@@ -0,0 +1,20 @@
+#ifndef USERSPACE
+#define USERSPACE
+
+#include "quantum.h"
+
+#ifdef TAP_DANCE_ENABLE // only enable for tap dances
+ enum {
+ TD_ECAP = 0,
+ };
+
+ #define KC_ECAP TD(TD_ECAP)
+
+ typedef struct {
+ bool toggled; // store whether we have toggled caps lock
+ int toggle_mode; // idk why but maybe do something with this..
+ int normal_mode;
+ } tap;
+#endif
+
+#endif
diff --git a/users/talljoe/talljoe.c b/users/talljoe/talljoe.c
index 345b5604bb..a533ff6103 100644
--- a/users/talljoe/talljoe.c
+++ b/users/talljoe/talljoe.c
@@ -2,7 +2,7 @@
#include "talljoe.h"
#ifdef ZEAL_RGB
-#include "../../../keyboards/zeal60/rgb_backlight.h"
+#include "../../../keyboards/wilba_tech/wt_rgb_backlight.h"
#endif
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
diff --git a/users/tominabox1/.gitignore b/users/tominabox1/.gitignore
new file mode 100644
index 0000000000..62a8666982
--- /dev/null
+++ b/users/tominabox1/.gitignore
@@ -0,0 +1,2 @@
+*.bmp
+*.py
diff --git a/users/tominabox1/config.h b/users/tominabox1/config.h
new file mode 100644
index 0000000000..2a8c1e943d
--- /dev/null
+++ b/users/tominabox1/config.h
@@ -0,0 +1,80 @@
+#pragma once
+
+// Tapping term settings
+#define TAPPING_TERM_PER_KEY
+#define TAP_HOLD_CAPS_DELAY 350
+#define BOOTMAGIC_KEY_SALT KC_BSPACE
+#define BOOTMAGIC_KEY_EEPROM_CLEAR KC_Q
+
+// OLED settings
+#define OLED_FONT_H "users/tominabox1/doug.c"
+#define OLED_DISABLE_TIMEOUT
+
+#define DEBOUNCE 5
+
+// Setup RGB settings for the Dimple.
+#ifdef KEYBOARD_lazydesigners_dimple
+ #ifdef RGBLIGHT_ENABLE
+ #undef RGBLED_NUM
+ #define RGBLED_NUM 50
+ #define RGBLIGHT_ANIMATIONS
+ #define RGBLIGHT_SLEEP
+ #endif // RGBLIGHT_ENABLE
+
+ #ifdef RGB_MATRIX_ENABLE
+ #undef RGBLED_NUM
+ #define RGBLED_NUM 50
+ #define DRIVER_LED_TOTAL RGBLED_NUM
+ #endif // RGBL_MATRIX_ENABLE
+#endif // KEYBOARD_lazydesigners_dimple
+
+// RGB_Matrix settings
+#ifdef RGB_MATRIX_ENABLE
+ #define RGB_MATRIX_KEYPRESSES // reacts to keypresses
+ #define RGB_DISABLE_WHEN_USB_SUSPENDED true // turn off effects when suspended
+ #define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
+ #define RGB_MATRIX_MAXIMUM_BRIGHTNESS 150 // limits maximum brightness of LEDs to 150 out of 255. Higher may cause the controller to crash.
+ #define RGB_MATRIX_HUE_STEP 8
+ #define RGB_MATRIX_SAT_STEP 8
+ #define RGB_MATRIX_VAL_STEP 8
+ #define RGB_MATRIX_SPD_STEP 10
+ #define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_CYCLE_LEFT_RIGHT
+ /* Disable the animations you don't want/need. You will need to disable a good number of these
+ because they take up a lot of space. Disable until you can successfully compile your firmware. */
+ // #define DISABLE_RGB_MATRIX_ALPHAS_MODS
+ // #define DISABLE_RGB_MATRIX_GRADIENT_UP_DOWN
+ #define DISABLE_RGB_MATRIX_BREATHING
+ // #define DISABLE_RGB_MATRIX_CYCLE_ALL
+ // #define DISABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
+ // #define DISABLE_RGB_MATRIX_CYCLE_UP_DOWN
+ // #define DISABLE_RGB_MATRIX_CYCLE_OUT_IN
+ // #define DISABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
+ #define DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
+ #define DISABLE_RGB_MATRIX_DUAL_BEACON
+ #define DISABLE_RGB_MATRIX_RAINBOW_BEACON
+ #define DISABLE_RGB_MATRIX_RAINBOW_PINWHEELS
+ // #define DISABLE_RGB_MATRIX_RAINDROPS
+ #define DISABLE_RGB_MATRIX_JELLYBEN_RAINDROPS
+ // # define DISABLE_RGB_MATRIX_TYPING_HEATMAP
+ #define DISABLE_RGB_MATRIX_DIGITAL_RAIN
+ #define DISABLE_RGB_MATRIX_SOLID_REACTIVE
+ #define DISABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
+ // #define DISABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
+ // #define DISABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
+ // #define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
+ #define DISABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
+ #define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
+ #define DISABLE_RGB_MATRIX_SPLASH
+ #define DISABLE_RGB_MATRIX_MULTISPLASH
+ #define DISABLE_RGB_MATRIX_SOLID_SPLASH
+ #define DISABLE_RGB_MATRIX_SOLID_MULTISPLASH
+#endif //RGB_MATRIX_ENABLE
+
+// Hex size reduction options
+#ifndef NO_DEBUG
+ #define NO_DEBUG
+#endif // !NO_DEBUG
+#if !defined(NO_PRINT) && !defined(CONSOLE_ENABLE)
+ #define NO_PRINT
+#endif // !NO_PRINT
+#define NO_ACTION_ONESHOT
diff --git a/users/tominabox1/dimple_rgb.c b/users/tominabox1/dimple_rgb.c
new file mode 100644
index 0000000000..49d95eb43a
--- /dev/null
+++ b/users/tominabox1/dimple_rgb.c
@@ -0,0 +1,433 @@
+#include "dz60rgb.h"
+#include "config.h"
+#if defined (dzrgb60_iso)
+const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
+ {0, K_14, J_14, L_14},
+ {0, K_13, J_13, L_13},
+ {0, K_12, J_12, L_12},
+ {0, K_11, J_11, L_11},
+ {0, K_10, J_10, L_10},
+ {0, K_9, J_9, L_9},
+ {0, K_8, J_8, L_8},
+ {0, K_7, J_7, L_7},
+ {0, K_6, J_6, L_6},
+ {0, K_5, J_5, L_5},
+ {0, K_4, J_4, L_4},
+ {0, K_3, J_3, L_3},
+ {0, K_2, J_2, L_2},
+ {0, K_1, J_1, L_1},
+ {0, H_15, G_15, I_15},
+ {0, H_13, G_13, I_13},
+ {0, H_12, G_12, I_12},
+ {0, H_11, G_11, I_11},
+ {0, H_10, G_10, I_10},
+ {0, H_9, G_9, I_9},
+ {0, H_8, G_8, I_8},
+ {0, H_7, G_7, I_7},
+ {0, H_6, G_6, I_6},
+ {0, H_5, G_5, I_5},
+ {0, H_4, G_4, I_4},
+ {0, H_3, G_3, I_3},
+ {0, H_2, G_2, I_2},
+ {0, H_1, G_1, I_1},
+ {0, B_14, A_14, C_14},
+ {0, E_12, D_12, F_12},
+ {0, E_11, D_11, F_11},
+ {0, E_10, D_10, F_10},
+ {0, E_9, D_9, F_9},
+ {0, E_8, D_8, F_8},
+ {0, E_7, D_7, F_7},
+ {0, E_6, D_6, F_6},
+ {0, E_5, D_5, F_5},
+ {0, E_4, D_4, F_4},
+ {0, E_3, D_3, F_3},
+ {0, E_2, D_2, F_2},
+ {0, E_1, D_1, F_1},
+ {0, B_13, A_13, C_13},
+ {0, B_11, A_11, C_11},
+ {0, B_10, A_10, C_10},
+ {0, B_9, A_9, C_9},
+ {0, B_8, A_8, C_8},
+ {0, B_7, A_7, C_7},
+ {0, B_6, A_6, C_6},
+ {0, B_5, A_5, C_5},
+ {0, B_4, A_4, C_4},
+ {0, B_3, A_3, C_3},
+ {0, B_2, A_2, C_2},
+ {0, B_1, A_1, C_1},
+ {0, B_15, A_15, C_15},
+ {0, E_13, D_13, F_13},
+ {0, B_12, A_12, C_12},
+ {0, E_15, D_15, F_15},
+ {0, B_16, A_16, C_16},
+ {0, E_16, D_16, F_16},
+ {0, H_16, G_16, I_16},
+ {0, K_16, J_16, L_16},
+};
+
+led_config_t g_led_config = { {
+ { 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 },
+ { 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 28 },
+ { 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, NO_LED, 14 },
+ { 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, NO_LED, NO_LED },
+ { 60, 59, 58, NO_LED, NO_LED, 57, NO_LED, NO_LED, NO_LED, 56, 55, 54, NO_LED, 53 }
+}, {
+ { 216, 0 }, { 192, 0 }, { 176, 0 }, { 160, 0 }, { 144, 0 }, { 128, 0 }, { 112, 0 }, { 96, 0 }, { 80, 0 }, { 64, 0 }, { 48, 0 }, { 32, 0 }, { 16, 0 }, { 0, 0 },
+ { 220, 24 }, { 200, 16 }, { 184, 16 }, { 168, 16 }, { 152, 16 }, { 136, 16 }, { 120, 16 }, { 104, 16 }, { 88, 16 }, { 72, 16 }, { 56, 16 }, { 40, 16 }, { 24, 16 }, { 4, 16 },
+ { 204, 32 }, { 188, 32 }, { 172, 32 }, { 156, 32 }, { 140, 32 }, { 124, 32 }, { 108, 32 }, { 92, 32 }, { 76, 32 }, { 60, 32 }, { 44, 32 }, { 28, 32 }, { 6, 32 }, { 210, 48 },
+ { 180, 48 }, { 164, 48 }, { 148, 48 }, { 132, 48 }, { 116, 48 }, { 100, 48 }, { 84, 48 }, { 68, 48 }, { 52, 48 }, { 20, 48 }, { 10, 48 }, { 222, 64 }, { 202, 64 }, { 182, 64 },
+ { 162, 64 }, { 102, 64 }, { 42, 64 }, { 22, 64 }, { 2, 64 }
+}, {
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
+ 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1,
+ 1, 4, 1, 1, 1
+} };
+
+#elif defined (dzrgb60_hhkb)
+const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
+ {0, H_15, G_15, I_15},
+ {0, K_14, J_14, L_14},
+ {0, K_13, J_13, L_13},
+ {0, K_12, J_12, L_12},
+ {0, K_11, J_11, L_11},
+ {0, K_10, J_10, L_10},
+ {0, K_9, J_9, L_9},
+ {0, K_8, J_8, L_8},
+ {0, K_7, J_7, L_7},
+ {0, K_6, J_6, L_6},
+ {0, K_5, J_5, L_5},
+ {0, K_4, J_4, L_4},
+ {0, K_3, J_3, L_3},
+ {0, K_2, J_2, L_2},
+ {0, K_1, J_1, L_1},
+ {0, H_14, G_14, I_14},
+ {0, H_13, G_13, I_13},
+ {0, H_12, G_12, I_12},
+ {0, H_11, G_11, I_11},
+ {0, H_10, G_10, I_10},
+ {0, H_9, G_9, I_9},
+ {0, H_8, G_8, I_8},
+ {0, H_7, G_7, I_7},
+ {0, H_6, G_6, I_6},
+ {0, H_5, G_5, I_5},
+ {0, H_4, G_4, I_4},
+ {0, H_3, G_3, I_3},
+ {0, H_2, G_2, I_2},
+ {0, H_1, G_1, I_1},
+ {0, E_14, D_14, F_14},
+ {0, E_12, D_12, F_12},
+ {0, E_11, D_11, F_11},
+ {0, E_10, D_10, F_10},
+ {0, E_9, D_9, F_9},
+ {0, E_8, D_8, F_8},
+ {0, E_7, D_7, F_7},
+ {0, E_6, D_6, F_6},
+ {0, E_5, D_5, F_5},
+ {0, E_4, D_4, F_4},
+ {0, E_3, D_3, F_3},
+ {0, E_2, D_2, F_2},
+ {0, E_1, D_1, F_1},
+ {0, B_14, A_14, C_14},
+ {0, B_13, A_13, C_13},
+ {0, B_11, A_11, C_11},
+ {0, B_10, A_10, C_10},
+ {0, B_9, A_9, C_9},
+ {0, B_8, A_8, C_8},
+ {0, B_7, A_7, C_7},
+ {0, B_6, A_6, C_6},
+ {0, B_5, A_5, C_5},
+ {0, B_4, A_4, C_4},
+ {0, B_3, A_3, C_3},
+ {0, B_2, A_2, C_2},
+ {0, B_1, A_1, C_1},
+ {0, B_15, A_15, C_15},
+ {0, E_13, D_13, F_13},
+ {0, B_12, A_12, C_12},
+ {0, B_16, A_16, C_16},
+ {0, E_16, D_16, F_16},
+ {0, H_16, G_16, I_16},
+ {0, K_16, J_16, L_16},
+};
+
+led_config_t g_led_config = { {
+ { 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 },
+ { 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15 },
+ { 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 0, 29 },
+ { 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, NO_LED, 42 },
+ { 61, 60, 59, NO_LED, NO_LED, 58, NO_LED, NO_LED, NO_LED, NO_LED, 57, 56, NO_LED, 55 }
+}, {
+ { 224, 0 }, { 208, 0 }, { 192, 0 }, { 176, 0 }, { 160, 0 }, { 144, 0 }, { 128, 0 }, { 112, 0 }, { 96, 0 }, { 80, 0 }, { 64, 0 }, { 48, 0 }, { 32, 0 }, { 16, 0 },
+ { 0, 0 }, { 220, 16 }, { 200, 16 }, { 184, 16 }, { 168, 16 }, { 152, 16 }, { 136, 16 }, { 120, 16 }, { 104, 16 }, { 88, 16 }, { 72, 16 }, { 56, 16 }, { 40, 16 }, { 24, 16 },
+ { 4, 16 }, { 204, 32 }, { 188, 32 }, { 172, 32 }, { 156, 32 }, { 140, 32 }, { 124, 32 }, { 108, 32 }, { 92, 32 }, { 76, 32 }, { 60, 32 }, { 44, 32 }, { 28, 32 }, { 6, 32 },
+ { 224, 48 }, { 202, 48 }, { 180, 48 }, { 164, 48 }, { 148, 48 }, { 132, 48 }, { 116, 48 }, { 100, 48 }, { 84, 48 }, { 68, 48 }, { 52, 48 }, { 20, 48 }, { 10, 48 }, { 218, 64 },
+ { 198, 64 }, { 178, 64 }, { 112, 64 }, { 46, 64 }, { 26, 64 }, { 6, 64 }
+}, {
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
+ 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1,
+ 1, 1, 4, 1, 1, 1
+} };
+
+#elif defined (dzrgb60_hhkb_iso)
+const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
+ {0, H_15, G_15, I_15},
+ {0, K_14, J_14, L_14},
+ {0, K_13, J_13, L_13},
+ {0, K_12, J_12, L_12},
+ {0, K_11, J_11, L_11},
+ {0, K_10, J_10, L_10},
+ {0, K_9, J_9, L_9},
+ {0, K_8, J_8, L_8},
+ {0, K_7, J_7, L_7},
+ {0, K_6, J_6, L_6},
+ {0, K_5, J_5, L_5},
+ {0, K_4, J_4, L_4},
+ {0, K_3, J_3, L_3},
+ {0, K_2, J_2, L_2},
+ {0, K_1, J_1, L_1},
+ {0, K_15, J_15, L_15},
+ {0, H_13, G_13, I_13},
+ {0, H_12, G_12, I_12},
+ {0, H_11, G_11, I_11},
+ {0, H_10, G_10, I_10},
+ {0, H_9, G_9, I_9},
+ {0, H_8, G_8, I_8},
+ {0, H_7, G_7, I_7},
+ {0, H_6, G_6, I_6},
+ {0, H_5, G_5, I_5},
+ {0, H_4, G_4, I_4},
+ {0, H_3, G_3, I_3},
+ {0, H_2, G_2, I_2},
+ {0, H_1, G_1, I_1},
+ {0, E_15, D_15, F_15},
+ {0, E_12, D_12, F_12},
+ {0, E_11, D_11, F_11},
+ {0, E_10, D_10, F_10},
+ {0, E_9, D_9, F_9},
+ {0, E_8, D_8, F_8},
+ {0, E_7, D_7, F_7},
+ {0, E_6, D_6, F_6},
+ {0, E_5, D_5, F_5},
+ {0, E_4, D_4, F_4},
+ {0, E_3, D_3, F_3},
+ {0, E_2, D_2, F_2},
+ {0, E_1, D_1, F_1},
+ {0, B_14, A_14, C_14},
+ {0, B_13, A_13, C_13},
+ {0, B_11, A_11, C_11},
+ {0, B_10, A_10, C_10},
+ {0, B_9, A_9, C_9},
+ {0, B_8, A_8, C_8},
+ {0, B_7, A_7, C_7},
+ {0, B_6, A_6, C_6},
+ {0, B_5, A_5, C_5},
+ {0, B_4, A_4, C_4},
+ {0, B_3, A_3, C_3},
+ {0, B_2, A_2, C_2},
+ {0, B_1, A_1, C_1},
+ {0, B_15, A_15, C_15},
+ {0, E_13, D_13, F_13},
+ {0, B_12, A_12, C_12},
+ {0, B_16, A_16, C_16},
+ {0, E_16, D_16, F_16},
+ {0, H_16, G_16, I_16},
+ {0, K_16, J_16, L_16},
+};
+
+led_config_t g_led_config = { {
+ { 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 },
+ { 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 29 },
+ { 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 0, 15 },
+ { 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, NO_LED, 42 },
+ { 61, 60, 59, NO_LED, NO_LED, 58, NO_LED, NO_LED, NO_LED, NO_LED, 57, 56, NO_LED, 55 }
+}, {
+ { 224, 0 }, { 208, 0 }, { 192, 0 }, { 176, 0 }, { 160, 0 }, { 144, 0 }, { 128, 0 }, { 112, 0 }, { 96, 0 }, { 80, 0 }, { 64, 0 }, { 48, 0 }, { 32, 0 }, { 16, 0 },
+ { 0, 0 }, { 220, 24 }, { 200, 16 }, { 184, 16 }, { 168, 16 }, { 152, 16 }, { 136, 16 }, { 120, 16 }, { 104, 16 }, { 88, 16 }, { 72, 16 }, { 56, 16 }, { 40, 16 }, { 24, 16 },
+ { 4, 16 }, { 204, 32 }, { 188, 32 }, { 172, 32 }, { 156, 32 }, { 140, 32 }, { 124, 32 }, { 108, 32 }, { 92, 32 }, { 76, 32 }, { 60, 32 }, { 44, 32 }, { 28, 32 }, { 6, 32 },
+ { 224, 48 }, { 202, 48 }, { 180, 48 }, { 164, 48 }, { 148, 48 }, { 132, 48 }, { 116, 48 }, { 100, 48 }, { 84, 48 }, { 68, 48 }, { 52, 48 }, { 20, 48 }, { 10, 48 }, { 218, 64 },
+ { 198, 64 }, { 178, 64 }, { 112, 64 }, { 46, 64 }, { 26, 64 }, { 6, 64 }
+}, {
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
+ 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1,
+ 1, 1, 4, 1, 1, 1
+} };
+
+#elif defined (dzrgb60_ansi)
+const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
+ {0, K_14, J_14, L_14},
+ {0, K_13, J_13, L_13},
+ {0, K_12, J_12, L_12},
+ {0, K_11, J_11, L_11},
+ {0, K_10, J_10, L_10},
+ {0, K_9, J_9, L_9},
+ {0, K_8, J_8, L_8},
+ {0, K_7, J_7, L_7},
+ {0, K_6, J_6, L_6},
+ {0, K_5, J_5, L_5},
+ {0, K_4, J_4, L_4},
+ {0, K_3, J_3, L_3},
+ {0, K_2, J_2, L_2},
+ {0, K_1, J_1, L_1},
+ {0, H_14, G_14, I_14},
+ {0, H_13, G_13, I_13},
+ {0, H_12, G_12, I_12},
+ {0, H_11, G_11, I_11},
+ {0, H_10, G_10, I_10},
+ {0, H_9, G_9, I_9},
+ {0, H_8, G_8, I_8},
+ {0, H_7, G_7, I_7},
+ {0, H_6, G_6, I_6},
+ {0, H_5, G_5, I_5},
+ {0, H_4, G_4, I_4},
+ {0, H_3, G_3, I_3},
+ {0, H_2, G_2, I_2},
+ {0, H_1, G_1, I_1},
+ {0, E_14, D_14, F_14},
+ {0, E_12, D_12, F_12},
+ {0, E_11, D_11, F_11},
+ {0, E_10, D_10, F_10},
+ {0, E_9, D_9, F_9},
+ {0, E_8, D_8, F_8},
+ {0, E_7, D_7, F_7},
+ {0, E_6, D_6, F_6},
+ {0, E_5, D_5, F_5},
+ {0, E_4, D_4, F_4},
+ {0, E_3, D_3, F_3},
+ {0, E_2, D_2, F_2},
+ {0, E_1, D_1, F_1},
+ {0, B_13, A_13, C_13},
+ {0, B_11, A_11, C_11},
+ {0, B_10, A_10, C_10},
+ {0, B_9, A_9, C_9},
+ {0, B_8, A_8, C_8},
+ {0, B_7, A_7, C_7},
+ {0, B_6, A_6, C_6},
+ {0, B_5, A_5, C_5},
+ {0, B_4, A_4, C_4},
+ {0, B_3, A_3, C_3},
+ {0, B_2, A_2, C_2},
+ {0, B_1, A_1, C_1},
+ {0, B_15, A_15, C_15},
+ {0, E_13, D_13, F_13},
+ {0, B_12, A_12, C_12},
+ {0, E_15, D_15, F_15},
+ {0, B_16, A_16, C_16},
+ {0, E_16, D_16, F_16},
+ {0, H_16, G_16, I_16},
+ {0, K_16, J_16, L_16},
+};
+
+led_config_t g_led_config = { {
+ { 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 },
+ { 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14 },
+ { 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, NO_LED, 28 },
+ { 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, NO_LED, NO_LED },
+ { 60, 59, 58, NO_LED, NO_LED, 57, NO_LED, NO_LED, NO_LED, 56, 55, 54, NO_LED, 53 }
+}, {
+ { 216, 0 }, { 192, 0 }, { 176, 0 }, { 160, 0 }, { 144, 0 }, { 128, 0 }, { 112, 0 }, { 96, 0 }, { 80, 0 }, { 64, 0 }, { 48, 0 }, { 32, 0 }, { 16, 0 }, { 0, 0 },
+ { 220, 16 }, { 200, 16 }, { 184, 16 }, { 168, 16 }, { 152, 16 }, { 136, 16 }, { 120, 16 }, { 104, 16 }, { 88, 16 }, { 72, 16 }, { 56, 16 }, { 40, 16 }, { 24, 16 }, { 4, 16 },
+ { 214, 24 }, { 188, 32 }, { 172, 32 }, { 156, 32 }, { 140, 32 }, { 124, 32 }, { 108, 32 }, { 92, 32 }, { 76, 32 }, { 60, 32 }, { 44, 32 }, { 28, 32 }, { 6, 32 }, { 210, 48 },
+ { 180, 48 }, { 164, 48 }, { 148, 48 }, { 132, 48 }, { 116, 48 }, { 100, 48 }, { 84, 48 }, { 68, 48 }, { 52, 48 }, { 20, 48 }, { 10, 48 }, { 222, 64 }, { 202, 64 }, { 182, 64 },
+ { 162, 64 }, { 102, 64 }, { 42, 64 }, { 22, 64 }, { 2, 64 }
+}, {
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
+ 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1,
+ 1, 4, 1, 1, 1
+} };
+
+#else
+const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
+ {0, K_14, J_14, L_14},
+ {0, K_13, J_13, L_13},
+ {0, K_12, J_12, L_12},
+ {0, K_11, J_11, L_11},
+ {0, K_10, J_10, L_10},
+ {0, K_9, J_9, L_9},
+ {0, K_8, J_8, L_8},
+ {0, K_7, J_7, L_7},
+ {0, K_6, J_6, L_6},
+ {0, K_5, J_5, L_5},
+ {0, K_4, J_4, L_4},
+ {0, K_3, J_3, L_3},
+ {0, K_2, J_2, L_2},
+ {0, K_1, J_1, L_1},
+ {0, H_14, G_14, I_14},
+ {0, H_13, G_13, I_13},
+ {0, H_12, G_12, I_12},
+ {0, H_11, G_11, I_11},
+ {0, H_10, G_10, I_10},
+ {0, H_9, G_9, I_9},
+ {0, H_8, G_8, I_8},
+ {0, H_7, G_7, I_7},
+ {0, H_6, G_6, I_6},
+ {0, H_5, G_5, I_5},
+ {0, H_4, G_4, I_4},
+ {0, H_3, G_3, I_3},
+ {0, H_2, G_2, I_2},
+ {0, H_1, G_1, I_1},
+ {0, E_14, D_14, F_14},
+ {0, E_12, D_12, F_12},
+ {0, E_11, D_11, F_11},
+ {0, E_10, D_10, F_10},
+ {0, E_9, D_9, F_9},
+ {0, E_8, D_8, F_8},
+ {0, E_7, D_7, F_7},
+ {0, E_6, D_6, F_6},
+ {0, E_5, D_5, F_5},
+ {0, E_4, D_4, F_4},
+ {0, E_3, D_3, F_3},
+ {0, E_2, D_2, F_2},
+ {0, E_1, D_1, F_1},
+ {0, B_14, A_14, C_14},
+ {0, B_13, A_13, C_13},
+ {0, B_11, A_11, C_11},
+ {0, B_10, A_10, C_10},
+ {0, B_9, A_9, C_9},
+ {0, B_8, A_8, C_8},
+ {0, B_7, A_7, C_7},
+ {0, B_6, A_6, C_6},
+ {0, B_5, A_5, C_5},
+ {0, B_4, A_4, C_4},
+ {0, B_3, A_3, C_3},
+ {0, B_2, A_2, C_2},
+ {0, B_1, A_1, C_1},
+ {0, B_15, A_15, C_15},
+ {0, E_13, D_13, F_13},
+ {0, B_12, A_12, C_12},
+ {0, E_15, D_15, F_15},
+ {0, H_15, G_15, I_15},
+ {0, B_16, A_16, C_16},
+ {0, E_16, D_16, F_16},
+ {0, H_16, G_16, I_16},
+ {0, K_16, J_16, L_16},
+};
+
+led_config_t g_led_config = { {
+ { 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 },
+ { 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14 },
+ { 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, NO_LED, 28 },
+ { 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, NO_LED, 41 },
+ { 62, 61, 60, NO_LED, NO_LED, 59, NO_LED, NO_LED, 58, 57, 56, 55, NO_LED, 54 }
+}, {
+ { 216, 0 }, { 192, 0 }, { 176, 0 }, { 160, 0 }, { 144, 0 }, { 128, 0 }, { 112, 0 }, { 96, 0 }, { 80, 0 }, { 64, 0 }, { 48, 0 }, { 32, 0 }, { 16, 0 }, { 0, 0 },
+ { 220, 16 }, { 200, 16 }, { 184, 16 }, { 168, 16 }, { 152, 16 }, { 136, 16 }, { 120, 16 }, { 104, 16 }, { 88, 16 }, { 72, 16 }, { 56, 16 }, { 40, 16 }, { 24, 16 }, { 4, 16 },
+ { 214, 32 }, { 188, 32 }, { 172, 32 }, { 156, 32 }, { 140, 32 }, { 124, 32 }, { 108, 32 }, { 92, 32 }, { 76, 32 }, { 60, 32 }, { 44, 32 }, { 28, 32 }, { 6, 32 }, { 224, 48 },
+ { 208, 48 }, { 186, 48 }, { 164, 48 }, { 148, 48 }, { 132, 48 }, { 116, 48 }, { 100, 48 }, { 84, 48 }, { 68, 48 }, { 52, 48 }, { 36, 48 }, { 9, 48 }, { 224, 64 }, { 208, 64 },
+ { 192, 64 }, { 176, 64 }, { 160, 64 }, { 102, 64 }, { 42, 64 }, { 22, 64 }, { 2, 64 }
+}, {
+ 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
+ 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1,
+ 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1,
+ 1, 1, 1, 4, 1, 1, 1
+} };
+
+
+#endif
diff --git a/users/tominabox1/doug.c b/users/tominabox1/doug.c
new file mode 100644
index 0000000000..d1f92ecf30
--- /dev/null
+++ b/users/tominabox1/doug.c
@@ -0,0 +1,243 @@
+// This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0.
+// See gfxfont.h for newer custom bitmap font info.
+
+#ifndef FONT5X7_H
+#define FONT5X7_H
+
+#ifdef __AVR__
+ #include <avr/io.h>
+ #include <avr/pgmspace.h>
+#elif defined(ESP8266)
+ #include <pgmspace.h>
+#else
+ #define PROGMEM
+#endif
+
+// Standard ASCII 5x7 font
+const unsigned char font[] PROGMEM = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00,
+0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00,
+0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00,
+0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00,
+0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00,
+0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00,
+0x00, 0x18, 0x3C, 0x18, 0x00, 0x00,
+0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00,
+0x00, 0x18, 0x24, 0x18, 0x00, 0x00,
+0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00,
+0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00,
+0x26, 0x29, 0x79, 0x29, 0x26, 0x00,
+0x40, 0x7F, 0x05, 0x05, 0x07, 0x00,
+0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00,
+0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00,
+0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00,
+0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00,
+0x14, 0x22, 0x7F, 0x22, 0x14, 0x00,
+0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00,
+0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00,
+0x00, 0x66, 0x89, 0x95, 0x6A, 0x00,
+0x60, 0x60, 0x60, 0x60, 0x60, 0x00,
+0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00,
+0x08, 0x04, 0x7E, 0x04, 0x08, 0x00,
+0x10, 0x20, 0x7E, 0x20, 0x10, 0x00,
+0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00,
+0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00,
+0x1E, 0x10, 0x10, 0x10, 0x10, 0x00,
+0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00,
+0x30, 0x38, 0x3E, 0x38, 0x30, 0x00,
+0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x5F, 0x00, 0x00, 0x00,
+0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
+0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00,
+0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00,
+0x23, 0x13, 0x08, 0x64, 0x62, 0x00,
+0x36, 0x49, 0x56, 0x20, 0x50, 0x00,
+0x00, 0x08, 0x07, 0x03, 0x00, 0x00,
+0x00, 0x1C, 0x22, 0x41, 0x00, 0x00,
+0x00, 0x41, 0x22, 0x1C, 0x00, 0x00,
+0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00,
+0x08, 0x08, 0x3E, 0x08, 0x08, 0x00,
+0x00, 0x80, 0x70, 0x30, 0x00, 0x00,
+0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
+0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
+0x20, 0x10, 0x08, 0x04, 0x02, 0x00,
+0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00,
+0x00, 0x42, 0x7F, 0x40, 0x00, 0x00,
+0x72, 0x49, 0x49, 0x49, 0x46, 0x00,
+0x21, 0x41, 0x49, 0x4D, 0x33, 0x00,
+0x18, 0x14, 0x12, 0x7F, 0x10, 0x00,
+0x27, 0x45, 0x45, 0x45, 0x39, 0x00,
+0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00,
+0x41, 0x21, 0x11, 0x09, 0x07, 0x00,
+0x36, 0x49, 0x49, 0x49, 0x36, 0x00,
+0x46, 0x49, 0x49, 0x29, 0x1E, 0x00,
+0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
+0x00, 0x40, 0x34, 0x00, 0x00, 0x00,
+0x00, 0x08, 0x14, 0x22, 0x41, 0x00,
+0x14, 0x14, 0x14, 0x14, 0x14, 0x00,
+0x00, 0x41, 0x22, 0x14, 0x08, 0x00,
+0x02, 0x01, 0x59, 0x09, 0x06, 0x00,
+0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00,
+0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00,
+0x7F, 0x49, 0x49, 0x49, 0x36, 0x00,
+0x3E, 0x41, 0x41, 0x41, 0x22, 0x00,
+0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00,
+0x7F, 0x49, 0x49, 0x49, 0x41, 0x00,
+0x7F, 0x09, 0x09, 0x09, 0x01, 0x00,
+0x3E, 0x41, 0x41, 0x51, 0x73, 0x00,
+0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00,
+0x00, 0x41, 0x7F, 0x41, 0x00, 0x00,
+0x20, 0x40, 0x41, 0x3F, 0x01, 0x00,
+0x7F, 0x08, 0x14, 0x22, 0x41, 0x00,
+0x7F, 0x40, 0x40, 0x40, 0x40, 0x00,
+0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00,
+0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00,
+0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00,
+0x7F, 0x09, 0x09, 0x09, 0x06, 0x00,
+0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00,
+0x7F, 0x09, 0x19, 0x29, 0x46, 0x00,
+0x26, 0x49, 0x49, 0x49, 0x32, 0x00,
+0x03, 0x01, 0x7F, 0x01, 0x03, 0x00,
+0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00,
+0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00,
+0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00,
+0x63, 0x14, 0x08, 0x14, 0x63, 0x00,
+0x03, 0x04, 0x78, 0x04, 0x03, 0x00,
+0x61, 0x59, 0x49, 0x4D, 0x43, 0x00,
+0x00, 0x7F, 0x41, 0x41, 0x41, 0x00,
+0x02, 0x04, 0x08, 0x10, 0x20, 0x00,
+0x00, 0x41, 0x41, 0x41, 0x7F, 0x00,
+0x04, 0x02, 0x01, 0x02, 0x04, 0x00,
+0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
+0x00, 0x03, 0x07, 0x08, 0x00, 0x00,
+0x20, 0x54, 0x54, 0x78, 0x40, 0x00,
+0x7F, 0x28, 0x44, 0x44, 0x38, 0x00,
+0x38, 0x44, 0x44, 0x44, 0x28, 0x00,
+0x38, 0x44, 0x44, 0x28, 0x7F, 0x00,
+0x38, 0x54, 0x54, 0x54, 0x18, 0x00,
+0x00, 0x08, 0x7E, 0x09, 0x02, 0x00,
+0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00,
+0x7F, 0x08, 0x04, 0x04, 0x78, 0x00,
+0x00, 0x44, 0x7D, 0x40, 0x00, 0x00,
+0x20, 0x40, 0x40, 0x3D, 0x00, 0x00,
+0x7F, 0x10, 0x28, 0x44, 0x00, 0x00,
+0x00, 0x41, 0x7F, 0x40, 0x00, 0x00,
+0x7C, 0x04, 0x78, 0x04, 0x78, 0x00,
+0x7C, 0x08, 0x04, 0x04, 0x78, 0x00,
+0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
+0xFC, 0x18, 0x24, 0x24, 0x18, 0x00,
+0x18, 0x24, 0x24, 0x18, 0xFC, 0x00,
+0x7C, 0x08, 0x04, 0x04, 0x08, 0x00,
+0x48, 0x54, 0x54, 0x54, 0x24, 0x00,
+0x04, 0x04, 0x3F, 0x44, 0x24, 0x00,
+0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00,
+0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00,
+0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00,
+0x44, 0x28, 0x10, 0x28, 0x44, 0x00,
+0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00,
+0x44, 0x64, 0x54, 0x4C, 0x44, 0x00,
+0x00, 0x08, 0x36, 0x41, 0x00, 0x00,
+0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
+0x00, 0x41, 0x36, 0x08, 0x00, 0x00,
+0x02, 0x01, 0x02, 0x04, 0x02, 0x00,
+0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00,
+0x00, 0x2C, 0x2C, 0x2C, 0x34, 0x34,
+0x34, 0x24, 0x2C, 0x2C, 0x2C, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x18, 0x14,
+0x14, 0x3C, 0x20, 0x00, 0x00, 0x04,
+0x0C, 0x00, 0x00, 0x20, 0x00, 0xC0,
+0x00, 0x00, 0x00, 0xA0, 0x20, 0x30,
+0x7C, 0x78, 0x0C, 0x0C, 0x18, 0x18,
+0x18, 0x14, 0x14, 0x14, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x80, 0x5C, 0x5C, 0x24, 0x20,
+0xA0, 0xA0, 0xA0, 0x20, 0x60, 0x20,
+0xBC, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x14, 0x94, 0x94,
+0x14, 0x94, 0x94, 0x94, 0x94, 0x14,
+0x1C, 0x1C, 0x1C, 0x88, 0x08, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x18, 0x08,
+0x84, 0x84, 0x84, 0x84, 0x80, 0x98,
+0x80, 0x9C, 0x9C, 0x90, 0x80, 0x00,
+0x10, 0x1C, 0x1C, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x10, 0x10, 0x00,
+0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC,
+0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00,
+0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E,
+0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00,
+0x00, 0x80, 0xC0, 0xE0, 0x7E, 0x5B,
+0x4F, 0x5B, 0xFE, 0xC0, 0x00, 0x00,
+0xC0, 0x00, 0xDC, 0xD7, 0xDE, 0xDE,
+0xDE, 0xD7, 0xDC, 0x00, 0xC0, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x80, 0x80, 0x40, 0x00, 0x80, 0x80,
+0x00, 0x00, 0x00, 0x00, 0x80, 0x80,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x50, 0xA0, 0x40, 0x80, 0x80, 0x40,
+0xA0, 0x50, 0x00, 0x00, 0xF0, 0x00,
+0x01, 0x08, 0x08, 0x88, 0x08, 0x08,
+0x00, 0x00, 0x00, 0x00, 0x0A, 0x0C,
+0x0E, 0x0A, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x02, 0x82, 0x80, 0x80,
+0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+0x00, 0xC0, 0x00, 0x00, 0x00, 0x01,
+0x00, 0x00, 0x00, 0x40, 0x00, 0x40,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x03, 0x00,
+0x01, 0x01, 0x01, 0x60, 0x60, 0x40,
+0xF1, 0xB3, 0x03, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x90, 0x90, 0xD0, 0xC0,
+0xE0, 0xE0, 0x00, 0x00, 0x00, 0x01,
+0x00, 0x90, 0xA0, 0xA0, 0x63, 0x60,
+0x40, 0x40, 0xC0, 0x00, 0x00, 0x00,
+0x00, 0x02, 0x02, 0x02, 0x03, 0x00,
+0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F,
+0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00,
+0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F,
+0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00,
+0x30, 0x7B, 0x7F, 0x78, 0x30, 0x20,
+0x20, 0x30, 0x78, 0x7F, 0x3B, 0x00,
+0x03, 0x00, 0x0F, 0x7F, 0x0F, 0x0F,
+0x0F, 0x7F, 0x0F, 0x00, 0x03, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x07, 0x06, 0x00, 0x70, 0x10, 0x10,
+0x31, 0x11, 0x16, 0x06, 0x07, 0x01,
+0x00, 0x08, 0x08, 0x08, 0x70, 0x70,
+0x40, 0x40, 0x41, 0x46, 0x46, 0x41,
+0x40, 0x40, 0x00, 0x00, 0x07, 0x00,
+0x00, 0x00, 0x00, 0x75, 0x75, 0x15,
+0x77, 0x77, 0x35, 0x15, 0x75, 0x75,
+0x75, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x70, 0x70, 0x56, 0x56, 0x56,
+0x51, 0x11, 0x26, 0x00, 0x00, 0x00,
+0x00, 0x17, 0x10, 0x10, 0x70, 0x00,
+0x00, 0x00, 0x30, 0x20, 0x27, 0x77,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0xE0, 0xE0, 0xA0, 0xA0, 0xA0, 0xA0,
+0xA0, 0xA0, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x90, 0x90, 0x90, 0x90,
+0x90, 0xF0, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x20, 0x40,
+0xF0, 0x30, 0x10, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+#endif // FONT5X7_H
diff --git a/users/tominabox1/readme.md b/users/tominabox1/readme.md
new file mode 100644
index 0000000000..99a3542bc3
--- /dev/null
+++ b/users/tominabox1/readme.md
@@ -0,0 +1,5 @@
+# Overview
+
+My user-space code covers the [Minivan](../../keyboards/thevankeyboards/minivan/keymaps/tominabox1/keymap.c), [Dimple](../../keyboards/lazydesigners/dimple/keymaps/tominabox1/keymap.c), [CRKBD](../../keyboards/crkbd/keymaps/tominabox1/keymap.c), and [Teensy based HHKB converter](../../keyboards/hhkb/keymaps/tominabox1/). My code makes extensive use of @Drashna's code and much love and praise goes to him for figuring a lot of this stuff out!
+
+My usercode utilizes the layout wrappers contained in [wrappers.h](wrappers.h). All of the keymaps are derivative of the Dimple keymap and utilize its wrappers in the definition of additional wrappers.
diff --git a/users/tominabox1/rules.mk b/users/tominabox1/rules.mk
new file mode 100644
index 0000000000..b70b128cf3
--- /dev/null
+++ b/users/tominabox1/rules.mk
@@ -0,0 +1,26 @@
+# Build Options
+# change to "no" to disable the options, or define them in the Makefile in
+# the appropriate keymap folder that will get included automatically
+#
+CONSOLE_ENABLE = no
+TAP_DANCE_ENABLE = yes
+NKRO_ENABLE = yes
+BOOTMAGIC_ENABLE = full # Virtual DIP switch configuration
+
+ifeq ($(strip $(KEYBOARD)), crkbd/rev1)
+RGB_MATRIX_ENABLE = WS2812
+EXTRAFLAGS += -flto
+BOOTLOADER = qmk-dfu
+OLED_DRIVER_ENABLE = yes
+endif
+
+ifeq ($(strip $(KEYBOARD)), lazydesigners/dimple)
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+# RGB_MATRIX_ENABLE = WS2812
+endif
+
+
+SRC += tominabox1.c
diff --git a/users/tominabox1/tominabox1.c b/users/tominabox1/tominabox1.c
new file mode 100644
index 0000000000..95e6ee7803
--- /dev/null
+++ b/users/tominabox1/tominabox1.c
@@ -0,0 +1,281 @@
+#include "tominabox1.h"
+
+#ifdef KEYBOARD_lazydesigners_dimple
+#ifdef RGBLIGHT_ENABLE
+__attribute__ ((weak))
+void keyboard_post_init_keymap(void) {}
+
+void keyboard_post_init_user(void) { // sets the backlighting to come on upon successful load then turn off
+ rgblight_enable_noeeprom();
+ rgblight_sethsv_noeeprom(RGB_RED);
+ rgblight_mode_noeeprom(0);
+ wait_ms(700);
+ rgblight_disable_noeeprom();
+}
+#endif // RGBLIGHT
+#endif // Dimple
+
+
+#ifdef RGB_MATRIX_ENABLE
+void rgb_matrix_layer_helper(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode, uint8_t speed, uint8_t led_type);
+static bool is_suspended;
+static bool rgb_matrix_enabled;
+
+__attribute__ ((weak))
+void suspend_power_down_keymap(void) {}
+
+void suspend_power_down_user(void) {
+ rgb_matrix_set_suspend_state(true);
+ if (!is_suspended) {
+ is_suspended = true;
+ rgb_matrix_enabled = (bool)rgb_matrix_config.enable;
+ rgb_matrix_disable_noeeprom();
+ }
+}
+
+__attribute__ ((weak))
+void suspend_wakeup_init_keymap(void) {}
+
+void suspend_wakeup_init_user(void) {
+ rgb_matrix_set_suspend_state(false);
+ is_suspended = false;
+ if (rgb_matrix_enabled) {
+ rgb_matrix_enable_noeeprom();
+ }
+}
+
+# include "lib/lib8tion/lib8tion.h"
+extern led_config_t g_led_config;
+void rgb_matrix_layer_helper(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode, uint8_t speed, uint8_t led_type) {
+ HSV hsv = {hue, sat, val};
+ if (hsv.v > rgb_matrix_config.hsv.v) {
+ hsv.v = rgb_matrix_config.hsv.v;
+ }
+
+ switch (mode) {
+ case 1: // breathing
+ {
+ uint16_t time = scale16by8(g_rgb_counters.tick, speed / 8);
+ hsv.v = scale8(abs8(sin8(time) - 128) * 2, hsv.v);
+ RGB rgb = hsv_to_rgb(hsv);
+ for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) {
+ if (HAS_FLAGS(g_led_config.flags[i], led_type)) {
+ rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
+ }
+ }
+ break;
+ }
+ default: // Solid Color
+ {
+ RGB rgb = hsv_to_rgb(hsv);
+ for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) {
+ if (HAS_FLAGS(g_led_config.flags[i], led_type)) {
+ rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
+ }
+ }
+ break;
+ }
+ }
+}
+#endif //RGB_MATRIX_ENABLE
+
+void dance_cln_finished (qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count == 1) {
+ register_code16(S(KC_2));
+ } else {
+ SEND_STRING("tom.campie@gmail.com");
+ }
+}
+
+void dance_cln_reset (qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count == 1) {
+ unregister_code16(S(KC_2));
+ } else {
+ }
+}
+
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [KC_EMAIL] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_cln_finished, dance_cln_reset),
+ [TD_SFT_CPS] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPS),
+};
+
+#define TAPPING_TERM 200
+#define IGNORE_MOD_TAP_INTERRUPT
+
+#ifdef KEYBOARD_crkbd_rev1
+
+#endif // CRKBD
+
+uint16_t get_tapping_term(uint16_t keycode) {
+ switch (keycode) {
+ case LSFT_T(KC_CAPS):
+ return 250;
+ case KC_ENT_LOW:
+ return 150;
+ case KC_SPC_RSE:
+ return(250);
+ case LCTL_T(KC_TAB):
+ return 300;
+ default:
+ return TAPPING_TERM;
+ }
+};
+
+__attribute__ ((weak))
+layer_state_t layer_state_set_keymap (layer_state_t state) {
+ return state;
+}
+
+uint32_t layer_state_set_user(uint32_t state) {
+ state = update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
+ switch (biton32(state)) {
+ case _LOWER:
+ break;
+ case _RAISE:
+ break;
+ case _ADJUST:
+ break;
+ default:
+ break;
+ }
+ return state;
+}
+
+#ifdef KEYBOARD_crkbd_rev1
+
+__attribute__((weak))
+void matrix_scan_keymap(void) {}
+
+extern bool oled_initialized;
+void matrix_scan_user(void) {
+ if(!oled_initialized) {
+ wait_ms(200);
+ oled_init(0);
+ return;
+ }
+ matrix_scan_keymap();
+ }
+
+extern uint8_t is_master;
+#endif // CRKBD
+
+uint16_t oled_timer;
+
+__attribute__ ((weak))
+bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
+ return true;
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ #ifdef CONSOLE_ENABLE
+ uprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed);
+ #endif
+
+ if (record->event.pressed) {
+ #ifdef OLED_DRIVER_ENABLE
+ oled_timer = timer_read();
+ oled_on();
+ #endif // OLED_DRIVER_ENABLE
+ switch (keycode) {
+ case KC_BBB:
+ if (record->event.pressed) {
+ SEND_STRING(":b:");
+ } else {}
+ break;
+ case KC_BEPIS:
+ if (record->event.pressed) {
+ SEND_STRING("BEPIS");
+ } else {}
+ break;
+ }
+ }
+ return true;
+
+}
+#ifdef KEYBOARD_crkbd_rev1
+#ifdef OLED_DRIVER_ENABLE
+void render_logo(void) {
+ static const char PROGMEM logo[] = {
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94,
+ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4,
+ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4,
+ 0};
+ oled_write_P(logo, false);
+}
+
+void render_status_main(void) {
+ // Host Keyboard USB Status
+ oled_write_P(PSTR("USB: "), false);
+ switch (USB_DeviceState) {
+ case DEVICE_STATE_Unattached:
+ oled_write_P(PSTR("Unattached\n"), false);
+ break;
+ case DEVICE_STATE_Suspended:
+ oled_write_P(PSTR("Suspended\n"), false);
+ break;
+ case DEVICE_STATE_Configured:
+ oled_write_P(PSTR("Connected\n"), false);
+ break;
+ case DEVICE_STATE_Powered:
+ oled_write_P(PSTR("Powered\n"), false);
+ break;
+ case DEVICE_STATE_Default:
+ oled_write_P(PSTR("Default\n"), false);
+ break;
+ case DEVICE_STATE_Addressed:
+ oled_write_P(PSTR("Addressed\n"), false);
+ break;
+ default:
+ oled_write_P(PSTR("Invalid\n"), false);
+ }
+
+ // Host Keyboard Layer Status
+ oled_write_P(PSTR("Layer: "), false);
+ switch (biton32(layer_state)) {
+ case _BASE:
+ oled_write_P(PSTR("Colemak\n"), false);
+ break;
+ case _RAISE:
+ oled_write_P(PSTR("Numbers\n"), false);
+ break;
+ case _LOWER:
+ oled_write_P(PSTR("Symbols\n"), false);
+ break;
+ case _ADJUST:
+ oled_write_P(PSTR("Adjust\n"), false);
+ break;
+ case _ARROW:
+ oled_write_P(PSTR("Navigation\n"), false);
+ break;
+ case _FKEY:
+ oled_write_P(PSTR("Function\n"), false);
+ break;
+ default:
+ // Or use the write_ln shortcut over adding '\n' to the end of your string
+ oled_write_ln_P(PSTR("Undefined"), false);
+ }
+
+ // Host Keyboard LED Status
+
+ oled_write_ln_P(IS_HOST_LED_ON(USB_LED_CAPS_LOCK) ? PSTR("Caps Lock\n") : PSTR(" \n"), false);
+}
+__attribute__ ((weak))
+void oled_task_keymap(void) {}
+
+void oled_task_user(void) {
+
+ if (timer_elapsed(oled_timer) > 20000) {
+ oled_off();
+ return;
+ }
+ if (is_master) {
+ render_status_main(); // Renders the current keyboard state (layer, lock, caps, scroll, etc)
+ } else {
+ render_logo();
+ oled_scroll_left();
+ }
+ oled_task_keymap();
+ }
+
+#endif // OLED_Driver
+#endif // crkbd
diff --git a/users/tominabox1/tominabox1.h b/users/tominabox1/tominabox1.h
new file mode 100644
index 0000000000..00f8e65162
--- /dev/null
+++ b/users/tominabox1/tominabox1.h
@@ -0,0 +1,56 @@
+#pragma once
+#include "quantum.h"
+#include "action.h"
+#include "version.h"
+#include "wrappers.h"
+
+// #define KC_SFT_CPS MT(MOD_LSFT, KC_CAPS) // Act as Shift on hold and as CapsLock on tap
+#define SPC_LOW LT(_LOWER, KC_ENT) // Left space on tap, LOWER on hold
+#define SPC_UPR LT(_RAISE, KC_SPC) // Left space on tap, UPPER on hold
+
+extern keymap_config_t keymap_config;
+
+enum layers {
+ _BASE,
+ _LOWER,
+ _RAISE,
+ _ADJUST,
+ _ARROW,
+ _FKEY
+};
+
+enum custom_keycodes {
+ BASE = SAFE_RANGE,
+ KC_BEPIS,
+ KC_BBB,
+ LOWER,
+ RAISE,
+ ADJUST,
+ ARROW,
+ FKEY,
+ KC_LFT_NUM_F,
+ RGBRST,
+ KC_PASTA
+};
+
+enum tap_dance_indexes {
+ KC_EMAIL,
+ TD_SFT_CPS,
+};
+
+#define KC_ARROW MO(4)
+#define KC_LTOG RGB_TOG
+#define KC_LHUI RGB_HUI
+#define KC_LHUD RGB_HUD
+#define KC_LSAI RGB_SAI
+#define KC_LSAD RGB_SAD
+#define KC_LVAI RGB_VAI
+#define KC_LVAD RGB_VAD
+#define KC_LMOD RGB_MOD
+#define KC_CTLTB CTL_T(KC_TAB) // Tab on tap, ctrl on hold
+#define KC_SFT_CPS TD(TD_SFT_CPS) // Hold for shift, double tap for caps
+#define KC_ENT_LOW LT(_LOWER, KC_ENT) // Return on tap, Lower on hold
+#define KC_SPC_RSE LT(_RAISE, KC_SPC) // Space on tap, raise on hold
+#define KC_EML TD(KC_EMAIL) // Double tap @ for email macro
+#define KC_FKEY LT(_FKEY, KC_ENT) // Return on tap, Fkey on hold
+#define KC_NUMF TD(KC_LFT_NUM_F)
diff --git a/users/tominabox1/wrappers.h b/users/tominabox1/wrappers.h
new file mode 100644
index 0000000000..032fad273f
--- /dev/null
+++ b/users/tominabox1/wrappers.h
@@ -0,0 +1,142 @@
+#pragma once
+#include "tominabox1.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.
+*/
+#if (!defined(LAYOUT) && defined(KEYMAP))
+# define LAYOUT KEYMAP
+#endif
+
+// clang-format off
+#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
+#define LAYOUT_arrow_wrapper(...) LAYOUT_arrow(__VA_ARGS__)
+
+/*
+ _____ _ _
+ | __ \(_) | |
+ | | | |_ _ __ ___ _ __ | | ___
+ | | | | | '_ ` _ \| '_ \| |/ _ \
+ | |__| | | | | | | | |_) | | __/
+ |_____/|_|_| |_| |_| .__/|_|\___|
+ | |
+ |_|
+*/
+// Dimple Base layer
+#define __________________DIMPLE1__________________ KC_GESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC
+#define __________________DIMPLE2__________________ LCTL_T(KC_TAB), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT
+#define __________________DIMPLE3L_________________ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B
+#define __________________DIMPLE3R_________________ KC_K, KC_M, KC_COMM, KC_UP, LT(_FKEY,KC_DOT)
+#define __________________DIMPLE4__________________ KC_LCTL, KC_LGUI, KC_LALT, KC_ENT_LOW, KC_SPC_RSE, KC_LEFT, KC_DOWN, KC_RGHT
+
+// Dimple Symbol Layer
+#define _________________LOWER_1___________________ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC
+#define _________________LOWER_2___________________ KC_DEL, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE
+#define _________________LOWER_3___________________ KC_CAPS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PGUP, KC_QUES
+#define _________________LOWER_4___________________ LCA(KC_DEL), KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_END
+
+// Dimple Number layer
+#define ___________________RAISE1__________________ KC_TILD, KC_EXLM, TD(KC_EMAIL), KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL
+#define ___________________RAISE2__________________ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS
+#define ___________________RAISE3__________________ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_DOT, KC_SLSH
+#define ___________________RAISE4__________________ KC_VOLD, KC_MUTE, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO
+
+// Dimple F-key layer
+#define ___________________FKEY1___________________ KC_PASTA, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_NO
+#define ___________________FKEY2___________________ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_F11, KC_F12, KC_NO
+#define ___________________FKEY3___________________ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO
+#define ___________________FKEY4___________________ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_NO, KC_NO
+
+// Dimple Adjust layer
+#define ___________________ADJST1__________________ RESET,RGBRST, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO
+#define ___________________ADJST2__________________ RGB_M_P, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO
+#define ___________________ADJST3__________________ RGB_MOD, RGB_HUI, RGB_HUD, RGB_M_SN, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO
+#define ___________________ADJST4__________________ RGB_VAD, RGB_TOG, RGB_VAI, KC_NO, KC_NO, KC_TRNS, KC_NO, KC_NO
+
+/*
+__ __ _ _
+| \/ (_) (_)
+| \ / |_ _ __ ___ ____ _ _ __
+| |\/| | | '_ \| \ \ / / _` | '_ \
+| | | | | | | | |\ V / (_| | | | |
+|_| |_|_|_| |_|_| \_/ \__,_|_| |_|
+*/
+
+
+// Minivan Base Layer
+#define __________________MINIVAN1_________________ __________________DIMPLE1__________________
+#define __________________MINIVAN2_________________ __________________DIMPLE2__________________
+#define __________________MINIVAN3_________________ __________________DIMPLE3L_________________, __________________DIMPLE3R_________________, KC_RSFT
+#define __________________MINIVAN4_________________ KC_LCTL, KC_LGUI, KC_LALT, KC_ENT_LOW, KC_SPC_RSE, KC_LEFT, KC_DOWN, KC_RGHT, MO(_FKEY)
+
+/* Minivan Symbol Layer
+#define _________________LOWER_1___________________
+#define _________________LOWER_2___________________ */
+#define __________________MININUM3_________________ _________________LOWER_3___________________, KC_SLSH
+#define __________________MININUM4_________________ _________________LOWER_4___________________, KC_END
+
+/* Minvian Number Layer
+#define ___________________RAISE1__________________
+#define ___________________RAISE2__________________ */
+#define ___________________RVAN_3__________________ ___________________RAISE3__________________, KC_NO
+#define ___________________RVAN_4__________________ ___________________RAISE4__________________, KC_NO
+
+/* Minvian F-key layer
+#define ___________________FKEY1___________________
+#define ___________________FKEY2___________________ */
+#define ___________________FVAN_3__________________ ___________________FKEY3___________________, KC_NO
+#define ___________________FVAN_4__________________ ___________________FKEY4___________________, KC_TRNS
+
+/* Minivan Adjust Layer
+#define ___________________ADJST1__________________
+#define ___________________ADJST2__________________ */
+#define ___________________ADJVAN3_________________ ___________________ADJST3__________________, KC_NO
+#define ___________________ADJVAN4_________________ ___________________ADJST4__________________, KC_TRNS
+
+/*
+ _____ _____ _ ______ _____
+ / ____| __ \| |/ / _ \| __ \
+| | | |__) | ' /| |_) | | | |
+| | | _ /| < | _ <| | | |
+| |____| | \ \| . \| |_) | |__| |
+ \_____|_| \_\_|\_\____/|_____/
+*/
+
+// CRKBD Base Layer
+#define ___________________CRKBD1__________________ __________________DIMPLE1__________________
+#define ___________________CRKBD2__________________ __________________DIMPLE2__________________
+#define ___________________CRKBD3__________________ __________________DIMPLE3L_________________, KC_K, KC_M,KC_COMM, KC_DOT, KC_SLSH, KC_BBB
+#define ___________________CRKBD4__________________ KC_LGUI, KC_LALT,KC_ENT_LOW, KC_SPC_RSE, KC_ARROW, KC_FKEY
+
+/* CRKBD Number layer
+#define ___________________RAISE1__________________
+#define ___________________RAISE1__________________ */
+#define ___________________CRKBD_RAISE3____________ ___________________RVAN_3__________________
+#define ___________________CRKBD_RAISE4____________ ___________________CRKBD4__________________
+
+/* CRKBD Symbol Layer
+#define _________________LOWER_1___________________
+#define _________________LOWER_2___________________ */
+#define ___________________CRKBD_LOW3______________ __________________MININUM3_________________
+#define ___________________CRKBD_LOW4______________ ___________________CRKBD4__________________
+
+/* CRKBD F-key layer
+#define ___________________FKEY1___________________
+#define ___________________FKEY2___________________ */
+#define ___________________CRKBD_FKEY3_____________ ___________________FVAN_3__________________
+#define ___________________CRKBD_FKEY4_____________ ___________________CRKBD4__________________
+
+/* CRKBD adjust layer
+#define ___________________ADJST1__________________ */
+#define ___________________CRKBD_ADJST2____________ KC_LTOG,KC_LHUI,KC_LSAI,KC_LVAI,KC_NO,KC_NO,KC_NO,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO
+#define ___________________CRKBD_ADJST3____________ KC_LMOD, KC_LHUD, KC_LSAD, KC_LVAD, KC_NO, KC_NO,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO
+#define ___________________CRKBD_ADJST4____________ ___________________CRKBD4__________________
+
+// CRKBD arrow layer
+#define ___________________ARROW1__________________ KC_NO, KC_NO, KC_UP, KC_NO, KC_NO, KC_NO, KC_NO, KC_PGDN, KC_UP, KC_PGUP, KC_NO, KC_NO
+#define ___________________ARROW2__________________ KC_NO, KC_LEFT, KC_DOWN, KC_RIGHT, KC_NO, KC_NO,KC_NO, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO
+#define ___________________ARROW3__________________ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO
+#define ___________________ARROW4__________________ ___________________CRKBD4__________________
+
+// clang-format on
diff --git a/users/xulkal/config.h b/users/xulkal/config.h
index c794530d45..4b05ea4ec4 100644
--- a/users/xulkal/config.h
+++ b/users/xulkal/config.h
@@ -28,3 +28,7 @@
#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
#define DISABLE_RGB_MATRIX_SPLASH
#define DISABLE_RGB_MATRIX_SOLID_SPLASH
+
+// 20m timeout (20m * 60s * 1000mil)
+#define RGB_DISABLE_TIMEOUT 1200000
+#define OLED_SCROLL_TIMEOUT 20000
diff --git a/users/xulkal/custom_encoder.c b/users/xulkal/custom_encoder.c
index 09f1cda0d1..cd029944ff 100644
--- a/users/xulkal/custom_encoder.c
+++ b/users/xulkal/custom_encoder.c
@@ -1,13 +1,72 @@
#include "custom_encoder.h"
+#include "custom_keycodes.h"
+
+#ifdef RGB_OLED_MENU
+#include "custom_rgb.h"
+
+// I'm lazy and like constants over calculations, also using it as a compile time check
+#if defined(RGB_MATRIX_ENABLE)
+ #define RGB_FUNCTION_COUNT 6
+#elif defined(RGBLIGHT_ENABLE)
+ #define RGB_FUNCTION_COUNT 5
+#endif
+
+typedef void (*rgb_f)(void);
+
+const rgb_f rgb_functions[RGB_FUNCTION_COUNT][2] = {
+#if defined(RGB_MATRIX_ENABLE)
+ { rgb_matrix_increase_hue, rgb_matrix_decrease_hue },
+ { rgb_matrix_increase_sat, rgb_matrix_decrease_sat },
+ { rgb_matrix_increase_val, rgb_matrix_decrease_val },
+ { rgb_matrix_increase_speed, rgb_matrix_decrease_speed },
+ { rgb_matrix_step, rgb_matrix_step_reverse },
+ { rgb_matrix_increase_flags, rgb_matrix_decrease_flags }
+#elif defined(RGBLIGHT_ENABLE)
+ { rgblight_increase_hue, rgblight_decrease_hue },
+ { rgblight_increase_sat, rgblight_decrease_sat },
+ { rgblight_increase_val, rgblight_decrease_val },
+ { rgblight_increase_speed, rgblight_decrease_speed },
+ { rgblight_step, rgblight_step_reverse }
+#endif
+};
+
+// Start at the end for mode
+uint8_t rgb_encoder_state = 4;
+
+bool process_record_encoder(uint16_t keycode, keyrecord_t *record)
+{
+ switch (keycode)
+ {
+ case RGB_ENC:
+ if (record->event.pressed) {
+ if (get_mods() & MOD_MASK_SHIFT) {
+ rgb_encoder_state = (rgb_encoder_state - 1);
+ if (rgb_encoder_state >= RGB_FUNCTION_COUNT)
+ rgb_encoder_state = RGB_FUNCTION_COUNT - 1;
+ } else {
+ rgb_encoder_state = (rgb_encoder_state + 1) % RGB_FUNCTION_COUNT;
+ }
+ }
+ return false;
+ }
+ return true;
+}
+#endif // RGB_OLED_MENU
-#ifdef ENCODER_ENABLE
const uint16_t PROGMEM encoders[][2] = {
{ KC_PGUP, KC_PGDN },
- { KC_DOWN, KC_UP }
-}
+ { KC_VOLU, KC_VOLD }
+};
void encoder_update_user(uint8_t index, bool clockwise)
{
- tap_code16(pgm_read_word(&encoders[index][clockwise]));
+ if (!is_keyboard_master())
+ return;
+
+#ifdef RGB_OLED_MENU
+ if (index == RGB_OLED_MENU)
+ (*rgb_functions[rgb_encoder_state][clockwise])();
+ else
+#endif // RGB_OLED_MENU
+ tap_code16(pgm_read_word(&encoders[index][clockwise]));
}
-#endif
diff --git a/users/xulkal/custom_keycodes.h b/users/xulkal/custom_keycodes.h
index d4ae0bd477..7ced92bf4c 100644
--- a/users/xulkal/custom_keycodes.h
+++ b/users/xulkal/custom_keycodes.h
@@ -10,6 +10,9 @@ enum custom_keycodes {
TD_DOT,
TD_MAX,
#endif
+#ifdef ENCODER_ENABLE
+ RGB_ENC,
+#endif
KEYMAP_SAFE_RANGE
};
@@ -26,3 +29,12 @@ enum custom_keycodes {
#define LOWER MO(_LOWER)
#define RAISE MO(_RAISE)
+
+
+#ifdef ENCODER_ENABLE
+#define KC_ENC1 RGB_ENC
+#define KC_ENC2 KC_MPLY
+#else
+#define KC_ENC1 RGB_RMOD
+#define KC_ENC2 RGB_MOD
+#endif
diff --git a/users/xulkal/custom_oled.c b/users/xulkal/custom_oled.c
index 7280ef7019..448e6ca107 100644
--- a/users/xulkal/custom_oled.c
+++ b/users/xulkal/custom_oled.c
@@ -3,12 +3,15 @@
#include <stdio.h>
-#ifdef OLED_DRIVER_ENABLE
-
#ifdef RGBLIGHT_ENABLE
rgblight_config_t rgblight_config;
#endif
+#if KEYBOARD_helix_rev2
+extern uint8_t is_master;
+bool is_keyboard_master(void) { return is_master; }
+#endif
+
static void render_logo(void)
{
static const char PROGMEM font_logo[] = {
@@ -18,21 +21,38 @@ static void render_logo(void)
oled_write_P(font_logo, false);
}
-#if defined(OLED_90ROTATION)
-
-// TODO: Need to define this function / extern only for helix based split common keyboards
-extern uint8_t is_master;
-bool is_keyboard_master(void)
+static void render_icon(void)
{
- return is_master;
+#ifdef OLED_90ROTATION
+ static const char PROGMEM font_icon[] = {
+ 0x9b,0x9c,0x9d,0x9e,0x9f,
+ 0xbb,0xbc,0xbd,0xbe,0xbf,
+ 0xdb,0xdc,0xdd,0xde,0xdf,0
+ };
+#else
+ static const char PROGMEM font_icon[] = {
+ // Use \r (0x0d) to jump to the next line without clearing the rest of the current line
+ 0x9b,0x9c,0x9d,0x9e,0x9f,0x0d,
+ 0xbb,0xbc,0xbd,0xbe,0xbf,0x0d,
+ 0xdb,0xdc,0xdd,0xde,0xdf,0
+ };
+#endif
+ oled_write_P(font_icon, false);
}
-static void render_layer(uint8_t layer)
+static void render_layer(void)
{
+ uint8_t layer = layer_state ? biton(layer_state) : biton32(default_layer_state);
+#ifdef OLED_90ROTATION
+ oled_write_P(PSTR("Layer"), false);
+#else
+ oled_write_P(PSTR("Layer: "), false);
+#endif
+
switch (layer)
{
case _QWERTY:
- oled_write_P(PSTR("DFLT "), false);
+ oled_write_P(PSTR("BASE "), false);
break;
#ifndef GAMELAYER_DISABLE
case _GAME:
@@ -53,125 +73,110 @@ static void render_layer(uint8_t layer)
}
}
-static void render_status(void)
+static void render_keyboard_leds(void)
{
- // Render to mode icon
- static const char PROGMEM mode_logo[2][4] = {
- {0x97,0x98,0x0a,0},
- {0xb7,0xb8,0x0a,0} };
-
- oled_write_P(mode_logo[0], false);
- oled_write_P(mode_logo[1], false);
+ // Host Keyboard LED Status
+ uint8_t led_state = host_keyboard_leds();
+#ifdef OLED_90ROTATION
+ oled_write_P(IS_LED_ON(led_state, USB_LED_NUM_LOCK) ? PSTR("NUMLK") : PSTR(" "), false);
+ oled_write_P(IS_LED_ON(led_state, USB_LED_CAPS_LOCK) ? PSTR("CAPLK") : PSTR(" "), false);
+ oled_write_P(IS_LED_ON(led_state, USB_LED_SCROLL_LOCK) ? PSTR("SCRLK") : PSTR(" "), false);
+#else
+ oled_write_P(IS_LED_ON(led_state, USB_LED_NUM_LOCK) ? PSTR("NUM ") : PSTR(" "), false);
+ oled_write_P(IS_LED_ON(led_state, USB_LED_CAPS_LOCK) ? PSTR("CAPS ") : PSTR(" "), false);
+ oled_write_P(IS_LED_ON(led_state, USB_LED_SCROLL_LOCK) ? PSTR("SCRL") : PSTR(" "), false);
+#endif
+}
- oled_write_P(PSTR("Layer"), false);
- uint8_t layer = biton(layer_state);
- if (layer != _QWERTY)
- render_layer(layer);
- else
- render_layer(biton32(default_layer_state));
+#ifdef RGB_OLED_MENU
+extern uint8_t rgb_encoder_state;
+#endif
- // Host Keyboard LED Status
- uint8_t led_usb_state = host_keyboard_leds();
- oled_write_P(led_usb_state & (1<<USB_LED_NUM_LOCK) ? PSTR("-----NUMLK") : PSTR("----- "), false);
- oled_write_P(led_usb_state & (1<<USB_LED_CAPS_LOCK) ? PSTR("CAPLK") : PSTR(" "), false);
- oled_write_P(led_usb_state & (1<<USB_LED_SCROLL_LOCK) ? PSTR("SCRLK") : PSTR(" "), false);
+#if defined(OLED_90ROTATION)
+#ifdef RGB_ENABLE
+static void render_rgb_state(void)
+{
+ // TODO: need to do a bit more handling here for horizontal rendering
#if defined(RGB_MATRIX_ENABLE)
- oled_set_cursor(0, oled_max_lines() - 7);
- oled_write_P(PSTR("-----"), false);
+ static char buffer[31] = {0};
+ snprintf(buffer, sizeof(buffer), "h%3d s%3d v%3d s%3d m%3d e%3d ", rgb_matrix_config.hsv.h, rgb_matrix_config.hsv.s, rgb_matrix_config.hsv.v, rgb_matrix_config.speed, rgb_matrix_config.mode, rgb_matrix_get_flags());
+#elif defined(RGBLIGHT_ENABLE)
static char buffer[26] = {0};
- snprintf(buffer, sizeof(buffer), "h%3d s%3d v%3d s%3d m%3d\n", rgb_matrix_config.hsv.h, rgb_matrix_config.hsv.s, rgb_matrix_config.hsv.v, rgb_matrix_config.speed, rgb_matrix_config.mode);
+ snprintf(buffer, sizeof(buffer), "h%3d s%3d v%3d s%3d m%3d ", rgblight_config.hue, rgblight_config.sat, rgblight_config.val, rgblight_config.speed, rgblight_config.mode);
+#endif
+
+#ifdef RGB_OLED_MENU
+ buffer[4 + rgb_encoder_state * 5] = '<';
+#endif
oled_write(buffer, false);
-#elif defined(RGBLIGHT_ENABLE)
- oled_set_cursor(0, oled_max_lines() - 7);
+}
+#endif
+
+static void render_status(void)
+{
+ render_icon();
+ render_layer();
+
+ // Host Keyboard LED Status
oled_write_P(PSTR("-----"), false);
- static char buffer[31] = {0};
- snprintf(buffer, sizeof(buffer), "h%3d s%3d v%3d s%3d m%3d\n", rgblight_config.hue, rgblight_config.sat, rgblight_config.val, rgblight_config.speed, rgblight_config.mode);
- oled_write(buffer, false);
+ render_keyboard_leds();
+
+ oled_write_P(PSTR("-----"), false);
+#ifdef RGB_ENABLE
+ render_rgb_state();
#endif
}
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
+#if KEYBOARD_helix_rev2
if (is_keyboard_master())
return OLED_ROTATION_270;
- return OLED_ROTATION_180;
+ return rotation;
+#else
+ if (is_keyboard_master())
+ return OLED_ROTATION_90;
+ return rotation;
+#endif
}
#else // OLED_90ROTATION
-static void render_layer(uint8_t layer)
+#ifdef RGB_ENABLE
+static void render_rgb_state(void)
{
- switch (layer)
- {
- case _QWERTY:
- oled_write_P(PSTR("Default\n"), false);
- break;
-#ifndef GAMELAYER_DISABLE
- case _GAME:
- oled_write_P(PSTR("Game\n"), false);
- break;
+ // TODO: need to do a bit more handling here for horizontal rendering
+#if defined(RGB_MATRIX_ENABLE)
+ static char buffer[37] = {0};
+ snprintf(buffer, sizeof(buffer), "h%3d s%3d v%3d s%3d m%3d e%3d ", rgb_matrix_config.hsv.h, rgb_matrix_config.hsv.s, rgb_matrix_config.hsv.v, rgb_matrix_config.speed, rgb_matrix_config.mode, rgb_matrix_get_flags());
+#elif defined(RGBLIGHT_ENABLE)
+ static char buffer[32] = {0};
+ snprintf(buffer, sizeof(buffer), "h%3d s%3d v%3d s%3d m%3d ", rgblight_config.hue, rgblight_config.sat, rgblight_config.val, rgblight_config.speed, rgblight_config.mode);
#endif
- case _LOWER:
- oled_write_P(PSTR("Lower\n"), false);
- break;
- case _RAISE:
- oled_write_P(PSTR("Raise\n"), false);
- break;
-#ifdef TRILAYER_ENABLED
- case _ADJUST:
- oled_write_P(PSTR("Adjust\n"), false);
- break;
+
+#ifdef RGB_OLED_MENU
+ buffer[4 + rgb_encoder_state * 5] = '<';
#endif
- }
+ oled_write(buffer, false);
}
+#endif
static void render_status(void)
{
- // Render to mode icon
- static const char PROGMEM mode_logo[2][3] = {
- {0x97,0x98,0},
- {0xb7,0xb8,0}
- };
+ render_icon();
- oled_write_P(mode_logo[0], false);
+ // Host Layer Status
+ oled_set_cursor(6, 0);
+ render_layer();
-#if defined(RGB_MATRIX_ENABLE)
- static char buffer[20] = {0};
- snprintf(buffer, sizeof(buffer), " h%3d s%3d v%3d\n", rgb_matrix_config.hsv.h, rgb_matrix_config.hsv.s, rgb_matrix_config.hsv.v);
- oled_write(buffer, false);
-#elif defined(RGBLIGHT_ENABLE)
- static char buffer[20] = {0};
- snprintf(buffer, sizeof(buffer), " h%3d s%3d v%3d\n", rgblight_config.hue, rgblight_config.sat, rgblight_config.val);
- oled_write(buffer, false);
-#else
- oled_write_P(PSTR("\n"));
-#endif
-
- oled_write_P(mode_logo[1], false);
+ // Host Keyboard LED Status
+ oled_set_cursor(6, 1);
+ render_keyboard_leds();
-#if defined(RGB_MATRIX_ENABLE)
- snprintf(buffer, sizeof(buffer), " s%3d m%3d\n", rgb_matrix_config.speed, rgb_matrix_config.mode);
- oled_write(buffer, false);
-#elif defined(RGBLIGHT_ENABLE)
- snprintf(buffer, sizeof(buffer), " s%3d m%3d\n", rgblight_config.speed, rgblight_config.mode);
- oled_write(buffer, false);
-#else
- oled_write_P(PSTR("\n"));
+#ifdef RGB_ENABLE
+ oled_set_cursor(6, 2);
+ render_rgb_state();
#endif
-
- // Define layers here, Have not worked out how to have text displayed for each layer. Copy down the number you see and add a case for it below
- oled_write_P(PSTR("Layer: "), false);
- uint8_t layer = biton(layer_state);
- if (layer != _QWERTY)
- render_layer(layer);
- else
- render_layer(biton32(default_layer_state));
-
- // Host Keyboard LED Status
- uint8_t led_usb_state = host_keyboard_leds();
- oled_write_P(led_usb_state & (1<<USB_LED_NUM_LOCK) ? PSTR("NUMLCK ") : PSTR(" "), false);
- oled_write_P(led_usb_state & (1<<USB_LED_CAPS_LOCK) ? PSTR("CAPLCK ") : PSTR(" "), false);
- oled_write_P(led_usb_state & (1<<USB_LED_SCROLL_LOCK) ? PSTR("SCRLCK ") : PSTR(" "), false);
}
#endif // OLED_90ROTATION
@@ -186,5 +191,3 @@ void oled_task_user(void)
oled_scroll_left();
}
}
-
-#endif
diff --git a/users/xulkal/custom_rgb.c b/users/xulkal/custom_rgb.c
new file mode 100644
index 0000000000..f68a7c56c0
--- /dev/null
+++ b/users/xulkal/custom_rgb.c
@@ -0,0 +1,64 @@
+#include "custom_rgb.h"
+
+#ifdef RGB_MATRIX_ENABLE
+void rgb_matrix_increase_flags(void)
+{
+ switch (rgb_matrix_get_flags()) {
+ case LED_FLAG_ALL: {
+ rgb_matrix_set_flags(LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER);
+ rgb_matrix_set_color_all(0, 0, 0);
+ }
+ break;
+ case LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER: {
+ rgb_matrix_set_flags(LED_FLAG_NONE);
+ rgb_matrix_disable_noeeprom();
+ }
+ break;
+ case LED_FLAG_UNDERGLOW: {
+ rgb_matrix_set_flags(LED_FLAG_ALL);
+ rgb_matrix_set_color_all(0, 0, 0);
+ }
+ break;
+ default: {
+ rgb_matrix_set_flags(LED_FLAG_UNDERGLOW);
+ rgb_matrix_enable_noeeprom();
+ }
+ break;
+ }
+}
+
+void rgb_matrix_decrease_flags(void)
+{
+ switch (rgb_matrix_get_flags()) {
+ case LED_FLAG_ALL: {
+ rgb_matrix_set_flags(LED_FLAG_UNDERGLOW);
+ rgb_matrix_set_color_all(0, 0, 0);
+ }
+ break;
+ case LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER: {
+ rgb_matrix_set_flags(LED_FLAG_ALL);
+ rgb_matrix_set_color_all(0, 0, 0);
+ }
+ break;
+ case LED_FLAG_UNDERGLOW: {
+ rgb_matrix_set_flags(LED_FLAG_NONE);
+ rgb_matrix_disable_noeeprom();
+ }
+ break;
+ default: {
+ rgb_matrix_set_flags(LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER);
+ rgb_matrix_enable_noeeprom();
+ }
+ break;
+ }
+}
+#endif
+
+void rgb_reset(void) {
+#if defined(RGB_MATRIX_ENABLE)
+ eeconfig_update_rgb_matrix_default();
+#elif defined(RGBLIGHT_ENABLE)
+ eeconfig_update_rgblight_default();
+ rgblight_enable();
+#endif
+}
diff --git a/users/xulkal/custom_rgb.h b/users/xulkal/custom_rgb.h
new file mode 100644
index 0000000000..10010b5242
--- /dev/null
+++ b/users/xulkal/custom_rgb.h
@@ -0,0 +1,17 @@
+#pragma once
+
+#if defined(RGB_MATRIX_ENABLE)
+# include "rgb_matrix.h"
+#elif defined(RGBLIGHT_ENABLE)
+# if !defined(__AVR__)
+# define PROGMEM
+# endif
+# include "rgblight.h"
+#endif
+
+#ifdef RGB_MATRIX_ENABLE
+void rgb_matrix_increase_flags(void);
+void rgb_matrix_decrease_flags(void);
+#endif
+
+void rgb_reset(void);
diff --git a/users/xulkal/custom_tap_dance.c b/users/xulkal/custom_tap_dance.c
index 7123f1be6b..2c5d145f1b 100644
--- a/users/xulkal/custom_tap_dance.c
+++ b/users/xulkal/custom_tap_dance.c
@@ -1,6 +1,5 @@
#include "custom_tap_dance.h"
#include "custom_keycodes.h"
-#include "timer_utils.h"
#ifdef TAP_DANCE_ENABLE
@@ -8,8 +7,7 @@
qk_tap_dance_action_t tap_dance_actions[] = {
[COMM_QUOT] = ACTION_TAP_DANCE_DOUBLE(KC_COMM, KC_QUOT),
[BACKSPACE] = ACTION_TAP_DANCE_DOUBLE (KC_BSPACE, LCTL(KC_BSPACE)),
- [DELETE] = ACTION_TAP_DANCE_DOUBLE (KC_DELETE, LCTL(KC_DELETE)),
- [DOT] = ACTION_TAP_DANCE_DOUBLE (KC_DOT, KC_GRAVE)
+ [DELETE] = ACTION_TAP_DANCE_DOUBLE (KC_DELETE, LCTL(KC_DELETE))
};
#else
@@ -20,18 +18,17 @@ static uint16_t td_timer;
const uint16_t PROGMEM td_keymaps[TD_MAX - TD_MIN][2] = {
[TD_COMM - TD_MIN] = { KC_COMM, KC_QUOT },
[TD_BSPC - TD_MIN] = { KC_BSPACE, LCTL(KC_BSPACE) },
- [TD_DEL - TD_MIN] = { KC_DELETE, LCTL(KC_DELETE) },
- [TD_DOT - TD_MIN] = { KC_DOT, KC_GRAVE }
+ [TD_DEL - TD_MIN] = { KC_DELETE, LCTL(KC_DELETE) }
};
-void run_tap_dance_double(uint8_t i)
+static void run_custom_tap_dance(uint8_t i)
{
tap_code16(pgm_read_word(&td_keymaps[td_keycode - TD_MIN][i]));
td_keycode = KC_TRANSPARENT;
td_timer = timer_read() + TAPPING_TERM;
}
-bool process_tap_dance_double(uint16_t keycode, keyrecord_t *record)
+bool process_custom_tap_dance(uint16_t keycode, keyrecord_t *record)
{
if (TD_MIN <= keycode && keycode < TD_MAX)
{
@@ -43,20 +40,20 @@ bool process_tap_dance_double(uint16_t keycode, keyrecord_t *record)
td_timer = timer_read() + TAPPING_TERM;
}
else
- run_tap_dance_double(1);
+ run_custom_tap_dance(1);
}
return false;
}
if (td_keycode != KC_TRANSPARENT)
- run_tap_dance_double(0);
+ run_custom_tap_dance(0);
return true;
}
void matrix_scan_user(void)
{
if (td_keycode != KC_TRANSPARENT && timer_expired(td_timer))
- run_tap_dance_double(0);
+ run_custom_tap_dance(0);
}
#endif
diff --git a/users/xulkal/custom_tap_dance.h b/users/xulkal/custom_tap_dance.h
index 33398808d3..c4da9318c2 100644
--- a/users/xulkal/custom_tap_dance.h
+++ b/users/xulkal/custom_tap_dance.h
@@ -9,18 +9,15 @@
enum {
COMM_QUOT = 0,
BACKSPACE,
- DELETE,
- DOT
+ DELETE
};
#define TD_COMM TD(COMM_QUOT)
#define TD_BSPC TD(BACKSPACE)
#define TD_DEL TD(DELETE)
-#define TD_DOT TD(DOT)
#else
-void run_tap_dance_double(uint8_t i);
-bool process_tap_dance_double(uint16_t keycode, keyrecord_t *record);
+bool process_custom_tap_dance(uint16_t keycode, keyrecord_t *record);
#endif
diff --git a/users/xulkal/layouts.h b/users/xulkal/layouts.h
index 65dad8c63c..d4b7084186 100644
--- a/users/xulkal/layouts.h
+++ b/users/xulkal/layouts.h
@@ -18,12 +18,12 @@
#define _________________QWERTY_L2_________________ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T
#define _________________QWERTY_L3_________________ RIS_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G
#define _________________QWERTY_L4_________________ KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B
-#define _________________QWERTY_L5_________________ KC_LCPO, KC_LGUI, LOWER, RAISE, KC_LALT, KC_SPC
+#define _________________QWERTY_L5_________________ KC_LCPO, KC_LGUI, KC_LALT, LOWER, RAISE, KC_SPC
#define _________________QWERTY_R1_________________ KC_6, KC_7, KC_8, KC_9, KC_0, TD_BSPC
#define _________________QWERTY_R2_________________ KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS
#define _________________QWERTY_R3_________________ KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT
-#define _________________QWERTY_R4_________________ KC_N, KC_M, TD_COMM, TD_DOT, KC_SLASH, KC_RSPC
+#define _________________QWERTY_R4_________________ KC_N, KC_M, TD_COMM, KC_DOT, KC_SLASH, KC_RSPC
#define _________________QWERTY_R5_________________ KC_SPC, KC_LEFT, KC_UP, KC_DOWN, KC_RIGHT, KC_RCPC
@@ -86,7 +86,7 @@
#define __________________LOWER_L4_________________ _______, _______, _______, _______, _______, _______
#define __________________LOWER_L5_________________ _______, _______, _______, _______, _______, _______
-#define __________________LOWER_R1_________________ _______, _______, _______, _______, _______, KC_DEL
+#define __________________LOWER_R1_________________ _______, _______, _______, KC_SLCK, KC_NLCK, KC_DEL
#define __________________LOWER_R2_________________ _______, _______, KC_KP_7, KC_KP_8, KC_KP_9, _______
#define __________________LOWER_R3_________________ _______, _______, KC_KP_4, KC_KP_5, KC_KP_6, _______
#define __________________LOWER_R4_________________ _______, _______, KC_KP_1, KC_KP_2, KC_KP_3, _______
diff --git a/users/xulkal/process_records.c b/users/xulkal/process_records.c
index 115623caa4..ca2376145d 100644
--- a/users/xulkal/process_records.c
+++ b/users/xulkal/process_records.c
@@ -1,9 +1,8 @@
#include "process_records.h"
#include "custom_keycodes.h"
-#include "timer_utils.h"
-#if defined(RGB_MATRIX_ENABLE)
-extern void eeconfig_update_rgb_matrix_default(void);
+#ifdef RGB_ENABLE
+#include "custom_rgb.h"
#endif
#ifdef TRILAYER_ENABLED
@@ -18,37 +17,36 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record)
static uint16_t reset_timer;
#ifndef TAP_DANCE_ENABLE
- if (!process_tap_dance_double(keycode, record))
+ if (!process_custom_tap_dance(keycode, record))
return false;
#endif
switch (keycode)
{
case RGBRST:
- {
-#if defined(RGBLIGHT_ENABLE)
- if (record->event.pressed)
- {
- eeconfig_update_rgblight_default();
- rgblight_enable();
- }
-#elif defined(RGB_MATRIX_ENABLE)
- if (record->event.pressed)
- eeconfig_update_rgb_matrix_default();
+#ifdef RGB_ENABLE
+ if (record->event.pressed)
+ rgb_reset();
#endif
- }
return false;
case RESET:
{
if (record->event.pressed)
reset_timer = timer_read() + 500;
- else if (timer_expired(reset_timer))
+ else if (timer_expired(timer_read(), reset_timer))
reset_keyboard();
}
return false;
+#ifdef RGB_MATRIX_TOG_LAYERS
+ case RGB_TOG:
+ if (record->event.pressed) {
+ rgb_matrix_increase_flags();
+ }
+ return false;
+#endif
}
- return process_record_keymap(keycode, record);
+ return process_record_encoder(keycode, record) && process_record_keymap(keycode, record);
}
__attribute__ ((weak))
@@ -56,3 +54,9 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record)
{
return true;
}
+
+__attribute__ ((weak))
+bool process_record_encoder(uint16_t keycode, keyrecord_t *record)
+{
+ return true;
+}
diff --git a/users/xulkal/process_records.h b/users/xulkal/process_records.h
index 701ef7e74f..c219394f8e 100644
--- a/users/xulkal/process_records.h
+++ b/users/xulkal/process_records.h
@@ -15,3 +15,4 @@ enum layer_number {
};
bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
+bool process_record_encoder(uint16_t keycode, keyrecord_t *record);
diff --git a/users/xulkal/rules.mk b/users/xulkal/rules.mk
index ab0231d7dc..8f8365ea7e 100644
--- a/users/xulkal/rules.mk
+++ b/users/xulkal/rules.mk
@@ -1,9 +1,6 @@
SRC += xulkal.c \
process_records.c \
- custom_tap_dance.c \
- custom_encoder.c \
- custom_oled.c \
- timer_utils.c
+ custom_tap_dance.c
# Some usual defaults
MOUSEKEY_ENABLE = no # Mouse keys (+4700)
@@ -15,3 +12,21 @@ ifneq ($(strip $(DISABLE_LTO)), yes)
OPT_DEFS += -DNO_ACTION_MACRO
OPT_DEFS += -DNO_ACTION_FUNCTION
endif
+
+ifeq ($(strip $(ENCODER_ENABLE)), yes)
+ SRC += custom_encoder.c
+endif
+
+ifneq ($(strip $(RGB_MATRIX_ENABLE)), no)
+ OPT_DEFS += -DRGB_ENABLE
+ SRC += custom_rgb.c
+endif
+
+ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
+ OPT_DEFS += -DRGB_ENABLE
+ SRC += custom_rgb.c
+endif
+
+ifeq ($(strip $(OLED_DRIVER_ENABLE)), yes)
+ SRC += custom_oled.c
+endif
diff --git a/users/xulkal/timer_utils.c b/users/xulkal/timer_utils.c
deleted file mode 100644
index 5f5d9a1ebf..0000000000
--- a/users/xulkal/timer_utils.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "timer_utils.h"
-
-bool timer_expired(uint16_t last)
-{
- return timer_read() - last < 0x8000;
-}
-
-bool timer_expired32(uint32_t last)
-{
- return timer_read32() - last < 0x80000000;
-}
-
diff --git a/users/xulkal/timer_utils.h b/users/xulkal/timer_utils.h
deleted file mode 100644
index 7e2a0b74db..0000000000
--- a/users/xulkal/timer_utils.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#pragma once
-#include "timer.h"
-#include <stdbool.h>
-
-bool timer_expired(uint16_t last);
-bool timer_expired32(uint32_t last);
diff --git a/users/xulkal/xulkal.h b/users/xulkal/xulkal.h
index 9bc83b7de7..32df8df0c6 100644
--- a/users/xulkal/xulkal.h
+++ b/users/xulkal/xulkal.h
@@ -2,6 +2,5 @@
#include "process_records.h"
#include "layouts.h"
-#include "timer_utils.h"
#include "custom_keycodes.h"
#include "custom_tap_dance.h"
diff --git a/users/yanfali/config.h b/users/yanfali/config.h
new file mode 100644
index 0000000000..2c427f0331
--- /dev/null
+++ b/users/yanfali/config.h
@@ -0,0 +1,21 @@
+#pragma once
+
+#ifdef KEYBOARD_maartenwut_plain60
+
+#define B7_AUDIO
+#ifdef AUDIO_ENABLE
+ #define STARTUP_SONG SONG(GUITAR_SOUND)
+#endif
+
+#endif
+
+#ifdef KEYBOARD_xd84
+
+#undef RGBLED_NUM
+#define RGBLED_NUM 20
+
+#undef RGBLIGHT_ANIMATIONS
+#define RGBLIGHT_EFFECT_RAINBOW_MOOD
+#define RGBLIGHT_EFFECT_RAINBOW_SWIRL
+
+#endif
diff --git a/users/yanfali/rules.mk b/users/yanfali/rules.mk
new file mode 100644
index 0000000000..c43f298588
--- /dev/null
+++ b/users/yanfali/rules.mk
@@ -0,0 +1,16 @@
+BOOTMAGIC = lite
+DYNAMIC_KEYMAP_ENABLE = no
+CONSOLE_ENABLE = yes
+COMMAND_ENABLE = yes
+LINK_TIME_OPTIMIZATION_ENABLE = yes
+
+# only enable audio on specific boards
+ifeq ($(strip $(KEYBOARD)), maartenwut/plain60)
+ AUDIO_ENABLE = yes
+else
+ AUDIO_ENABLE = no
+endif
+
+ifeq ($(strip $(KEYBOARD)), fruity60)
+ COMMAND_ENABLE = no
+endif
diff --git a/users/yet-another-developer/.gitignore b/users/yet-another-developer/.gitignore
new file mode 100644
index 0000000000..d815569141
--- /dev/null
+++ b/users/yet-another-developer/.gitignore
@@ -0,0 +1,2 @@
+secrets.c
+secrets.h \ No newline at end of file
diff --git a/users/yet-another-developer/README.md b/users/yet-another-developer/README.md
new file mode 100644
index 0000000000..3e528bcf5d
--- /dev/null
+++ b/users/yet-another-developer/README.md
@@ -0,0 +1,7 @@
+# User Space for yet-another-developer
+
+
+## Reference / Inspiration
+ - /u/kuchosauronad0
+ - /u/drashna
+ - /u/not-quite-neo \ No newline at end of file
diff --git a/users/yet-another-developer/combo.c b/users/yet-another-developer/combo.c
new file mode 100644
index 0000000000..b4e8e84ae5
--- /dev/null
+++ b/users/yet-another-developer/combo.c
@@ -0,0 +1,27 @@
+#include "combo.h"
+
+void process_combo_event(uint8_t combo_index, bool pressed){
+ switch(combo_index) {
+ case ZV_COPY:
+ if (pressed) {
+ tap_code16(LCTL(KC_C));
+ }
+ break;
+ case XV_CUT:
+ if (pressed) {
+ tap_code16(LCTL(KC_X));
+ }
+ break;
+
+ case CV_PASTE:
+ if (pressed) {
+ tap_code16(LCTL(KC_V));
+ }
+ break;
+ case QP_SLEEP:
+ if (pressed) {
+ tap_code16(KC_SYSTEM_SLEEP);
+ }
+ break;
+ }
+}
diff --git a/users/yet-another-developer/combo.h b/users/yet-another-developer/combo.h
new file mode 100644
index 0000000000..e2ff09ab5a
--- /dev/null
+++ b/users/yet-another-developer/combo.h
@@ -0,0 +1,21 @@
+#pragma once
+#include "quantum.h"
+enum combo_events {
+ ZV_COPY,
+ XV_CUT,
+ CV_PASTE,
+ QP_SLEEP
+};
+
+const uint16_t PROGMEM copy_combo[] = {KC_Z, KC_V, COMBO_END};
+const uint16_t PROGMEM cut_combo[] = {KC_X, KC_V, COMBO_END};
+const uint16_t PROGMEM paste_combo[] = {KC_C, KC_V, COMBO_END};
+const uint16_t PROGMEM sleep_combo[] = {KC_Q, KC_P, COMBO_END};
+
+combo_t key_combos[COMBO_COUNT] = {
+ [ZV_COPY] = COMBO_ACTION(copy_combo),
+ [XV_CUT] = COMBO_ACTION(cut_combo),
+ [CV_PASTE] = COMBO_ACTION(paste_combo),
+ [QP_SLEEP] = COMBO_ACTION(sleep_combo),
+};
+
diff --git a/users/yet-another-developer/config.h b/users/yet-another-developer/config.h
new file mode 100644
index 0000000000..d46d487fe3
--- /dev/null
+++ b/users/yet-another-developer/config.h
@@ -0,0 +1,56 @@
+#pragma once
+
+/* Set Polling rate to 1000Hz */
+#define USB_POLLING_INTERVAL_MS 1
+
+#ifndef ONESHOT_TAP_TOGGLE
+ #define ONESHOT_TAP_TOGGLE 2
+#endif // !ONESHOT_TAP_TOGGLE
+
+#ifndef ONESHOT_TIMEOUT
+ #define ONESHOT_TIMEOUT 2000
+#endif // !ONESHOT_TIMEOUT
+
+#ifndef QMK_KEYS_PER_SCAN
+ #define QMK_KEYS_PER_SCAN 4
+#endif // !QMK_KEYS_PER_SCAN
+
+#if defined(LEADER_ENABLE)
+ #define LEADER_PER_KEY_TIMING
+ #define LEADER_TIMEOUT 250
+#endif // !LEADER_ENABLE
+
+#if defined(COMBO_ENABLE)
+ #define COMBO_COUNT 4
+ #define COMBO_TERM 150
+#endif // !COMBO_ENABLE
+
+#if defined(NKRO_ENABLE)
+ #define FORCE_NKRO
+#endif // !NKRO_ENABLE
+
+// this makes it possible to do rolling combos (zx) with keys that
+// convert to other keys on hold (z becomes ctrl when you hold it,
+// and when this option isn't enabled, z rapidly followed by x
+// actually sends Ctrl-x. That's bad.)
+#define IGNORE_MOD_TAP_INTERRUPT
+#undef PERMISSIVE_HOLD
+//#define TAPPING_FORCE_HOLD
+//#define RETRO_TAPPING
+
+#ifndef TAPPING_TOGGLE
+ #define TAPPING_TOGGLE 1
+#endif
+
+#ifdef TAPPING_TERM
+# undef TAPPING_TERM
+#endif // !TAPPING_TERM
+#if defined(KEYBOARD_ergodash)
+ #define TAPPING_TERM 240
+#else
+ #define TAPPING_TERM 200
+#endif
+
+#define TAP_CODE_DELAY 5 //DEFAULT: 100
+
+#define MACRO_TIMER 5
diff --git a/users/yet-another-developer/leader.c b/users/yet-another-developer/leader.c
new file mode 100644
index 0000000000..3cbbf8d70e
--- /dev/null
+++ b/users/yet-another-developer/leader.c
@@ -0,0 +1,46 @@
+#include "leader.h"
+
+LEADER_EXTERNS();
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void){
+
+#ifdef TAP_DANCE_ENABLE // Run Diablo 3 macro checking code.
+// run_diablo_macro_check();
+#endif // TAP_DANCE_ENABLE
+
+#ifdef RGBLIGHT_ENABLE
+ matrix_scan_rgb();
+#endif // RGBLIGHT_ENABLE
+
+ LEADER_DICTIONARY() {
+ leading = false;
+ leader_end();
+
+ SEQ_TWO_KEYS(KC_V, KC_Z){
+ // vim: Zoom pane
+ tap_code16(LCTL(KC_W));
+ tap_code16(LSFT(KC_BSLS));
+ }
+
+ SEQ_TWO_KEYS(KC_V, KC_R) {
+ // vim: Substitute and place cursor
+ SEND_STRING(":%s///g" SS_TAP(X_LEFT));
+ tap_code(KC_LEFT);
+ tap_code(KC_LEFT);
+ }
+
+ SEQ_TWO_KEYS(KC_V, KC_T) {
+ // vim: move current pane to new tab
+ tap_code16(LCTL(KC_W));
+ tap_code16(LSFT(KC_T));
+ }
+
+ SEQ_THREE_KEYS(KC_BSPC, KC_BSPC, KC_BSPC){
+ // Reset the keyboard
+ reset_keyboard();
+ }
+ }
+
+ matrix_scan_keymap();
+}
diff --git a/users/yet-another-developer/leader.h b/users/yet-another-developer/leader.h
new file mode 100644
index 0000000000..7ed6c8a82c
--- /dev/null
+++ b/users/yet-another-developer/leader.h
@@ -0,0 +1,6 @@
+#pragma once
+#include "yet-another-developer.h"
+
+#include "leader.h"
+
+void matrix_scan_user(void);
diff --git a/users/yet-another-developer/process_records.c b/users/yet-another-developer/process_records.c
new file mode 100644
index 0000000000..c7dbd704a0
--- /dev/null
+++ b/users/yet-another-developer/process_records.c
@@ -0,0 +1,193 @@
+#include "yet-another-developer.h"
+
+uint16_t copy_paste_timer;
+
+__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;
+}
+
+// Defines actions for my global custom keycodes. Defined in yet-another-developer.h file
+// Then runs the _keymap's record handier if not processed here
+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
+ #if defined(KEYBOARD_ergodox_ez) || defined(KEYBOARD_keebio_iris_rev2)
+ xprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.row, record->event.key.col, record->event.pressed);
+ #else
+ xprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed);
+ #endif
+#endif //KEYLOGGER_ENABLE
+
+ switch (keycode) {
+ case KC_QWERTY ... KC_UNICODE:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(keycode - KC_QWERTY);
+ }
+ break;
+
+ case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader
+ if (!record->event.pressed) {
+ clear_mods();
+ clear_oneshot_mods();
+ send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), TAP_CODE_DELAY);
+ {
+ send_string_with_delay_P(PSTR(":flash"), TAP_CODE_DELAY);
+ }
+ }
+ break;
+
+ /* Tap Dance */
+ case MC_QT1: // ""
+ if(record->event.pressed){
+ SEND_STRING("\"\"");
+ tap_code(KC_LEFT);
+ }
+ break;
+ case MC_QT2: // ''
+ if(record->event.pressed){
+ SEND_STRING("''");
+ tap_code(KC_LEFT);
+ }
+ break;
+ case MC_QT3: // `'
+ if(record->event.pressed){
+ SEND_STRING("`'");
+ tap_code(KC_LEFT);
+ }
+ break;
+ case MC_PAR: // Parenthesis
+ if(record->event.pressed){
+ SEND_STRING("()");
+ tap_code(KC_LEFT);
+ }
+ break;
+ case MC_CUR: // Curly bracket
+ if(record->event.pressed){
+ SEND_STRING("{}");
+ tap_code(KC_LEFT);
+ }
+ break;
+ case MC_SQR: // Square bracket
+ if(record->event.pressed){
+ SEND_STRING("[]");
+ tap_code(KC_LEFT);
+ }
+ break;
+ case MC_ABR: // Angle bracket
+ if(record->event.pressed){
+ SEND_STRING("<>");
+ tap_code(KC_LEFT);
+ }
+ break;
+ case MCT_NEW: // New Tmux Session
+ if(record->event.pressed){
+ SEND_STRING(":neww");
+ tap_code(KC_ENT);
+ }
+ break;
+ case MCT_SH: // Tmux horizontal split
+ if(record->event.pressed){
+ SEND_STRING("%");
+ }
+ break;
+ case MCT_SV: // Tmux vertical split
+ if(record->event.pressed){
+ SEND_STRING("\"");
+ }
+ break;
+ case MCT_ZM: // Tmux zoom
+ if(record->event.pressed){
+ tap_code(KC_Z);
+ }
+ break;
+ case MCT_SCR: // Tmux scroll mode
+ if(record->event.pressed){
+ tap_code(KC_PGUP);
+ }
+ break;
+ case MCT_UP: // Tmux up
+ break;
+ case MCT_DW: // Tmux down
+ break;
+ case MCT_LFT: // Tmux left
+ break;
+ case MCT_RGT: // Tmux right
+ tap_code(KC_RIGHT);
+ break;
+ case MCV_B: // Vim begin of line
+ if(record->event.pressed){
+ tap_code(KC_0);
+ }
+ break;
+ case MCV_E: // Vim end of line
+ if(record->event.pressed){
+ SEND_STRING(":vsplit");
+ tap_code(KC_ENT);
+ }
+ break;
+ case MCT_F: // Vim for loop
+ if(record->event.pressed){
+ SEND_STRING(":help");
+ tap_code(KC_ENT);
+ }
+ break;
+
+ 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_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
+ register_code(KC_LCTL);
+ tap_code(KC_C);
+ unregister_code(KC_LCTL);
+ } else { // Tap, paste
+ register_code(KC_LCTL);
+ tap_code(KC_V);
+ unregister_code(KC_LCTL);
+ }
+ }
+ break;
+#ifdef UNICODE_ENABLE
+ case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻
+ if (record->event.pressed) {
+ send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B");
+ }
+ break;
+ case UC_TABL: // ┬─┬ノ( º _ ºノ)
+ if (record->event.pressed) {
+ send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 30CE 0029");
+ }
+ break;
+ case UC_SHRG: // ¯\_(ツ)_/¯
+ if (record->event.pressed) {
+ send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF");
+ }
+ break;
+ case UC_DISA: // ಠ_ಠ
+ if (record->event.pressed) {
+ send_unicode_hex_string("0CA0 005F 0CA0");
+ }
+ break;
+#endif // UNICODE_ENABLE
+ }
+
+ return process_record_keymap(keycode, record) &&
+#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
+ process_record_user_rgb(keycode, record) &&
+#endif // RGBLIGHT_ENABLE
+ process_record_secrets(keycode, record);
+}
diff --git a/users/yet-another-developer/process_records.h b/users/yet-another-developer/process_records.h
new file mode 100644
index 0000000000..d4576f541e
--- /dev/null
+++ b/users/yet-another-developer/process_records.h
@@ -0,0 +1,109 @@
+#pragma once
+#include "yet-another-developer.h"
+
+#if defined(KEYMAP_SAFE_RANGE)
+# define PLACEHOLDER_SAFE_RANGE KEYMAP_SAFE_RANGE
+#else
+# define PLACEHOLDER_SAFE_RANGE SAFE_RANGE
+#endif
+
+enum userspace_custom_keycodes {
+ VRSN = PLACEHOLDER_SAFE_RANGE, // Prints QMK Firmware and board info
+ KC_QWERTY, // Sets default layer to QWERTY
+ KC_COLEMAK, // Sets default layer to COLEMAK
+ KC_DVORAK, // Sets default layer to DVORAK
+ KC_WORKMAN, // Sets default layer to WORKMAN
+ KC_UNICODE, // Sets default layer to UNICOD
+
+ KC_MAKE, // Run keyboard's customized make command
+ 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, // ಠ_ಠ
+
+ MC_QT1, // ""
+ MC_QT2, // ''
+ MC_QT3, // `'
+ MC_PAR, // Parenthesis
+ MC_CUR, // Curly bracket
+ MC_SQR, // Square bracket
+ MC_ABR, // Angle bracket
+ MCT_NEW, // New Tmux Session
+ MCT_SH, // Tmux horizontal split
+ MCT_SV, // Tmux vertical split
+ MCT_ZM, // Tmux zoom
+ MCT_SCR, // Tmux scroll mode
+ MCT_UP, // Tmux up
+ MCT_DW, // Tmux down
+ MCT_LFT, // Tmux left
+ MCT_RGT, // Tmux right
+ MCV_B, // Vim begin of line
+ MCV_E, // Vim end of line
+ MCT_F, // Vim for loop
+ MCG_A, // Git add
+ MCG_C, // Git commit
+ MCG_P, // Git push
+ MCG_R, // Git revert
+ MCG_L, // Git log
+ MCG_S, // Git status
+
+ NEW_SAFE_RANGE // use "NEWPLACEHOLDER for keymap specific codes
+};
+
+bool process_record_secrets(uint16_t keycode, keyrecord_t *record);
+bool process_record_keymap( uint16_t keycode, keyrecord_t *record);
+
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+#define ADJUST MO(_ADJUST)
+#define TG_MODS TG(_MODS)
+#define OS_LWR OSL(_LOWER)
+#define OS_RSE OSL(_RAISE)
+#define OS_UNI OSL(_UNICODE)
+
+#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 QWERTY KC_QWERTY
+#define DVORAK KC_DVORAK
+#define COLEMAK KC_COLEMAK
+#define WORKMAN KC_WORKMAN
+#define UNICODE KC_UNICODE
+
+#define KC_RESET RESET
+#define KC_RST KC_RESET
+
+#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 UC_IRNY UC(0x2E2E)
+#define UC_CLUE UC(0x203D)
diff --git a/users/yet-another-developer/rules.mk b/users/yet-another-developer/rules.mk
new file mode 100644
index 0000000000..597df6d0b9
--- /dev/null
+++ b/users/yet-another-developer/rules.mk
@@ -0,0 +1,50 @@
+SRC += yet-another-developer.c \
+ process_records.c
+
+LINK_TIME_OPTIMIZATION_ENABLE = yes
+SPACE_CADET_ENABLE = no
+
+ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
+ SRC += tap_dances.c
+endif
+
+ifeq ($(strip $(COMBO_ENABLE)), yes)
+ SRC += combo.c
+endif
+
+
+ifeq ($(strip $(LEADER_ENABLE)), yes)
+ SRC += leader.c
+endif
+
+
+ifneq ("$(wildcard $(USER_PATH)/secrets.c)","")
+ SRC += secrets.c
+endif
+
+
+ifeq ($(strip $(NO_SECRETS)), yes)
+ OPT_DEFS += -DNO_SECRETS
+endif
+
+
+ifeq ($(strip $(UNICODEMAP_ENABLE)), yes)
+ SRC += unicode.c
+endif
+
+
+ifeq ($(strip $(MACROS_ENABLED)), yes)
+ OPT_DEFS += -DMACROS_ENABLED
+endif
+
+
+ifdef CONSOLE_ENABLE
+ ifeq ($(strip $(KEYLOGGER_ENABLE)), yes)
+ OPT_DEFS += -DKEYLOGGER_ENABLE
+ endif
+endif
+
+
+ifeq ($(strip $(MAKE_BOOTLOADER)), yes)
+ OPT_DEFS += -DMAKE_BOOTLOADER
+endif
diff --git a/users/yet-another-developer/tap_dances.c b/users/yet-another-developer/tap_dances.c
new file mode 100644
index 0000000000..66dcc60fa5
--- /dev/null
+++ b/users/yet-another-developer/tap_dances.c
@@ -0,0 +1,55 @@
+#include "tap_dances.h"
+
+void td_parenthesis (qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count == 1) {
+// SEND_STRING ("\(");
+ tap_code(KC_QUOT);
+ reset_tap_dance (state);
+ }
+ else if (state->count == 2) {
+ SEND_STRING("()" SS_TAP(X_LEFT));
+ reset_tap_dance (state);
+ }
+ else if (state->count == 3) {
+ SEND_STRING("[]" SS_TAP(X_LEFT));
+ reset_tap_dance (state);
+ }
+ else if (state->count == 4) {
+ SEND_STRING("{}" SS_TAP(X_LEFT));
+ reset_tap_dance (state);
+ }
+ else if (state->count >= 5) {
+ SEND_STRING("<>" SS_TAP(X_LEFT));
+ reset_tap_dance (state);
+ }
+}
+
+void safe_reset(qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count >= 3) {
+ // Reset the keyboard if you tap the key more than three times
+ reset_keyboard();
+ reset_tap_dance(state);
+ }
+}
+
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [TD_RESET] = ACTION_TAP_DANCE_FN(safe_reset),
+ [TD_NUM1] = ACTION_TAP_DANCE_DOUBLE(KC_1, KC_4),
+ [TD_NUM2] = ACTION_TAP_DANCE_DOUBLE(KC_2, KC_5),
+ [TD_NUM3] = ACTION_TAP_DANCE_DOUBLE(KC_3, KC_6),
+ [TD_QT1] = ACTION_TAP_DANCE_DOUBLE(KC_QUOT, MC_QT1),
+ [TD_QT2] = ACTION_TAP_DANCE_DOUBLE(LSFT(KC_QUOT), MC_QT2),
+ [TD_QT3] = ACTION_TAP_DANCE_DOUBLE(KC_GRV, MC_QT3),
+
+ [TD_EOL] = ACTION_TAP_DANCE_DOUBLE(KC_E, MC_EOL), // end of line
+ [TD_BOL] = ACTION_TAP_DANCE_DOUBLE(KC_A, MC_BOL), // beginning of line
+ [TD_NW] = ACTION_TAP_DANCE_DOUBLE(KC_F, MC_NW), // next word
+ [TD_PW] = ACTION_TAP_DANCE_DOUBLE(KC_B, MC_PW), // pevious word
+ [TD_DW] = ACTION_TAP_DANCE_DOUBLE(KC_W, MC_DW), // pevious word
+
+ [TD_SPC] = ACTION_TAP_DANCE_FN(td_parenthesis), // \(, (), [], {}, <>
+ [TD_PAR] = ACTION_TAP_DANCE_DOUBLE(KC_LPRN, MC_PAR), // ()
+ [TD_SQR] = ACTION_TAP_DANCE_DOUBLE(KC_LBRC, MC_SQR), // []
+ [TD_CUR] = ACTION_TAP_DANCE_DOUBLE(LSFT(KC_LCBR), MC_CUR),// {}
+ [TD_ABR] = ACTION_TAP_DANCE_DOUBLE(LSFT(KC_COMM), MC_ABR),//
+};
diff --git a/users/yet-another-developer/tap_dances.h b/users/yet-another-developer/tap_dances.h
new file mode 100644
index 0000000000..8afda817cb
--- /dev/null
+++ b/users/yet-another-developer/tap_dances.h
@@ -0,0 +1,26 @@
+#pragma once
+#include "yet-another-developer.h"
+
+#ifdef TAP_DANCE_ENABLE
+enum {
+ TD_RESET = 0,
+ TD_SPC, // for special function td_parenthesis testing
+ TD_NUM1, // compact gaming numpad
+ TD_NUM2, //
+ TD_NUM3, //
+ TD_TMX, // tmux control sequence
+ TD_EOL, // end of line
+ TD_BOL, // beginning of line
+ TD_NW, // next word
+ TD_PW, // pevious word
+ TD_DW, // delete word
+ TD_QT1, // single double quote for '
+ TD_QT2, // single double quote for "
+ TD_QT3, // single double quote for `
+ TD_PAR, // single double parenthesis
+ TD_CUR, // single double curly braces
+ TD_SQR, // single double square brackets
+ TD_ABR // single double angle brackets
+};
+#endif // TAP_DANCE_ENABLE
+void td_parenthesis (qk_tap_dance_state_t *state, void *user_data);
diff --git a/users/yet-another-developer/unicode.c b/users/yet-another-developer/unicode.c
new file mode 100644
index 0000000000..8b312deb66
--- /dev/null
+++ b/users/yet-another-developer/unicode.c
@@ -0,0 +1,62 @@
+#include "unicode.h"
+
+//#ifdef UNICODEMAP_ENABLE
+const uint32_t PROGMEM unicode_map[] = {
+ [BANG] = 0x0203D,// ‽
+ [IRONY] = 0x02E2E,// ⸮
+ [DEGREE] = 0x000B0,// °
+ [THINK] = 0x1F914,// 🤔
+ [GRIN] = 0x1F600,// �
+ [MONOCL] = 0x1F9D0,// 🧐
+ [DRUG0] = 0x1F92A,// 🤪
+ [DRUG1] = 0x1F974,// 🥴
+ [CLOWN] = 0x1F921,// 🤡
+ [MNDBLWN] = 0x1F92F,// 🤯
+ [MONEY] = 0x1F911,// 🤑
+ [SHTUP] = 0x1F910,// 🤐
+ [PARTY] = 0x1F973,// 🥳
+ [SMRK] = 0x1F60F,// 😏
+ [WEARY] = 0x1F629,// 😩
+ [UNAMU] = 0x1F612,// 😒
+ [SPY] = 0x1F575,//🕵
+ [DAFUQ] = 0x1F47A,// 👺
+ [FIST0] = 0x1F91B,// 🤛
+ [FIST1] = 0x1F91C,// 🤜
+ [FIST2] = 0x270A, // ✊
+ [FIST3] = 0x1F44A,// 👊
+ [WIFIHAND] = 0x1F44B,// 👋
+ [OKOK] = 0x1F44C,// 👌
+ [EFFU] = 0x1F595,// 🖕
+ [SPOCK] = 0x1F596,// 🖖
+ [INUP] = 0x1F446,// 👆
+ [THDN] = 0x1F44E,// 👎
+ [THUP] = 0x1F44D,// 👍
+ [TUMBLER] = 0x1F943,// 🥃
+ [DRAGON0] = 0x1F409,// 🐉
+ [DRAGON1] = 0x1F432,// 🐲
+ [TIGER0] = 0x1F405,// 🐅
+ [TIGER1] = 0x1F42F,// 🐯
+ [COOL] = 0x1F192,// 🆒
+ [UCHART] = 0x1F4C8,// 📈
+ [DCHART] = 0x1F4C9,// 📉
+ [BCHART] = 0x1F4CA,// 📊
+ [NOPRCY] = 0x1F572,// 🕲
+ [PRCY] = 0x1F571,// 🕱
+ [BBB] = 0x1F171,// 🅱
+ [POO] = 0x1F4A9,// 💩
+ [HUNDR] = 0x1F4AF,// 💯
+ [EGGPL] = 0x1F346,// 🍆
+ [WATER] = 0x1F4A6,// 💦
+ [LIT] = 0x1F525,// 🔥
+ [SNEK] = 0x1F40D,// 🐍
+ [PENGUIN] = 0x1F427,// 🐧
+ [BOAR] = 0x1F417,// 🐗
+ [MONKEY] = 0x1F412,// 🐒
+ [CHICK] = 0x1F425,// 🐥
+ [DASH] = 0x1F4A8,// 💨
+ [DIZZY] = 0x1F4AB,// 💫
+ [KEEB] = 0x1F5AE,// 🖮
+ [HOLE] = 0x1F573,// 🕳
+ [SAUCER] = 0x1F6F8// 🛸
+ };
+//#endif // UNICODEMAP_ENABLE
diff --git a/users/yet-another-developer/unicode.h b/users/yet-another-developer/unicode.h
new file mode 100644
index 0000000000..cb550243ee
--- /dev/null
+++ b/users/yet-another-developer/unicode.h
@@ -0,0 +1,67 @@
+#pragma once
+
+#include "quantum.h"
+
+void send_unicode_hex_string(const char* str);
+
+/* use X(n) to call the */
+#ifdef UNICODEMAP_ENABLE
+enum unicode_name {
+OKOK, //
+BANG, // ‽
+IRONY, // ⸮
+DEGREE, // °
+THINK, // 🤔
+GRIN, // �
+MONOCL, // 🧐
+DRUG0, // 🤪
+DRUG1, // 🥴
+CLOWN, // 🤡
+MNDBLWN, // 🤯
+MONEY, // 🤑
+SHTUP, // 🤐
+PARTY, // 🥳
+SMRK, // 😏
+WEARY, // 😩
+UNAMU, // 😒
+SPY, // 🕵
+DAFUQ, // 👺
+FIST0, // 🤛
+FIST1, // 🤜
+FIST2, // ✊
+FIST3, // 👊
+WIFIHAND, // 👌
+EFFU, // 🖕
+SPOCK, // 🖖
+INUP, // 👆
+THDN, // 👎
+THUP, // 👍
+TUMBLER, // 🥃
+DRAGON0, // 🐉
+DRAGON1, // 🐅
+TIGER0, // 🐅
+TIGER1, // 🐯
+COOL, // 🆒
+UCHART, // 📈
+DCHART, // 📉
+BCHART, // 📊
+NOPRCY, // 🕲
+PRCY, // 🕱
+BBB, // 🅱
+POO, // 💩
+HUNDR, // 💯
+EGGPL, // 🍆
+WATER, // 💦
+LIT, // 🔥
+SNEK, // 🐍
+PENGUIN, // 🐧
+BOAR, // 🐗
+MONKEY, // 🐒
+CHICK, // 🐥
+DASH, // 💨
+DIZZY, // 💫
+KEEB, // 🖮
+HOLE, // 🕳
+SAUCER // 🛸
+};
+#endif
diff --git a/users/yet-another-developer/wrappers.h b/users/yet-another-developer/wrappers.h
new file mode 100644
index 0000000000..cd21032a4e
--- /dev/null
+++ b/users/yet-another-developer/wrappers.h
@@ -0,0 +1,166 @@
+#pragma once
+#include "yet-another-developer.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.
+*/
+#if (!defined(LAYOUT) && defined(KEYMAP))
+# define LAYOUT KEYMAP
+#endif
+
+// clang-format off
+
+#define KEYMAP_wrapper(...) LAYOUT(__VA_ARGS__)
+#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
+#define LAYOUT_ortho_5x14_wrapper(...) LAYOUT_ortho_5x14(__VA_ARGS__)
+
+/* ---------- LEFT HAND ----------- ---------- RIGHT HAND ---------- */
+#define LAYOUT_ergodash_pretty( \
+ L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R06, \
+ L10, L11, L12, L13, L14, L15, L16, R10, R11, R12, R13, R14, R15, R16, \
+ L20, L21, L22, L23, L24, L25, L26, R20, R21, R22, R23, R24, R25, R26, \
+ L30, L31, L32, L33, L34, L35, R31, R32, R33, R34, R35, R36, \
+ L40, L41, L42, L43, R43, R44, R45, R46, \
+ L36, R30, \
+ L44, L45, L46, R40, R41, R42 \
+ ) \
+ { \
+ { L00, L01, L02, L03, L04, L05, L06 }, \
+ { L10, L11, L12, L13, L14, L15, L16 }, \
+ { L20, L21, L22, L23, L24, L25, L26 }, \
+ { L30, L31, L32, L33, L34, L35, L36 }, \
+ { L40, L41, L42, L43, L44, L45, L46 }, \
+ { R06, R05, R04, R03, R02, R01, R00 }, \
+ { R16, R15, R14, R13, R12, R11, R10 }, \
+ { R26, R25, R24, R23, R22, R21, R20 }, \
+ { R36, R35, R34, R33, R32, R31, R30 }, \
+ { R46, R45, R44, R43, R42, R41, R40 } \
+ }
+
+/*
+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.
+*/
+
+#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
+#define _________________QWERTY_R3_________________ KC_N, KC_M, KC_COMM, KC_DOT, KC_SLASH
+
+
+#ifdef TAP_DANCE_ENABLE
+ #define _________________COLEMAK_L1________________ KC_Q, KC_W, KC_F, KC_P, KC_G
+ #define _________________COLEMAK_L2________________ KC_BOL, 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
+ #define _________________COLEMAK_R3________________ KC_K, KC_M, KC_COMM, KC_DOT, KC_SLASH
+#else
+ #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
+ #define _________________COLEMAK_R3________________ KC_K, KC_M, KC_COMM, KC_DOT, KC_SLASH
+#endif
+
+
+
+
+#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
+#define _________________DVORAK_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
+#define _________________WORKMAN_R3________________ KC_K, KC_L, KC_COMM, KC_DOT, KC_SLASH
+
+// #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
+
+
+#ifdef UNICODE_ENABLE
+#define _______________UNICODE_L1__________________ UC_DISA,UC_DISA, UC_DISA, UC_DISA, UC_DISA
+#define _______________UNICODE_L2__________________ UC_DISA,UC_DISA, UC_DISA, UC_DISA, UC_DISA
+#define _______________UNICODE_L3__________________ UC_DISA,UC_DISA, UC_DISA, UC_DISA, UC_DISA
+
+#define _______________UNICODE_R1__________________ UC_SHRG, UC_SHRG, UC_SHRG, UC_SHRG, UC_SHRG
+#define _______________UNICODE_R2__________________ UC_SHRG, UC_SHRG, UC_SHRG, UC_SHRG, UC_SHRG
+#define _______________UNICODE_R3__________________ UC_SHRG, UC_SHRG, UC_SHRG, UC_SHRG, UC_SHRG
+#endif
+
+#ifdef UNICODEMAP_ENABLE
+#define _______________UNICODE_L1__________________ X(SMRK), X(THINK), X(CLOWN), X(HUNDR), X(BANG)
+#define _______________UNICODE_L2__________________ X(GRIN), X(MONKEY), X(OKOK), X(EGGPL), X(LIT)
+#define _______________UNICODE_L3__________________ X(WEARY), X(UNAMU), X(EFFU), X(MONOCL), X(IRONY)
+
+#define _______________UNICODE_R1__________________ X(DRUG0), X(THUP), X(INUP), X(DIZZY), X(COOL)
+#define _______________UNICODE_R2__________________ X(FIST0), X(FIST2),X(FIST3),X(FIST1), X(OKOK)
+#define _______________UNICODE_R3__________________ X(MNDBLWN), X(THDN), X(SPOCK),X(HOLE), X(DASH)
+#endif
+
+#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__________________ OS_UNI, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR
+#define _________________LOWER_R3__________________ _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+
+
+
+#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_HOME, KC_PGDN, KC_PGUP, KC_END
+
+
+
+#define _________________ADJUST_L1_________________ ___________________BLANK___________________
+#define _________________ADJUST_L2_________________ _________________FUNC_LEFT_________________
+#define _________________ADJUST_L3_________________ _______, QWERTY, COLEMAK, DVORAK, WORKMAN
+
+#define _________________ADJUST_R1_________________ KC_SEC1, KC_SEC2, KC_SEC3, KC_SEC4, KC_SEC5
+#define _________________ADJUST_R2_________________ _________________FUNC_RIGHT________________
+#define _________________ADJUST_R3_________________ KC_MUTE, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT
+
+// clang-format on
diff --git a/users/yet-another-developer/yet-another-developer.c b/users/yet-another-developer/yet-another-developer.c
new file mode 100644
index 0000000000..b729c06219
--- /dev/null
+++ b/users/yet-another-developer/yet-another-developer.c
@@ -0,0 +1,160 @@
+#include "quantum.h"
+#include "yet-another-developer.h"
+
+userspace_config_t userspace_config;
+
+#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
+ #define YAD_UNICODE_MODE UC_WIN
+#else
+// set to 2 for UC_WIN, set to 4 for UC_WINC
+ #define YAD_UNICODE_MODE 2
+#endif
+
+
+bool mod_key_press_timer(uint16_t code, uint16_t mod_code, bool pressed) {
+ static uint16_t this_timer;
+ if (pressed) {
+ this_timer = timer_read();
+ } else {
+ if (timer_elapsed(this_timer) < TAPPING_TERM) {
+ tap_code(code);
+ } else {
+ register_code(mod_code);
+ tap_code(code);
+ unregister_code(mod_code);
+ }
+ }
+ return false;
+}
+
+bool mod_key_press(uint16_t code, uint16_t mod_code, bool pressed, uint16_t this_timer) {
+ if (pressed) {
+ this_timer = timer_read();
+ } else {
+ if (timer_elapsed(this_timer) < TAPPING_TERM) {
+ tap_code(code);
+ } else {
+ register_code(mod_code);
+ tap_code(code);
+ unregister_code(mod_code);
+ }
+ }
+ return false;
+}
+
+// Add reconfigurable functions here, for keymap customization
+// This allows for a global, userspace functions, and continued
+// customization of the keymap. Use _keymap instead of _user
+// functions in the keymaps
+__attribute__ ((weak))
+void matrix_init_keymap(void) {}
+
+// Call user matrix init, set default RGB colors and then
+// call the keymap's init function
+void matrix_init_user(void) {
+ userspace_config.raw = eeconfig_read_user();
+
+ #if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
+ set_unicode_input_mode(YAD_UNICODE_MODE);
+ get_unicode_input_mode();
+ #endif //UNICODE_ENABLE
+
+ matrix_init_keymap();
+}
+
+__attribute__((weak))
+void keyboard_post_init_keymap(void) {}
+
+void keyboard_post_init_user(void) {
+#ifdef RGBLIGHT_ENABLE
+ keyboard_post_init_rgb();
+#endif
+ keyboard_post_init_keymap();
+}
+
+__attribute__((weak))
+void suspend_power_down_keymap(void) {}
+
+void suspend_power_down_user(void) {
+ suspend_power_down_keymap();
+}
+
+__attribute__((weak))
+void suspend_wakeup_init_keymap(void) {}
+
+void suspend_wakeup_init_user(void) {
+ suspend_wakeup_init_keymap();
+}
+
+__attribute__((weak))
+void matrix_scan_keymap(void) {}
+
+__attribute__ ((weak))
+void matrix_scan_user(void){
+
+#ifdef TAP_DANCE_ENABLE // Run Diablo 3 macro checking code.
+// run_diablo_macro_check();
+#endif // TAP_DANCE_ENABLE
+
+#ifdef RGBLIGHT_ENABLE
+ matrix_scan_rgb();
+#endif // RGBLIGHT_ENABLE
+
+ matrix_scan_keymap();
+}
+
+__attribute__((weak))
+layer_state_t layer_state_set_keymap(layer_state_t state) {
+ return state;
+}
+
+// on layer change, no matter where the change was initiated
+// Then runs keymap's layer change check
+layer_state_t layer_state_set_user(layer_state_t state) {
+ state = update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST);
+#ifdef RGBLIGHT_ENABLE
+ state = layer_state_set_rgb(state);
+#endif // RGBLIGHT_ENABLE
+ return layer_state_set_keymap(state);
+}
+
+__attribute__((weak))
+layer_state_t default_layer_state_set_keymap(layer_state_t state) {
+ return state;
+}
+
+// Runs state check and changes underglow color and animation
+layer_state_t default_layer_state_set_user(layer_state_t state) {
+ state = default_layer_state_set_keymap(state);
+#if 0
+#ifdef RGBLIGHT_ENABLE
+ state = default_layer_state_set_rgb(state);
+#endif // RGBLIGHT_ENABLE
+#endif
+ return state;
+}
+
+__attribute__ ((weak))
+void led_set_keymap(uint8_t usb_led) {}
+
+// Any custom LED code goes here.
+// So far, I only have keyboard specific code,
+// So nothing goes here.
+void led_set_user(uint8_t usb_led) {
+ led_set_keymap(usb_led);
+}
+
+__attribute__ ((weak))
+void eeconfig_init_keymap(void) {}
+
+void eeconfig_init_user(void) {
+ userspace_config.raw = 0;
+ userspace_config.rgb_layer_change = true;
+ eeconfig_update_user(userspace_config.raw);
+ #if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
+ set_unicode_input_mode(YAD_UNICODE_MODE);
+ get_unicode_input_mode();
+ #else
+ eeprom_update_byte(EECONFIG_UNICODEMODE, YAD_UNICODE_MODE);
+ #endif
+}
diff --git a/users/yet-another-developer/yet-another-developer.h b/users/yet-another-developer/yet-another-developer.h
new file mode 100644
index 0000000000..e0d02f707f
--- /dev/null
+++ b/users/yet-another-developer/yet-another-developer.h
@@ -0,0 +1,87 @@
+#pragma once
+#include "quantum.h"
+#include "version.h"
+#include "eeprom.h"
+#include "wrappers.h"
+#include "process_records.h"
+
+#ifdef TAP_DANCE_ENABLE
+ #include "tap_dances.h"
+ #define KC_TMX TD(TD_TMX) // tap1: 't' tap2: <CTL>+b
+ #define KC_EOL TD(TD_EOL) // tap1: 'e' tap2: <CTL>+e
+ #define KC_BOL TD(TD_BOL) // tap1: 'a' tap2: <CTL>+a
+ #define KC_NW TD(TD_NW) // tap1: 'f' tap2: <ALT>+f
+ #define KC_PW TD(TD_PW) // tap1: 'b' tap2: <ALT>+b
+ #define KC_DW TD(TD_DW) // tap1: 'w' tap2: <CTL>+w
+#endif //!TAP_DANCE_ENABLE
+#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
+ #include "rgb_stuff.h"
+#endif
+#if defined(UNICODEMAP_ENABLE) || defined(UNICODE_ENABLE)
+ #include "unicode.h"
+#endif //!UNICODE_ENABLE
+
+#define MC_BOL LCTL(KC_A) // jump to beginning of line
+#define MC_EOL LCTL(KC_E) // jump to end of line
+#define MC_NW LALT(KC_F) // next word
+#define MC_PW LALT(KC_B) // previous word
+#define MC_DW LCTL(KC_W) // delete word
+
+/* Define layer names */
+enum userspace_layers {
+ _QWERTY = 0,
+ _NUMLOCK = 0,
+ _COLEMAK,
+ _DVORAK,
+ _WORKMAN,
+ _UNICODE,
+ _MODS, /* layer 8 */
+ _MACROS,
+ _MEDIA,
+ _LOWER,
+ _RAISE,
+ _ADJUST,
+};
+
+bool mod_key_press_timer(uint16_t code, uint16_t mod_code, bool pressed);
+bool mod_key_press(uint16_t code, uint16_t mod_code, bool pressed, uint16_t this_timer);
+void matrix_init_keymap(void);
+void suspend_power_down_keymap(void);
+void suspend_wakeup_init_keymap(void);
+void matrix_scan_keymap(void);
+layer_state_t layer_state_set_keymap(layer_state_t state);
+layer_state_t default_layer_state_set_keymap(layer_state_t state);
+void led_set_keymap(uint8_t usb_led);
+void eeconfig_init_keymap(void);
+
+typedef union {
+ uint32_t raw;
+ struct {
+ bool rgb_layer_change :1;
+ bool is_overwatch :1;
+ bool nuke_switch :1;
+ uint8_t unicode_mod :4;
+ bool swapped_numbers :1;
+ };
+} userspace_config_t;
+
+extern userspace_config_t userspace_config;
+
+/*
+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
+
+