summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Racine <mailto.danielracine@gmail.com>2020-05-07 00:01:19 -0400
committerGitHub <noreply@github.com>2020-05-06 21:01:19 -0700
commit923bad46f93d9dc9b6d8e5c6694a7fdd745e0fde (patch)
treea730359f49c3e6af8dd6b0b4c55d1e60a9c7177d
parent19513fac5ff7543d116c2808822420d9ac12906f (diff)
[Keymap] New keymap layout for dztech/dz65rgb/keymaps (#8199)
* New keymap layout for dztech/dz65rgb/keymaps * New keymap layout for dztech/dz65rgb/keymaps - Conding conventions fixes * Fix typo in Leader Key table * PR #8199 Feedback Commit #1 * Fixed data types and function names - Simplified accent macros by removing repetition - Added selection wrap macros - readme.md doc updated with changes * PR #8199 second feedback commit - Clarified function names, variables names and comments * Fix: accent output fix _grave <==> _circumflex * dry fixes on led set_color with hsv and led blinking code blocks
-rw-r--r--keyboards/dztech/dz65rgb/keymaps/drootz/config.h52
-rw-r--r--keyboards/dztech/dz65rgb/keymaps/drootz/keymap.c757
-rw-r--r--keyboards/dztech/dz65rgb/keymaps/drootz/readme.md210
-rw-r--r--keyboards/dztech/dz65rgb/keymaps/drootz/rules.mk11
4 files changed, 1030 insertions, 0 deletions
diff --git a/keyboards/dztech/dz65rgb/keymaps/drootz/config.h b/keyboards/dztech/dz65rgb/keymaps/drootz/config.h
new file mode 100644
index 0000000000..5810507975
--- /dev/null
+++ b/keyboards/dztech/dz65rgb/keymaps/drootz/config.h
@@ -0,0 +1,52 @@
+#pragma once
+
+#define LEADER_PER_KEY_TIMING
+#define LEADER_TIMEOUT 425
+#define TAP_HOLD_CAPS_DELAY 80
+
+#ifdef RGB_MATRIX_ENABLE
+/* Reset default from dz65rgb/v2 config.h */
+# undef DISABLE_RGB_MATRIX_SPLASH
+# undef DISABLE_RGB_MATRIX_SOLID_SPLASH
+# undef RGB_MATRIX_LED_FLUSH_LIMIT
+# undef RGB_MATRIX_STARTUP_MODE
+# undef RGB_MATRIX_MAXIMUM_BRIGHTNESS
+# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 255
+# define RGB_MATRIX_LED_FLUSH_LIMIT 16 // default: 26
+# define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_TYPING_HEATMAP
+# define RGB_MATRIX_FRAMEBUFFER_EFFECTS
+# define RGB_MATRIX_STARTUP_HUE 10
+# define RGB_MATRIX_STARTUP_SAT 255
+# define RGB_MATRIX_STARTUP_VAL 200
+# define RGB_MATRIX_STARTUP_SPD 75
+/* Active RBG Modes */
+/* # define DISABLE_RGB_MATRIX_TYPING_HEATMAP // How hot is your WPM! */
+/* # define DISABLE_RGB_MATRIX_SPLASH // Full gradient & value pulse away from a single key hit then fades value out */
+/* # define DISABLE_RGB_MATRIX_SOLID_SPLASH // Hue & value pulse away from a single key hit then fades value out */
+/* Disabling to optimize firmware size */
+# define DISABLE_RGB_MATRIX_ALPHAS_MODS // Static dual hue, speed is hue for secondary hue
+# define DISABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT // Static gradient left to right, speed controls how much gradient changes
+# define DISABLE_RGB_MATRIX_BREATHING // Single hue brightness cycling animation
+# define DISABLE_RGB_MATRIX_BAND_VAL // Single hue band fading brightness scrolling left to right
+# define DISABLE_RGB_MATRIX_BAND_PINWHEEL_VAL // Single hue 3 blade spinning pinwheel fades brightness
+# define DISABLE_RGB_MATRIX_BAND_SPIRAL_VAL // Single hue spinning spiral fades brightness
+# define DISABLE_RGB_MATRIX_CYCLE_ALL // Full keyboard solid hue cycling through full gradient
+# define DISABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT // Full gradient scrolling left to right
+# define DISABLE_RGB_MATRIX_CYCLE_UP_DOWN // Full gradient scrolling top to bottom
+# define DISABLE_RGB_MATRIX_CYCLE_OUT_IN // Full gradient scrolling out to in
+# define DISABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL // Full dual gradients scrolling out to in
+# define DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON // Full gradent Chevron shapped scrolling left to right
+# define DISABLE_RGB_MATRIX_CYCLE_PINWHEEL // Full gradient spinning pinwheel around center of keyboard
+# define DISABLE_RGB_MATRIX_CYCLE_SPIRAL // Full gradient spinning spiral around center of keyboard
+# define DISABLE_RGB_MATRIX_DUAL_BEACON // Full gradient spinning around center of keyboard
+# define DISABLE_RGB_MATRIX_RAINBOW_BEACON // Full tighter gradient spinning around center of keyboard
+# define DISABLE_RGB_MATRIX_RAINBOW_PINWHEELS // Full dual gradients spinning two halfs of keyboard
+# define DISABLE_RGB_MATRIX_RAINDROPS // Randomly changes a single key's hue
+# define DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS // Randomly changes a single key's hue and saturation
+# define DISABLE_RGB_MATRIX_SOLID_REACTIVE // Static single hue, pulses keys hit to shifted hue then fades to current hue
+#endif /* RBG MATRIX */
+
+/* Firmware size Optimizations */
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+#define NO_ACTION_ONESHOT
diff --git a/keyboards/dztech/dz65rgb/keymaps/drootz/keymap.c b/keyboards/dztech/dz65rgb/keymaps/drootz/keymap.c
new file mode 100644
index 0000000000..c313f467e3
--- /dev/null
+++ b/keyboards/dztech/dz65rgb/keymaps/drootz/keymap.c
@@ -0,0 +1,757 @@
+#include QMK_KEYBOARD_H
+
+/**************** SOME GLOBALS *********************/
+
+bool onMac = false;
+bool isLeader = false;
+bool isBlinking = false;
+bool isRecording = false;
+bool isPlaying = false;
+const float led_dim_ratio = 0.50;
+static uint16_t blink_cycle_timer,
+ blink_fade_in_timer,
+ blink_fade_out_timer,
+ macro_one_play_timer,
+ macro_two_play_timer,
+ macro_play_blink_timer = 2000;
+static uint8_t fade_in_step_counter,
+ fade_out_step_counter,
+ blink_hsv_value;
+
+/**************** LED BLINK HELPER FUNCTIONS *********************/
+
+/*
+Function to set color with hsv arguments
+- "hue", "sat" and "val" arguments above 255 will get value from rgb matrix config
+- "val_ratio" is used to adjust brightness ratio
+*/
+void rgb_matrix_set_color_hsv(uint8_t led, uint16_t hue, uint16_t sat, uint16_t val, float val_ratio) {
+ const uint8_t h = hue <= 255 ? hue : rgb_matrix_config.hsv.h;
+ const uint8_t s = sat <= 255 ? sat : rgb_matrix_config.hsv.s;
+ const uint8_t v = val <= 255 ? val * val_ratio : rgb_matrix_config.hsv.v * val_ratio;
+ HSV hsv_in = {h, s, v};
+ RGB rgb_out = hsv_to_rgb(hsv_in);
+ rgb_matrix_set_color(led, rgb_out.r, rgb_out.g, rgb_out.b);
+}
+
+void reset_blink_cycle(void) {
+ blink_cycle_timer = timer_read();
+ blink_fade_in_timer = timer_read();
+ blink_fade_out_timer = timer_read();
+ blink_hsv_value = 0;
+ fade_in_step_counter = 0;
+ fade_out_step_counter = 0;
+}
+
+void reset_blink_status(void) {
+ isRecording = false;
+ isPlaying = false;
+ isBlinking = false;
+}
+
+void get_this_led_blinking(uint8_t led_index, bool speed, uint8_t hue, uint8_t sat) {
+ const uint16_t static_on_time = speed ? 200 : 500;
+ const uint16_t static_off_time = speed ? 200 : 500;
+ const uint8_t fade_timing = speed ? 100 : 150;
+ const uint8_t fade_step = speed ? 10 : 15;
+ const uint8_t fade_value_step_size = rgb_matrix_config.hsv.v / fade_step;
+ const uint8_t fade_cycle_time_elapsed = fade_timing / fade_step;
+ if (timer_elapsed(blink_cycle_timer) < static_on_time) {
+ if (timer_elapsed(blink_fade_in_timer) > fade_cycle_time_elapsed && fade_in_step_counter < fade_step) {
+ blink_hsv_value = blink_hsv_value + fade_value_step_size;
+ fade_in_step_counter = fade_in_step_counter + 1;
+ blink_fade_in_timer = timer_read();
+ }
+ } else {
+ if (timer_elapsed(blink_fade_out_timer) > fade_cycle_time_elapsed && fade_out_step_counter < fade_step) {
+ blink_hsv_value = blink_hsv_value - fade_value_step_size;
+ fade_out_step_counter = fade_out_step_counter + 1;
+ blink_fade_out_timer = timer_read();
+ }
+ }
+
+ rgb_matrix_set_color_hsv(led_index, hue, sat, blink_hsv_value, 0.75);
+
+ if (timer_elapsed(blink_cycle_timer) > static_on_time + static_off_time) {
+ reset_blink_cycle();
+ }
+}
+
+
+/**************** LAYOUT *********************/
+
+/*
+[LEDS]
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
+15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29
+30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43
+44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57
+58, 59, 60, 61, 62, 63, 64, 65, 66, 67
+
+[KEYS]
+ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -, =, BCK, INS
+TAB, Q, W, E, R, T, Y, U, I, O, P, [, ], \,PGUP
+CPS, A, S, D, F, G, H, J, K, L, COL, QOT, RETURN,PGDN
+SFT, Z, X, C, V, B, N, M, COM, DOT, SLS, SHIFT, UP, DEL
+CTL, GUI, ALT, SPACEBAR, ALT, FN, CTL, LFT, DWN, RIT
+*/
+
+enum layers {
+ _MAIN,
+ _MAC,
+ _FN
+}
+
+const layers_leds_map[] = {
+ [_MAIN] = 45,
+ [_MAC] = 46,
+ [_FN] = 63
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_MAIN] = LAYOUT_65_ansi(
+ KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
+ KC_LEAD, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [_MAC] = LAYOUT_65_ansi(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_LALT, KC_LGUI, KC_TRNS, KC_TRNS, MO(_FN), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+ [_FN] = LAYOUT_65_ansi(
+ DYN_REC_STOP, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_NO,
+ KC_TRNS, KC_MUTE, KC_VOLU, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RGB_SAD, RGB_SAI, DYN_MACRO_PLAY2, DYN_REC_START2,
+ KC_TRNS, KC_BRID, KC_VOLD, KC_BRIU, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RGB_HUD, RGB_HUI, DYN_MACRO_PLAY1, DYN_REC_START1,
+ KC_TRNS, TO(_MAIN), TO(_MAC), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RGB_SPD, RGB_SPI, KC_TRNS, RGB_VAI, KC_NO,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_RMOD, RGB_VAD, RGB_MOD
+ ),
+};
+
+//**************** MATRIX SCANS *********************//
+
+void rgb_matrix_indicators_user(void) {
+
+ #ifdef RGB_MATRIX_ENABLE
+
+ /*Ensure some leds don't completeley turn off if hsv value setting is below 100 in the rgb matrix config */
+ const uint8_t led_constant_val = rgb_matrix_config.hsv.v < 100 ? 100 : rgb_matrix_config.hsv.v;
+
+ /* CapsLock LED indicator */
+ if (IS_HOST_LED_ON(USB_LED_CAPS_LOCK)) {
+ rgb_matrix_set_color_hsv(30, 999, 0, led_constant_val, 0.75); // WHITE
+ }
+
+ /* Current layer LED indicator */
+ rgb_matrix_set_color_hsv(layers_leds_map[get_highest_layer(layer_state)], 999, 0, led_constant_val, led_dim_ratio); // WHITE
+
+ /* Leader Key LED under-glow */
+ if (isLeader) {
+ rgb_matrix_set_color_hsv(14, 999, 999, 999, 1); // CONFIG
+ rgb_matrix_set_color_hsv(30, 999, 999, 999, 1); // CONFIG
+ } else {
+ rgb_matrix_set_color_hsv(14, 999, 999, 999, led_dim_ratio); // CONFIG
+ }
+
+ /* Blinking LED indicator when recording Dynamic Macro */
+ if (isRecording && isBlinking) {
+ get_this_led_blinking(0, false, 0, 255);
+ }
+
+ /* Blinking LED indicator when playing Dynamic Macro */
+ if (isPlaying && isBlinking) {
+ if (timer_elapsed(macro_one_play_timer) < macro_play_blink_timer || timer_elapsed(macro_two_play_timer) < macro_play_blink_timer) {
+ get_this_led_blinking(0, true, 85, 255);
+ } else {
+ if (isBlinking && isPlaying) {
+ reset_blink_status();
+ reset_blink_cycle();
+ }
+ }
+ }
+
+ switch (biton32(layer_state)) {
+ case _FN:
+ /* Dynamic Macro LED indicator */
+ if (isRecording) {
+ rgb_matrix_set_color_hsv(0, 0, 999, 999, 1); /* RED macro stop */
+ } else {
+ rgb_matrix_set_color_hsv(43, 0, 999, 999, led_dim_ratio); /* RED macro 1 record */
+ rgb_matrix_set_color_hsv(29, 0, 999, 999, led_dim_ratio); /* RED macro 2 record */
+ rgb_matrix_set_color_hsv(42, 85, 999, 999, led_dim_ratio); /* GREEN macro 1 play */
+ rgb_matrix_set_color_hsv(28, 85, 999, 999, led_dim_ratio); /* GREEN macro 2 play */
+ }
+ /* Layer LED indicators */
+ rgb_matrix_set_color_hsv(45, 999, 0, led_constant_val, led_dim_ratio); /* WHITE Layer _MAIN */
+ rgb_matrix_set_color_hsv(46, 999, 0, led_constant_val, led_dim_ratio); /* WHITE Layer _MAC */
+ break;
+ }
+
+ #endif /* RGB_MATRIX */
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ bool pressed = record->event.pressed;
+ if (pressed) {
+ switch (keycode) {
+ case TO(_MAC):
+ onMac = true;
+ break;
+ case TO(_MAIN):
+ onMac = false;
+ break;
+ }
+ }
+ return true;
+}
+
+//**************** LEADER *********************//
+
+#ifdef LEADER_ENABLE
+
+/******* FRENCH ACCENT HELPER FUNCTIONS & DECLARATIONS *************/
+/*Most comonly used accents only*/
+
+enum french_letter {
+ _A,
+ _E,
+ _I,
+ _O,
+ _U
+};
+
+const uint8_t french_letter_index[5] = {
+ [_A] = 0,
+ [_E] = 1,
+ [_I] = 2,
+ [_O] = 3,
+ [_U] = 4
+};
+
+enum french_accent {
+ _CIRCUMFLEX,
+ _GRAVE,
+ _ACUTE
+};
+
+const uint8_t french_accent_index[3] = {
+ [_CIRCUMFLEX] = 0,
+ [_GRAVE] = 1,
+ [_ACUTE] = 2
+};
+
+/*
+This represent unicode decimal values
+Each index will be mapped to numpad keycode to out put the correct sequence
+All codes in this array should be of size 3
+All accent codes have the same index position as in the french_accent_index Array
+*/
+const uint8_t french_decimal_unicodes[5][3][2] = { /*[Letter][Accent][Case]*/
+ {
+ {
+ 131, // â
+ 194 // Â
+ },{
+ 133, // à
+ 192 // À
+ }
+ },{
+ {
+ 136, // ê
+ 202 // Ê
+ },{
+ 138, // è
+ 200 // È
+ },{
+ 130, // é
+ 201 // É
+ }
+ },{
+ {
+ 140, // î
+ 206 // Î
+ }
+ },{
+ {
+ 147, // ô
+ 212 // Ô
+ }
+ },{
+ {
+ 150, // û
+ 219 // Û
+ },{
+ 151, // ù
+ 217 // Ù
+ }
+ }
+};
+
+void break_int_in_array(uint8_t int_code, uint8_t size, uint8_t *array) {
+ uint8_t i;
+ i = size;
+ while (i--) {
+ array[i] = int_code%10;
+ int_code /= 10;
+ }
+}
+
+/*
+Function meant to be used in Leader Key macros to output most commonly used french accents
+This is designed and work on an English language keyboard setting on both Windows and Mac
+=> accept french_letter and french_accent enum's as argument
+*/
+void send_french_accent(uint8_t letter, uint8_t accent) {
+
+ bool isCaps;
+ uint8_t decimal_unicode_in;
+ uint8_t decimal_unicode_size = 3;
+ uint8_t decimal_unicode_out[decimal_unicode_size];
+
+ /*Map to numpad keycodes*/
+ const uint16_t numpad_key_map[10] = {
+ KC_P0, KC_P1, KC_P2, KC_P3, KC_P4, KC_P5, KC_P6, KC_P7, KC_P8, KC_P9
+ };
+
+ /*Map to letter keycodes*/
+ const uint16_t french_letter_key_map[5] = {
+ KC_A, KC_E, KC_I, KC_O, KC_U
+ };
+
+ /*Map to mod keys for French Mac shortcuts*/
+ const uint16_t osx_mod_key_map[3] = {
+ KC_I, // _CIRCUMFLEX
+ KC_GRAVE, // _GRAVE
+ KC_E // _ACUTE
+ };
+
+ /*
+ Function to tap the correct keycodes in sequence for the
+ "Windows Alt Code" requested, aka Decimal Unicodes
+ */
+ void tap_win_alt_code(void) {
+ if (isCaps) {
+ tap_code(numpad_key_map[0]); // Leading 0 on all upper case "Windows alt codes"
+ }
+ for (int i = 0; i < decimal_unicode_size; ++i) {
+ tap_code(numpad_key_map[decimal_unicode_out[i]]);
+ }
+ }
+
+ isCaps = IS_HOST_LED_ON(USB_LED_CAPS_LOCK) ? true : false;
+
+ if (onMac) {
+ if (isCaps) {
+ SEND_STRING(SS_TAP(X_CAPSLOCK));
+ register_code(KC_LALT);
+ tap_code(osx_mod_key_map[accent]);
+ unregister_code(KC_LALT);
+ register_code(KC_LSFT);
+ tap_code(french_letter_key_map[letter]);
+ unregister_code(KC_LSFT);
+ tap_code(KC_CAPS);
+ } else {
+ register_code(KC_LALT);
+ tap_code(osx_mod_key_map[accent]);
+ unregister_code(KC_LALT);
+ tap_code(french_letter_key_map[letter]);
+ }
+ } else {
+ /*get the correct decimal unicode*/
+ decimal_unicode_in = isCaps ? french_decimal_unicodes[letter][accent][1] : french_decimal_unicodes[letter][accent][0];
+ break_int_in_array(decimal_unicode_in, decimal_unicode_size, decimal_unicode_out);
+ register_code(KC_LALT);
+ tap_win_alt_code();
+ unregister_code(KC_LALT);
+ }
+}
+
+/*Couple functions used to output the same macro on two different sequences*/
+
+/* (|) */
+void ldrkey_send_paranthesis_wrap_ini(void) {
+ SEND_STRING("()" SS_TAP(X_LEFT));
+}
+
+/* (X) */
+void ldrkey_send_paranthesis_wrap_word(void) {
+ onMac ? SEND_STRING(SS_LALT(SS_TAP(X_LEFT)) "(" SS_LALT(SS_TAP(X_RIGHT)) ")") : SEND_STRING(SS_LCTL(SS_TAP(X_LEFT)) "(" SS_LCTL(SS_TAP(X_RIGHT)) ")");
+}
+
+/* (selection) */
+void ldrkey_send_paranthesis_wrap_selection(void) {
+ onMac ? SEND_STRING(SS_LGUI(SS_TAP(X_X)) "()" SS_TAP(X_LEFT) SS_LGUI(SS_TAP(X_V)) SS_TAP(X_RIGHT)) : SEND_STRING(SS_LCTL(SS_TAP(X_X)) "()" SS_TAP(X_LEFT) SS_LCTL(SS_TAP(X_V)) SS_TAP(X_RIGHT));
+}
+
+/* [|] */
+void ldrkey_send_bracket_wrap_ini(void) {
+ SEND_STRING("[]" SS_TAP(X_LEFT));
+}
+
+/* [X] */
+void ldrkey_send_bracket_wrap_word(void) {
+ onMac ? SEND_STRING(SS_LALT(SS_TAP(X_LEFT)) "[" SS_LALT(SS_TAP(X_RIGHT)) "]") : SEND_STRING(SS_LCTL(SS_TAP(X_LEFT)) "[" SS_LCTL(SS_TAP(X_RIGHT)) "]");
+}
+
+/* [selection] */
+void ldrkey_send_bracket_wrap_selection(void) {
+ onMac ? SEND_STRING(SS_LGUI(SS_TAP(X_X)) "[]" SS_TAP(X_LEFT) SS_LGUI(SS_TAP(X_V)) SS_TAP(X_RIGHT)) : SEND_STRING(SS_LCTL(SS_TAP(X_X)) "[]" SS_TAP(X_LEFT) SS_LCTL(SS_TAP(X_V)) SS_TAP(X_RIGHT));
+}
+
+/* {|} */
+void ldrkey_send_curlybrace_wrap_ini(void) {
+ SEND_STRING("{}" SS_TAP(X_LEFT));
+}
+
+/* {X} */
+void ldrkey_send_curlybrace_wrap_word(void) {
+ onMac ? SEND_STRING(SS_LALT(SS_TAP(X_LEFT)) "{" SS_LALT(SS_TAP(X_RIGHT)) "}") : SEND_STRING(SS_LCTL(SS_TAP(X_LEFT)) "{" SS_LCTL(SS_TAP(X_RIGHT)) "}");
+}
+
+/* {selection} */
+void ldrkey_send_curlybrace_wrap_selection(void) {
+ onMac ? SEND_STRING(SS_LGUI(SS_TAP(X_X)) "{}" SS_TAP(X_LEFT) SS_LGUI(SS_TAP(X_V)) SS_TAP(X_RIGHT)) : SEND_STRING(SS_LCTL(SS_TAP(X_X)) "{}" SS_TAP(X_LEFT) SS_LCTL(SS_TAP(X_V)) SS_TAP(X_RIGHT));
+}
+
+LEADER_EXTERNS();
+
+void matrix_scan_user(void)
+{
+ LEADER_DICTIONARY()
+ {
+ leading = false;
+ leader_end();
+
+ /* Sequences on layer _MAIN & _MAC */
+ /* éÉ => LdrKey > / */
+ SEQ_ONE_KEY(KC_SLSH) {
+ send_french_accent(_E, _ACUTE);
+ }
+ /* àÀ => LdrKey > A */
+ SEQ_ONE_KEY(KC_A) {
+ send_french_accent(_A, _GRAVE);
+ }
+ /* èÈ => LdrKey > E */
+ SEQ_ONE_KEY(KC_E) {
+ send_french_accent(_E, _GRAVE);
+ }
+ /* ùÙ => LdrKey > U */
+ SEQ_ONE_KEY(KC_U) {
+ send_french_accent(_U, _GRAVE);
+ }
+ /* â => LdrKey > A > A */
+ SEQ_TWO_KEYS(KC_A, KC_A) {
+ send_french_accent(_A, _CIRCUMFLEX);
+ }
+ /* êÊ => LdrKey > E > E */
+ SEQ_TWO_KEYS(KC_E, KC_E) {
+ send_french_accent(_E, _CIRCUMFLEX);
+ }
+ /* îÎ => LdrKey > I > I */
+ SEQ_TWO_KEYS(KC_I, KC_I) {
+ send_french_accent(_I, _CIRCUMFLEX);
+ }
+ /* ôÔ => LdrKey > O > O */
+ SEQ_TWO_KEYS(KC_O, KC_O) {
+ send_french_accent(_O, _CIRCUMFLEX);
+ }
+ /* ûÛ => LdrKey > U > U */
+ SEQ_TWO_KEYS(KC_U, KC_U) {
+ send_french_accent(_U, _CIRCUMFLEX);
+ }
+ /* çÇ => LdrKey > C */
+ SEQ_ONE_KEY(KC_C) {
+ if (onMac) {
+ SEND_STRING(SS_LALT("c"));
+ } else {
+ IS_HOST_LED_ON(USB_LED_CAPS_LOCK) ? SEND_STRING(SS_DOWN(X_LALT) SS_TAP(X_P1) SS_TAP(X_P2) SS_TAP(X_P8) SS_UP(X_LALT)) : SEND_STRING(SS_DOWN(X_LALT) SS_TAP(X_P1) SS_TAP(X_P3) SS_TAP(X_P5) SS_UP(X_LALT));
+ }
+ }
+ /* CapsLock */
+ SEQ_ONE_KEY(KC_LEAD) {
+ tap_code(KC_CAPS);
+ }
+ /* ± => LdrKey > = > - */
+ SEQ_TWO_KEYS(KC_EQL, KC_MINS) {
+ onMac ? SEND_STRING(SS_LALT(SS_LSFT(SS_TAP(X_EQL)))) : SEND_STRING(SS_DOWN(X_LALT) SS_TAP(X_P2) SS_TAP(X_P4) SS_TAP(X_P1) SS_UP(X_LALT));
+ }
+ /* ≤ => LdrKey > - > = */
+ SEQ_TWO_KEYS(KC_MINS, KC_EQL) {
+ onMac ? SEND_STRING(SS_LALT(SS_TAP(X_COMM))) : SEND_STRING(SS_DOWN(X_LALT) SS_TAP(X_P2) SS_TAP(X_P4) SS_TAP(X_P3) SS_UP(X_LALT));
+ }
+ /* ≥ => LdrKey > = > = */
+ SEQ_TWO_KEYS(KC_EQL, KC_EQL) {
+ onMac ? SEND_STRING(SS_LALT(SS_TAP(X_DOT))) : SEND_STRING(SS_DOWN(X_LALT) SS_TAP(X_P2) SS_TAP(X_P4) SS_TAP(X_P2) SS_UP(X_LALT));
+ }
+ /* <= => LdrKey > , > , */
+ SEQ_TWO_KEYS(KC_COMM, KC_COMM) {
+ SEND_STRING(SS_LSFT(SS_TAP(X_COMM)) SS_TAP(X_SPC) SS_TAP(X_EQL) SS_TAP(X_LEFT) SS_TAP(X_BSPC) SS_TAP(X_RIGHT));
+ }
+ /* => => LdrKey > . > . */
+ SEQ_TWO_KEYS(KC_DOT, KC_DOT) {
+ SEND_STRING("=>");
+ }
+ /* ", " => LdrKey > " " */
+ SEQ_ONE_KEY(KC_SPC) {
+ SEND_STRING(", ");
+ }
+ /* ". " => LdrKey > " " > " " */
+ SEQ_TWO_KEYS(KC_SPC, KC_SPC) {
+ SEND_STRING(". ");
+ }
+ /* Backward delete current word (on cursor) */
+ SEQ_TWO_KEYS(KC_BSPC, KC_BSPC) {
+ onMac ? SEND_STRING(SS_LALT(SS_TAP(X_RIGHT)) SS_LALT(SS_LSFT(SS_TAP(X_LEFT))) SS_TAP(X_BSPC)) : SEND_STRING(SS_LCTL(SS_TAP(X_RIGHT)) SS_LCTL(SS_LSFT(SS_TAP(X_LEFT))) SS_TAP(X_BSPC));
+ }
+ /* Previous word delete */
+ SEQ_ONE_KEY(KC_BSPC) {
+ onMac ? SEND_STRING(SS_LALT(SS_LSFT(SS_TAP(X_LEFT))) SS_TAP(X_BSPC)) : SEND_STRING(SS_LCTL(SS_LSFT(SS_TAP(X_LEFT))) SS_TAP(X_BSPC));
+ }
+ /* Forward delete current word (on cursor) */
+ SEQ_TWO_KEYS(KC_DEL, KC_DEL) {
+
+ onMac ? SEND_STRING(SS_LALT(SS_TAP(X_LEFT)) SS_LALT(SS_LSFT(SS_TAP(X_RIGHT))) SS_TAP(X_DEL)) : SEND_STRING(SS_LCTL(SS_TAP(X_LEFT)) SS_LCTL(SS_LSFT(SS_TAP(X_RIGHT))) SS_TAP(X_DEL));
+ }
+ /* Next word delete */
+ SEQ_ONE_KEY(KC_DEL) {
+ onMac ? SEND_STRING(SS_LALT(SS_LSFT(SS_TAP(X_RIGHT))) SS_TAP(X_DEL)): SEND_STRING(SS_LCTL(SS_LSFT(SS_TAP(X_RIGHT))) SS_TAP(X_DEL));
+ }
+ /* ` => LdrKey > Escape */
+ SEQ_ONE_KEY(KC_GESC) {
+ SEND_STRING("`");
+ }
+ /* ``` => LdrKey > Escape > Escape > Escape */
+ SEQ_THREE_KEYS(KC_GESC, KC_GESC, KC_GESC) {
+ SEND_STRING("```");
+ }
+ /* Printscreen => LdrKey > Insert */
+ SEQ_ONE_KEY(KC_INS) {
+ onMac ? SEND_STRING(SS_LGUI(SS_LSFT(SS_TAP(X_4)))) : SEND_STRING(SS_TAP(X_PSCR));
+ }
+ /* Home => LdrKey > Page Up */
+ SEQ_ONE_KEY(KC_PGUP) {
+ onMac ? SEND_STRING(SS_TAP(X_HOME)) : SEND_STRING(SS_LCTL(SS_TAP(X_HOME)));
+ }
+ /* End => LdrKey > Page Down */
+ SEQ_ONE_KEY(KC_PGDN) {
+ onMac ? SEND_STRING(SS_TAP(X_END)) : SEND_STRING(SS_LCTL(SS_TAP(X_END)));
+ }
+ /* Close Curernt File/Tab => LdrKey > W */
+ SEQ_ONE_KEY(KC_W) {
+ onMac ? SEND_STRING(SS_LGUI(SS_TAP(X_W))) : SEND_STRING(SS_LCTL(SS_TAP(X_W)));
+ }
+ /* Close Current App => LdrKey > Q */
+ SEQ_ONE_KEY(KC_Q) {
+ onMac ? SEND_STRING(SS_LGUI(SS_TAP(X_Q))) : SEND_STRING(SS_LALT(SS_TAP(X_F4)));
+ }
+ /* " => LdrKey > ' */
+ SEQ_ONE_KEY(KC_QUOT) {
+ SEND_STRING("\"");
+ }
+ /* "|" => LdrKey > ' > ' */
+ SEQ_TWO_KEYS(KC_QUOT, KC_QUOT) {
+ SEND_STRING("\"\"" SS_TAP(X_LEFT));
+ }
+ /* "X" wrap => LdrKey > ' > ' > ' */
+ SEQ_THREE_KEYS(KC_QUOT, KC_QUOT, KC_QUOT) {
+ onMac ? SEND_STRING(SS_LALT(SS_TAP(X_LEFT)) "\"" SS_LALT(SS_TAP(X_RIGHT)) "\"") : SEND_STRING(SS_LCTL(SS_TAP(X_LEFT)) "\"" SS_LCTL(SS_TAP(X_RIGHT)) "\"");
+ }
+ /* ( => LdrKey > Left Shift */
+ SEQ_ONE_KEY(KC_LSFT) {
+ SEND_STRING("(");
+ }
+ /* ) => LdrKey > Right Shift */
+ SEQ_ONE_KEY(KC_RSFT) {
+ SEND_STRING(")");
+ }
+ /* (|) => LdrKey > Left Shift > Left Shift */
+ SEQ_TWO_KEYS(KC_LSFT, KC_LSFT) {
+ ldrkey_send_paranthesis_wrap_ini();
+ }
+ /* (|) => LdrKey > Right Shift > Right Shift */
+ SEQ_TWO_KEYS(KC_RSFT, KC_RSFT) {
+ ldrkey_send_paranthesis_wrap_ini();
+ }
+ /* (X) wrap => LdrKey > Left Shift > W */
+ SEQ_TWO_KEYS(KC_LSFT, KC_W) {
+ ldrkey_send_paranthesis_wrap_word();
+ }
+ /* (X) wrap => LdrKey > Right Shift > W */
+ SEQ_TWO_KEYS(KC_RSFT, KC_W) {
+ ldrkey_send_paranthesis_wrap_word();
+ }
+ /* (X) wrap selection => LdrKey > Left Shift > W > W */
+ SEQ_THREE_KEYS(KC_LSFT, KC_W, KC_W) {
+ ldrkey_send_paranthesis_wrap_selection();
+ }
+ /* (X) wrap selection => LdrKey > Right Shift > W > W */
+ SEQ_THREE_KEYS(KC_RSFT, KC_W, KC_W) {
+ ldrkey_send_paranthesis_wrap_selection();
+ }
+ /* [ => LdrKey > Left CTL */
+ SEQ_ONE_KEY(KC_LCTL) {
+ SEND_STRING("[");
+ }
+ /* ] => LdrKey > Right CTL */
+ SEQ_ONE_KEY(KC_RCTL) {
+ SEND_STRING("]");
+ }
+ /* [|] => LdrKey > Left CTL > Left CTL */
+ SEQ_TWO_KEYS(KC_LCTL, KC_LCTL) {
+ ldrkey_send_bracket_wrap_ini();
+ }
+ /* [|] => LdrKey > Right CTL > Right CTL */
+ SEQ_TWO_KEYS(KC_RCTL, KC_RCTL) {
+ ldrkey_send_bracket_wrap_ini();
+ }
+ /* [X] wrap => LdrKey > Left CTL > W */
+ SEQ_TWO_KEYS(KC_LCTL, KC_W) {
+ ldrkey_send_bracket_wrap_word();
+ }
+ /* [X] wrap => LdrKey > Right CTL > W */
+ SEQ_TWO_KEYS(KC_RCTL, KC_W) {
+ ldrkey_send_bracket_wrap_word();
+ }
+ /* [X] wrap selection => LdrKey > Left CTL > W > W */
+ SEQ_THREE_KEYS(KC_LCTL, KC_W, KC_W) {
+ ldrkey_send_bracket_wrap_selection();
+ }
+ /* [X] wrap selection => LdrKey > Right CTL > W > W */
+ SEQ_THREE_KEYS(KC_RCTL, KC_W, KC_W) {
+ ldrkey_send_bracket_wrap_selection();
+ }
+ /* { => LdrKey > Left ALT */
+ SEQ_ONE_KEY(KC_LALT) {
+ SEND_STRING("{");
+ }
+ /* } => LdrKey > Right ALT */
+ SEQ_ONE_KEY(KC_RALT) {
+ SEND_STRING("}");
+ }
+ /* {|} => LdrKey > Left ALT > Left ALT */
+ SEQ_TWO_KEYS(KC_LALT, KC_LALT) {
+ ldrkey_send_curlybrace_wrap_ini();
+ }
+ /* {|} => LdrKey > Right ALT > Right ALT */
+ SEQ_TWO_KEYS(KC_RALT, KC_RALT) {
+ ldrkey_send_curlybrace_wrap_ini();
+ }
+ /* {X} wrap => LdrKey > Left ALT > W */
+ SEQ_TWO_KEYS(KC_LALT, KC_W) {
+ ldrkey_send_curlybrace_wrap_word();
+ }
+ /* {X} wrap => LdrKey > Right ALT > W */
+ SEQ_TWO_KEYS(KC_RALT, KC_W) {
+ ldrkey_send_curlybrace_wrap_word();
+ }
+ /* {X} wrap selection => LdrKey > Left ALT > W > W */
+ SEQ_THREE_KEYS(KC_LALT, KC_W, KC_W) {
+ ldrkey_send_curlybrace_wrap_selection();
+ }
+ /* {X} wrap selection => LdrKey > Right ALT > W > W */
+ SEQ_THREE_KEYS(KC_RALT, KC_W, KC_W) {
+ ldrkey_send_curlybrace_wrap_selection();
+ }
+ /* Select everything on this line before cursor => LdrKey > Left */
+ SEQ_ONE_KEY(KC_LEFT) {
+ onMac ? SEND_STRING(SS_LSFT(SS_LGUI(SS_TAP(X_LEFT)))) : SEND_STRING(SS_LSFT(SS_TAP(X_HOME)));
+ }
+ /* Select everything on this line after cursor => LdrKey > Right */
+ SEQ_ONE_KEY(KC_RIGHT) {
+ onMac ? SEND_STRING(SS_LSFT(SS_LGUI(SS_TAP(X_RIGHT)))) : SEND_STRING(SS_LSFT(SS_TAP(X_END)));
+ }
+ /* Select everything on this line before cursor and bring on previous line => LdrKey > Left > Left */
+ SEQ_TWO_KEYS(KC_LEFT, KC_LEFT) {
+ onMac ? SEND_STRING(SS_LSFT(SS_TAP(X_UP) SS_LGUI(SS_TAP(X_RIGHT)))) : SEND_STRING(SS_LSFT(SS_TAP(X_UP) SS_TAP(X_END)));
+ }
+ /* Select everything on this line => LdrKey > Right > Left */
+ SEQ_TWO_KEYS(KC_RIGHT, KC_LEFT) {
+ onMac ? SEND_STRING(SS_LGUI(SS_TAP(X_RIGHT) SS_LSFT(SS_LGUI(SS_TAP(X_LEFT))))) : SEND_STRING(SS_TAP(X_END) SS_LSFT(SS_TAP(X_HOME)));
+ }
+ /* Select 1x Page Up on the page before the cursor => LdrKey > Up */
+ SEQ_ONE_KEY(KC_UP) {
+ SEND_STRING(SS_LSFT(SS_TAP(X_PGUP)));
+ }
+ /* Select 1x Page Down on the page after the cursor => LdrKey > Down */
+ SEQ_ONE_KEY(KC_DOWN) {
+ SEND_STRING(SS_LSFT(SS_TAP(X_PGDN)));
+ }
+ /* Select everything on the page before the cursor => LdrKey > Up > Up */
+ SEQ_TWO_KEYS(KC_UP, KC_UP) {
+ onMac ? SEND_STRING(SS_LSFT(SS_LGUI(SS_TAP(X_UP)))) : SEND_STRING(SS_LSFT(SS_LCTL(SS_TAP(X_HOME))));
+ }
+ /* Select everything on the page after the cursor => LdrKey > Down > Down */
+ SEQ_TWO_KEYS(KC_DOWN, KC_DOWN) {
+ onMac ? SEND_STRING(SS_LSFT(SS_LGUI(SS_TAP(X_DOWN)))) : SEND_STRING(SS_LSFT(SS_LCTL(SS_TAP(X_END))));
+ }
+ /* HELPER => spit out the url of the layout description page on github */
+ SEQ_FIVE_KEYS(KC_GESC, KC_GESC, KC_GESC, KC_GESC, KC_GESC) {
+ SEND_STRING("https://github.com/qmk/qmk_firmware/tree/master/keyboards/dztech/dz65rgb/keymaps/drootz");
+ }
+ /* google.ca => LdrKey > G > G */
+ SEQ_TWO_KEYS(KC_G, KC_G) {
+ SEND_STRING("https://google.ca" SS_TAP(X_ENT));
+ }
+ /* @gmail => LdrKey > M > L > T */
+ SEQ_THREE_KEYS(KC_M, KC_L, KC_T) {
+ SEND_STRING("mailto." SS_TAP(X_D) SS_TAP(X_A) SS_TAP(X_N) SS_TAP(X_I) SS_TAP(X_E) SS_TAP(X_L) SS_TAP(X_R) SS_TAP(X_A) SS_TAP(X_C) SS_TAP(X_I) SS_TAP(X_N) SS_TAP(X_E) "@gmail.com");
+ }
+ /* Show Desktop => LdrKey > D */
+ SEQ_ONE_KEY(KC_D) {
+ onMac ? SEND_STRING(SS_LGUI(SS_TAP(X_SPC)) "Mission" SS_TAP(X_ENT)) : SEND_STRING(SS_LGUI(SS_TAP(X_D)));
+ }
+ }
+}
+
+void leader_start(void) {
+ isLeader = true;
+}
+
+void leader_end(void) {
+ isLeader = false;
+}
+
+#endif /* LEADER */
+
+/**************** DYNAMIC MACRO *********************/
+
+void dynamic_macro_record_start_user(void) {
+ onMac = false; /* reset layer bool as dynamic macro clear the keyboard and reset layers. */
+ if (!isBlinking && !isRecording) {
+ reset_blink_cycle();
+ isBlinking = true;
+ isRecording = true;
+ }
+}
+
+void dynamic_macro_record_end_user(int8_t direction) {
+ if (isBlinking && isRecording) {
+ reset_blink_status();
+ reset_blink_cycle();
+ }
+}
+
+void dynamic_macro_play_user(int8_t direction) {
+ switch (direction) {
+ case 1:
+ if (!isBlinking && !isPlaying) {
+ reset_blink_cycle();
+ isBlinking = true;
+ isPlaying = true;
+ macro_one_play_timer = timer_read();
+ }
+ break;
+ case -1:
+ if (!isBlinking && !isPlaying) {
+ reset_blink_cycle();
+ isBlinking = true;
+ isPlaying = true;
+ macro_two_play_timer = timer_read();
+ }
+ break;
+ }
+}
diff --git a/keyboards/dztech/dz65rgb/keymaps/drootz/readme.md b/keyboards/dztech/dz65rgb/keymaps/drootz/readme.md
new file mode 100644
index 0000000000..15f15d752b
--- /dev/null
+++ b/keyboards/dztech/dz65rgb/keymaps/drootz/readme.md
@@ -0,0 +1,210 @@
+![DZ65RGBv2 Layout Image - MAIN](https://res.cloudinary.com/drootz/image/upload/c_scale,w_800/v1582000645/drootz_dz65rgb_layer_0_main_n61oxl.jpg)
+
+# Drootz's DZ65RGBv2 ANSI Layout
+
+This layout fit best people who mainly type in English but regularly need to type in French _(using an English keyboard in OS setting)_. There are also some cool LED indicator effects and tons of Leader Key bindings/macros designed to work on both Mac and Windows OS. I tried to keep things as simple as possible from a usability perspective. Enjoy!
+
+- [LAYERS](#LAYERS)
+- [LEADER KEY BINDINGS:](#LEADER-KEY-BINDINGS)
+ - [OS and Keyboard Macros](#OS-and-Keyboard-Macros)
+ - [French Accents](#French-Accents)
+ - [Special Characters and Punctuation](#Special-Characters-and-Punctuation)
+ - [Text Selection Macros](#Text-Selection-Macros)
+ - [Expanded Space Cadet Macros](#Expanded-Space-Cadet-Macros)
+ - [Text Expanders](#Text-Expanders)
+- [STEP BY STEP FLASH INSTRUCTIONS](#STEP-BY-STEP-FLASH-INSTRUCTIONS)
+
+## HIGH LEVEL DESCRIPTION
+
+#### Dual function Capslock key
+- Single tap to trigger the Leader Key
+- Double tap to toggle Capslock ON/OFF
+
+#### 70+ useful Leader Key bindings and macros
+- "Designed" to work on both Mac and Windows OS with an English keyboard OS setting
+- Per key timing set at 425ms. Never a key sequence!
+- 20+ Punctuation, ASCII, System shortcuts and macros
+- 15+ French accents (è, é, ê, È, É, Ê, à, etc.)
+ - No need to switch to a French keyboard OS setting!
+ - Preserve Capslock if enabled
+- 8 Text "selection" shortcuts
+- 20+ Expanded "Space Cadet" feature with Shift, Ctrl, Alt and DoubleQuote for (), [], {} and ""
+- Few useful strings output for my workflow (You may want to change or remove them...)
+
+#### Dynamic Macros enabled
+- Record/Play up to 2 Macros
+- Nesting allowed
+
+#### Kept only 4 RGB matrix animations due to size of firmware
+- Typing Heatmap => How hot is your WPM! (preferred animation because of LED indicators)
+- Matrix Splash => Full gradient & value pulse away from a single key hit then fades value out
+- Solid Splash => Hue & value pulse away from a single key hit then fades value out
+- Solid Color => Static single hue, no speed support
+
+#### LED indicators and animations
+- White led when Capslock toggle ON
+- The brightness of all the other indicator can be adjusted globally with the RGB matrix brightness setting on layer \_FN
+- White LED indicator for layer selection and current layer identification
+- Red and green blinking indicator when "recording" or "playing" Dynamic Macros
+- Leader Key LED indicator:
+ - Persistent 50% dimmed under-glow on top right corner key
+ - Light up at 100% for the duration of the Leader Key timeout when activated
+ - Hue, saturation and brightness can be globally adjusted with the RGB matrix settings on layer \_FN
+
+#### 3 Layers
+- \_MAIN: Default layer for Windows OS
+- \_MAC: Transparent layer that switch left hand modifier KC_LALT and KC_LGUI keys for MacOS
+- \_FN: Functions & settings layer:
+ - Macro 1 & 2 keycodes (Record, Stop, Play) with LED indicators
+ - F Keys (F1...F12) on number row
+ - RGB matrix & animation settings
+ - Screen brightness & volume system controls
+ - Layer selection
+
+## LAYERS
+
+- Colored keys on the layout visuals below represent the position of the LED indicators on each layer.
+- Press down and hold the MO(\_FN) key to access the \_FN layer
+- Double tap on the Capslock key to toggle Capslock ON/OFF
+- \_TRNS keys use the next lowest non-transparent key (on lower layers)
+- \_NO keys are ignored (nothing happens)
+
+### [Layer 0: \_MAIN](http://www.keyboard-layout-editor.com/#/gists/67c22220856a927766bd3e0331ed782a)
+![DZ65RGBv2 Layout Image - MAIN](https://res.cloudinary.com/drootz/image/upload/c_scale,w_800/v1582000645/drootz_dz65rgb_layer_0_main_n61oxl.jpg)
+
+### [Layer 1: \_MAC](http://www.keyboard-layout-editor.com/#/gists/4a32d80c67c778658febf28524fb5000)
+![DZ65