summaryrefslogtreecommitdiff
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)
+![DZ65RGBv2 Layout Image - MAC](https://res.cloudinary.com/drootz/image/upload/c_scale,w_800/v1582000653/drootz_dz65rgb_layer_1_mac_z4tsaw.jpg)
+
+### [Layer 2: \_FN](http://www.keyboard-layout-editor.com/#/gists/b583bd7cc5b0a75b4610bbda18fba65e)
+![DZ65RGBv2 Layout Image - FN](https://res.cloudinary.com/drootz/image/upload/c_scale,w_800/v1582000661/drootz_dz65rgb_layer_2_fn_zv8yte.jpg)
+
+## LEADER KEY BINDINGS
+
+The Leader Key on this layout is triggered by tapping the Capslock key once. Once triggered, we have 450ms between each key press to type any one of the sequences listed below. All sequences are designed to work on both Mac and Windows with an English keyboard OS setting.
+
+- [OS and Keyboard Macros](#OS-and-Keyboard-Macros)
+- [French Accents](#French-Accents)
+- [Special Characters and Ponctuation](#Special-Characters-and-Ponctuation)
+- [Text Selection Macros](#Text-Selection-Macros)
+- [Expanded Space Cadet Macros](#Expanded-Space-Cadet-Macros)
+- [Text Expanders](#Text-Expanders)
+
+#### Legend:
+
+| Acronym | Description |
+| :--- | :--- |
+| LDR | Leader Key |
+| SFT | Shift key |
+| CTL | Control key |
+| ESC | Escape key |
+| ¶ | Text cursor position |
+
+### OS and Keyboard Macros
+
+| Output | Sequence | Description
+| :--- | :--- | :--- |
+| Toggle Capslock | `LDR LDR` | Single tap Capslock to trigger the LDR key |
+| Delete all previous characters in word on cursor OR; | `LDR BACKSPACE` | n/a |
+| => Delete previous word if triggered repeatedly | `LDR BACKSPACE` | n/a |
+| Delete all forward characters in word on cursor OR; | `LDR DEL` | n/a |
+| => Delete next word if triggered repeatedly | `LDR DEL` | n/a |
+| Backward Delete whole word on cursor | `LDR BACKSPACE BACKSPACE` | n/a |
+| Forward Delete whole word on cursor | `LDR DEL DEL` | n/a |
+| Printscreen | `LDR INSERT` | n/a |
+| Home | `LDR PAGE-UP` | n/a |
+| End | `LDR PAGE-DOWN` | n/a |
+| OS: Close current file/tab | `LDR W` | n/a |
+| OS: Close current application | `LDR Q` | n/a |
+| OS: Show Desktop(Win) or Mission Control(Mac) | `LDR D` | The Mac sequence will work with LaunchBar (Cmd+Space) |
+
+### French Accents
+
+| Output | Sequence | Description
+| :--- | :--- | :--- |
+| `à`¶ &nbsp;&nbsp;or&nbsp;&nbsp; `À`¶ | `LDR A` | Will output upper character if Capslock enabled. |
+| `â`¶ &nbsp;&nbsp;or&nbsp;&nbsp; `Â`¶ | `LDR A A` | Will output upper character if Capslock enabled. |
+| `ç`¶ &nbsp;&nbsp;or&nbsp;&nbsp; `Ç`¶ | `LDR C` | Will output upper character if Capslock enabled. |
+| `è`¶ &nbsp;&nbsp;or&nbsp;&nbsp; `È`¶ | `LDR E` | Will output upper character if Capslock enabled. |
+| `ê`¶ &nbsp;&nbsp;or&nbsp;&nbsp; `Ê`¶ | `LDR E E` | Will output upper character if Capslock enabled. |
+| `é`¶ &nbsp;&nbsp;or&nbsp;&nbsp; `É`¶ | `LDR /` | Will output upper character if Capslock enabled |
+| `î`¶ &nbsp;&nbsp;or&nbsp;&nbsp; `Î`¶ | `LDR I I` | Will output upper character if Capslock enabled. |
+| `ô`¶ &nbsp;&nbsp;or&nbsp;&nbsp; `Ô`¶ | `LDR O O` | Will output upper character if Capslock enabled. |
+| `ù`¶ &nbsp;&nbsp;or&nbsp;&nbsp; `Ù`¶ | `LDR U` | Will output upper character if Capslock enabled. |
+| `û`¶ &nbsp;&nbsp;or&nbsp;&nbsp; `Û`¶ | `LDR U U` | Will output upper character if Capslock enabled. |
+
+### Special Characters and Punctuation
+
+| Output | Sequence | Description |
+| :--- | :--- | :--- |
+| `±`¶ | `LDR = -` | n/a |
+| `≤`¶ | `LDR - =` | n/a |
+| `≥`¶ | `LDR = =` | n/a |
+| `=>`¶ | `LDR , ,` | n/a |
+| `<=`¶ | `LDR . .` | n/a |
+| ``` ` ``` ¶ | `LDR ESC` | n/a |
+| \`\`\` ¶ | `LDR ESC ESC ESC` | n/a |
+| `,` space ¶ | `LDR SPACE` | n/a |
+| `.` space ¶ | `LDR SPACE SPACE` | n/a |
+
+### Text Selection Macros
+
+| Output | Sequence |
+| :--- | :--- |
+| Select everything on this line before cursor | `LDR LEFT-ARROW` |
+| Select everything on this line after cursor | `LDR RIGHT-ARROW` |
+| Select everything on this line before cursor up to end of previous line | `LDR LEFT-ARROW LEFT-ARROW` | n/a |
+| Select everything on this line | `LDR RIGHT-ARROW LEFT-ARROW` |
+| Select 1x Page Up on the page before the cursor | `LDR UP-ARROW` |
+| Select 1x Page Down on the page after the cursor | `LDR DOWN-ARROW` |
+| Select everything on the page before the cursor | `LDR UP-ARROW UP-ARROW` |
+| Select everything on the page after the cursor | `LDR DOWN-ARROW DOWN-ARROW` |
+
+### Expanded Space Cadet Macros
+
+| Output | Sequence | Description |
+| :--- | :--- | :--- |
+| `"`¶ | `LDR '` | Will output single double-quote |
+| `"`¶`"` | `LDR ' '` | Will wrap cursor between two double-quotes |
+| `"`WORD`"`¶ | `LDR ' ' '` | Will wrap word on cursor between two double-quotes |
+| `(`¶ | `LDR LEFT-SFT` | Will output single left parenthesis |
+| `)`¶ | `LDR RIGHT-SFT` | Will output single right parenthesis |
+| `(`¶`)` | `LDR LEFT-SFT LEFT-SFT` | Will wrap cursor between two parenthesis' |
+| `(`¶`)` | `LDR RIGHT-SFT RIGHT-SFT` | Will wrap cursor between two parenthesis' |
+| `(`WORD`)`¶ | `LDR LEFT-SFT W` | Will wrap word on cursor between two parenthesis' |
+| `(`WORD`)`¶ | `LDR RIGHT-SFT W` | Will wrap word on cursor between two parenthesis' |
+| `(`SELECTION`)`¶ | `LDR LEFT-SFT W W` | Will wrap selection between two parenthesis' |
+| `(`SELECTION`)`¶ | `LDR RIGHT-SFT W W` | Will wrap selection between two parenthesis' |
+| `[`¶ | `LDR LEFT-CTL` | Will output single left bracket |
+| `]`¶ | `LDR RIGHT-CTL` | Will output single right bracket |
+| `[`¶`]` | `LDR LEFT-CTL LEFT-CTL` | Will wrap cursor between two brackets' |
+| `[`¶`]` | `LDR RIGHT-CTL RIGHT-CTL` | Will wrap cursor between two brackets' |
+| `[`WORD`]`¶ | `LDR LEFT-CTL W` | Will wrap word on cursor between two brackets' |
+| `[`WORD`]`¶ | `LDR RIGHT-CTL W` | Will wrap word on cursor between two brackets' |
+| `[`SELECTION`]`¶ | `LDR LEFT-CTL W W` | Will wrap selection between two brackets' |
+| `[`SELECTION`]`¶ | `LDR RIGHT-CTL W W` | Will wrap selection between two brackets' |
+| `{`¶ | `LDR LEFT-ALT` | Will output single left curly brace |
+| `}`¶ | `LDR RIGHT-ALT` | Will output single right curly brace |
+| `{`¶`}` | `LDR LEFT-ALT LEFT-ALT` | Will wrap cursor between two curly braces' |
+| `{`¶`}` | `LDR RIGHT-ALT RIGHT-ALT` | Will wrap cursor between two curly braces' |
+| `{`WORD`}`¶ | `LDR LEFT-ALT W` | Will wrap word on cursor between two curly braces' |
+| `{`WORD`}`¶ | `LDR RIGHT-ALT W` | Will wrap word on cursor between two curly braces' |
+| `{`SELECTION`}`¶ | `LDR LEFT-ALT W W` | Will wrap selection between two curly braces' |
+| `{`SELECTION`}`¶ | `LDR RIGHT-ALT W W` | Will wrap selection between two curly braces' |
+
+### Text Expanders
+
+| Output | Sequence | Description |
+| :--- | :--- | :--- |
+| https://google.ca | `LDR G G` | n/a |
+| Layout Help URL | `LDR ESC ESC ESC ESC ESC` | URL to this readme.md page |
+| My Gmail | `LDR M L T` | You may want to update this before compiling the firmware |
+
+## STEP BY STEP FLASH INSTRUCTIONS
+1. Build the Firmware. Run build command in directory: `make dztech/dz65rgb/v2:drootz`
+ - Approximate firmware size: 27302/28672 (95%, 1370 bytes free)
+2. Flash the Firmware:
+ - Open QMK Toolbox Application
+ - Open firmware file: dztech_dz65rgb_v2_drootz.hex
+ - Unplug keyboard USB, and hold the ESC key while plugging it back in
+ - Check that QMK Toolbox displays: *** DFU device connected.
+ - Hit the flash button!
diff --git a/keyboards/dztech/dz65rgb/keymaps/drootz/rules.mk b/keyboards/dztech/dz65rgb/keymaps/drootz/rules.mk
new file mode 100644
index 0000000000..24a765ab9a
--- /dev/null
+++ b/keyboards/dztech/dz65rgb/keymaps/drootz/rules.mk
@@ -0,0 +1,11 @@
+DYNAMIC_MACRO_ENABLE = yes
+LEADER_ENABLE = yes
+
+# Firmware size Optimizations
+EXTRAFLAGS += -flto
+MOUSEKEY_ENABLE = no
+NKRO_ENABLE = no
+SPACE_CADET_ENABLE = no
+TAP_DANCE_ENABLE = no
+UNICODEMAP_ENABLE = no
+SPLIT_KEYBOARD = no