summaryrefslogtreecommitdiff
path: root/keyboards/ergodox_ez
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/ergodox_ez')
-rw-r--r--keyboards/ergodox_ez/config.h19
-rw-r--r--keyboards/ergodox_ez/ergodox_ez.c1
-rw-r--r--keyboards/ergodox_ez/keymaps/bdk/config.h5
-rw-r--r--keyboards/ergodox_ez/keymaps/bdk/keymap.c176
-rw-r--r--keyboards/ergodox_ez/keymaps/bdk/readme.md36
-rw-r--r--keyboards/ergodox_ez/keymaps/bdk/rules.mk3
-rw-r--r--keyboards/ergodox_ez/keymaps/bocaj/bocaj.h146
-rw-r--r--keyboards/ergodox_ez/keymaps/bocaj/config.h21
-rw-r--r--keyboards/ergodox_ez/keymaps/bocaj/keymap.c340
-rw-r--r--keyboards/ergodox_ez/keymaps/bocaj/readme.md48
-rw-r--r--keyboards/ergodox_ez/keymaps/bocaj/rules.mk5
-rw-r--r--keyboards/ergodox_ez/keymaps/default/keymap.c177
-rw-r--r--keyboards/ergodox_ez/keymaps/default_glow/keymap.c1
-rw-r--r--keyboards/ergodox_ez/keymaps/default_glow/rules.mk4
-rw-r--r--keyboards/ergodox_ez/keymaps/dvorak_42_key/keymap.c2
-rw-r--r--keyboards/ergodox_ez/keymaps/hacker_dvorak/.gitignore2
-rw-r--r--keyboards/ergodox_ez/keymaps/hacker_dvorak/config.h88
-rw-r--r--keyboards/ergodox_ez/keymaps/hacker_dvorak/gulpfile.js19
-rw-r--r--keyboards/ergodox_ez/keymaps/hacker_dvorak/hacker_dvorak.c353
-rw-r--r--keyboards/ergodox_ez/keymaps/hacker_dvorak/keycodes/aliases_definitions.c5
-rw-r--r--keyboards/ergodox_ez/keymaps/hacker_dvorak/keycodes/custom_keycodes.c8
-rw-r--r--keyboards/ergodox_ez/keymaps/hacker_dvorak/keymap.c19
-rw-r--r--keyboards/ergodox_ez/keymaps/hacker_dvorak/layers/layers_definitions.c12
-rw-r--r--keyboards/ergodox_ez/keymaps/hacker_dvorak/leader/leader_dictionary.c14
-rw-r--r--keyboards/ergodox_ez/keymaps/hacker_dvorak/leader/leader_setup.c14
-rw-r--r--keyboards/ergodox_ez/keymaps/hacker_dvorak/package.json15
-rw-r--r--keyboards/ergodox_ez/keymaps/hacker_dvorak/plover/plover_mode.c20
-rw-r--r--keyboards/ergodox_ez/keymaps/hacker_dvorak/readme.md62
-rw-r--r--keyboards/ergodox_ez/keymaps/hacker_dvorak/rules.mk40
-rw-r--r--keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/mod_tap_layer_dances/none_lead.c40
-rw-r--r--keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dance_actions.c20
-rw-r--r--keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dance_setup.c75
-rw-r--r--keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dances.c74
-rw-r--r--keyboards/ergodox_ez/keymaps/hacker_dvorak/user/eeconfig_init_user.c3
-rw-r--r--keyboards/ergodox_ez/keymaps/hacker_dvorak/user/layer_set_state_user.c121
-rw-r--r--keyboards/ergodox_ez/keymaps/hacker_dvorak/user/matrix_scan_user.c12
-rw-r--r--keyboards/ergodox_ez/keymaps/hacker_dvorak/user/process_record_user.c75
-rw-r--r--keyboards/ergodox_ez/keymaps/heartrobotninja/rules.mk4
-rw-r--r--keyboards/ergodox_ez/keymaps/lukaus/config.h16
-rw-r--r--keyboards/ergodox_ez/keymaps/lukaus/keymap.c843
-rw-r--r--keyboards/ergodox_ez/keymaps/lukaus/readme.md3
-rw-r--r--keyboards/ergodox_ez/keymaps/lukaus/rules.mk1
-rw-r--r--keyboards/ergodox_ez/keymaps/matrixman/keymap.c5
-rw-r--r--keyboards/ergodox_ez/keymaps/rgb_layer/config.h24
-rw-r--r--keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c271
-rw-r--r--keyboards/ergodox_ez/keymaps/skug/config.h8
-rw-r--r--keyboards/ergodox_ez/keymaps/skug/keymap.c273
-rw-r--r--keyboards/ergodox_ez/keymaps/skug/readme.md4
-rw-r--r--keyboards/ergodox_ez/keymaps/testing/keymap.c4
-rw-r--r--keyboards/ergodox_ez/keymaps/vim/vim.h1
-rw-r--r--keyboards/ergodox_ez/matrix.c52
-rw-r--r--keyboards/ergodox_ez/rules.mk10
-rw-r--r--keyboards/ergodox_ez/util/compile_keymap.py3
53 files changed, 2878 insertions, 719 deletions
diff --git a/keyboards/ergodox_ez/config.h b/keyboards/ergodox_ez/config.h
index 07a9b54977..ee768853a9 100644
--- a/keyboards/ergodox_ez/config.h
+++ b/keyboards/ergodox_ez/config.h
@@ -85,19 +85,20 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define RGBW 1
-/* "debounce" is measured in keyboard scans. Some users reported
- * needing values as high as 15, which was at the time around 50ms.
+/*
+ * The debounce filtering reports a key/switch change directly,
+ * without any extra delay. After that the debounce logic will filter
+ * all further changes, until the key/switch reports the same state for
+ * the given count of scans.
+ * So a perfect switch will get a short debounce period and
+ * a bad key will get a much longer debounce period.
+ * The result is an adaptive debouncing period for each switch.
+ *
* If you don't define it here, the matrix code will default to
* 5, which is now closer to 10ms, but still plenty according to
* manufacturer specs.
- *
- * Default is quite high, because of reports with some production
- * runs seeming to need it. This may change when configuration for
- * this is more directly exposed.
*/
-#define DEBOUNCE 15
-
-#define PREVENT_STUCK_MODIFIERS
+#define DEBOUNCE 10
#define USB_MAX_POWER_CONSUMPTION 500
diff --git a/keyboards/ergodox_ez/ergodox_ez.c b/keyboards/ergodox_ez/ergodox_ez.c
index 61f910711a..3b2c943506 100644
--- a/keyboards/ergodox_ez/ergodox_ez.c
+++ b/keyboards/ergodox_ez/ergodox_ez.c
@@ -269,6 +269,7 @@ const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
};
+__attribute__ ((weak))
const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = {
/*{row | col << 4}
diff --git a/keyboards/ergodox_ez/keymaps/bdk/config.h b/keyboards/ergodox_ez/keymaps/bdk/config.h
new file mode 100644
index 0000000000..e824b73109
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/bdk/config.h
@@ -0,0 +1,5 @@
+#pragma once
+
+#define ONESHOT_TAP_TOGGLE 2
+#define ONESHOT_TIMEOUT 167
+#define FORCE_NKRO
diff --git a/keyboards/ergodox_ez/keymaps/bdk/keymap.c b/keyboards/ergodox_ez/keymaps/bdk/keymap.c
new file mode 100644
index 0000000000..20af6c18ed
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/bdk/keymap.c
@@ -0,0 +1,176 @@
+#include QMK_KEYBOARD_H
+
+#define SHIFT_DOWN() (get_mods() & (MOD_BIT(KC_LSFT)|MOD_BIT(KC_RSFT)))
+#define KC_FKEYS MO(FKEYS)
+
+// Layers
+enum {
+ BASE=0,
+ SYMNUM, // Symbols and numbers (activated by holding enter)
+ FKEYS, // Function keys (activated by a thumb button)
+};
+
+// counter that increments on all key press events. This is needed for our LT
+// handling
+uint16_t press_counter = 0;
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+// Keymap 0: Base layer
+
+[BASE] = LAYOUT_ergodox(
+ // left hand ---------------------------------------------------------------------------------------------------
+ KC_NO, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_NO,
+ KC_GRV, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_LGUI,
+ KC_SLSH, KC_A, KC_O, KC_E, KC_U, KC_I,
+ KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_HOME,
+ KC_LCTL, KC_LALT, KC_PGUP, KC_PGDN, KC_NO,
+ // left thumb --------------------------------------------------------------------------------------------------
+ KC_NO, KC_NO,
+ KC_NO,
+ KC_SPC, KC_TAB, KC_FKEYS,
+ // right hand --------------------------------------------------------------------------------------------------
+ KC_NO, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_NO,
+ KC_RGUI, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSLS,
+ KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS,
+ KC_END, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT,
+ KC_LEFT, KC_UP, KC_DOWN, KC_RIGHT, KC_RCTL,
+ // right thumb -------------------------------------------------------------------------------------------------
+ KC_NO, KC_NO,
+ KC_NO,
+ KC_DEL, KC_BSPC, KC_ENT
+),
+// SYMNUM -- numpad and function keys
+[SYMNUM] = LAYOUT_ergodox(
+ // left hand ---------------------------------------------------------------------------------------------------
+ KC_TRNS, LALT(KC_1), LALT(KC_2), LALT(KC_3), LALT(KC_4), LALT(KC_5), KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_AMPR, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_LCBR, KC_LBRC, KC_LPRN, KC_0, KC_MINS,
+ KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_SLSH, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ // left thumb --------------------------------------------------------------------------------------------------
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS,
+ // right hand --------------------------------------------------------------------------------------------------
+ KC_TRNS, LALT(KC_6), LALT(KC_7), LALT(KC_8), LALT(KC_9), LALT(KC_0), KC_TRNS,
+ KC_TRNS, KC_PERC, KC_EQL, KC_LT, KC_GT, KC_EXLM, KC_TRNS,
+ KC_PLUS, KC_1, KC_RPRN, KC_RBRC, KC_RCBR, KC_TRNS,
+ KC_TRNS, KC_ASTR, KC_2, KC_3, KC_4, KC_5, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ // right thumb -------------------------------------------------------------------------------------------------
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+),
+// FKEYS -- function keys
+[FKEYS] = LAYOUT_ergodox(
+ // left hand ---------------------------------------------------------------------------------------------------
+ KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6,
+ 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,
+ // left thumb --------------------------------------------------------------------------------------------------
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS,
+ // right hand --------------------------------------------------------------------------------------------------
+ KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, 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,
+ // right thumb -------------------------------------------------------------------------------------------------
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+),
+};
+
+// Code to handle layer tap.
+//
+// The default code doesn't work for me, so I rolled my own code. The main
+// difference is that it always tries to send modifier+key combination, rather
+// than two keys. One place where this is noticable is if you tap the key,
+// then try hold it.
+
+struct tap_start_info {
+ uint16_t timer;
+ uint16_t initial_press_counter;
+};
+
+static struct tap_start_info tap_start_infos[5];
+
+// Quick check to see if a key is down. Note that this requires NKRO enabled
+static bool key_down(uint8_t code) {
+ return (keyboard_report->nkro.bits[code>>3] & 1<<(code&7)) != 0;
+}
+
+static bool handle_lt(uint16_t keycode, keyrecord_t *record, uint8_t layer, uint8_t index) {
+ struct tap_start_info* tap_start = tap_start_infos + index;
+
+ if(record->event.pressed) {
+ layer_on(layer);
+ tap_start->timer = timer_read();
+ tap_start->initial_press_counter = press_counter;
+ } else {
+ layer_off(layer);
+ // Only click the key if:
+ // - No other keys are pressed between the press and release events
+ // - The release happens before the ONESHOT_TIMEOUT
+ if(press_counter == tap_start->initial_press_counter && timer_elapsed(tap_start->timer) < ONESHOT_TIMEOUT) {
+ register_code16(keycode);
+ unregister_code16(keycode);
+ }
+ }
+ return false;
+}
+
+static bool handle_mt(uint16_t keycode, keyrecord_t *record, uint8_t mods, uint8_t index) {
+ struct tap_start_info* tap_start = tap_start_infos + index;
+
+ if(record->event.pressed) {
+ register_mods(mods);
+ tap_start->timer = timer_read();
+ tap_start->initial_press_counter = press_counter;
+ } else {
+ unregister_mods(mods);
+ // Only click the key if:
+ // - No other keys are pressed between the press and release events
+ // - The release happens before the ONESHOT_TIMEOUT
+ if(press_counter == tap_start->initial_press_counter && timer_elapsed(tap_start->timer) < ONESHOT_TIMEOUT) {
+ register_code16(keycode);
+ unregister_code16(keycode);
+ }
+ }
+ return false;
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if(record->event.pressed) {
+ press_counter++;
+ // The symbol layer allows sequences repeat the same "physical" key.
+ // For example "0)", which is like pressing the "0" key twice in a
+ // row. It's very easy to make a sequence of these where the ")"
+ // press comes before the "0" release. If that happens, force a
+ // release of the "0" key, otherwise nothing will happen.
+ uint8_t shortcode = keycode & 0xFF;
+ if(key_down(shortcode)) {
+ unregister_code(shortcode);
+ }
+ }
+
+ switch(keycode) {
+ case KC_ENTER:
+ return handle_lt(keycode, record, SYMNUM, 0);
+
+ case KC_TAB:
+ return handle_mt(keycode, record, MOD_BIT(KC_LCTL), 1);
+
+ case KC_LSFT:
+ case KC_RSFT:
+ return handle_mt(KC_ESC, record, MOD_BIT(keycode), 2);
+ }
+ return true;
+}
diff --git a/keyboards/ergodox_ez/keymaps/bdk/readme.md b/keyboards/ergodox_ez/keymaps/bdk/readme.md
new file mode 100644
index 0000000000..36a211d321
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/bdk/readme.md
@@ -0,0 +1,36 @@
+# The BDK Ergodox Keyboard Layout
+
+## Dvorak-based
+
+This was the first alternative layout I switched to and I don't want to change
+again.
+
+## Mod-tap / Layer-tap is great for thumb keys
+
+This means a key that activates a layer/modifier when you hold it down, but
+results in a keyclick when you tap it. Thumb keys are great for this since
+they are good for both high-usage keys as well as modifiers.
+
+The one thing to avoid is when you mean to tap a key, but hit the next key
+before you release, which results in the modifier/layer instead of a tap. To
+avoid this, I chose Enter/Tab as the tap keys, since they aren't chorded
+together with other keys often.
+
+The other issue is I found several problems with using the standard MT,LT code,
+so I rolled my own to handle it.
+
+## Don't have too many layers
+
+My first layouts had multiple layers that I could switch to, but that
+overloaded my brain. This layout basically only uses 1 extra layer.
+Technically there's also a function key layer, but I only use those keys for
+a handlful of things: boot order, rename, reload page, that's basically it.
+
+## Brackets should be easy to use
+
+There's a lot of ways to lay out a symbol layer. I organized mine around
+making the {[()]} chars easy to use since they're so frequent in programming.
+I put them all on the symbol layer home row.
+
+I also arranged the numbers so 0/1 were also on the symbol layer home row.
+This makes for fairly easy chording of "[0]" and "[1]".
diff --git a/keyboards/ergodox_ez/keymaps/bdk/rules.mk b/keyboards/ergodox_ez/keymaps/bdk/rules.mk
new file mode 100644
index 0000000000..6c51636239
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/bdk/rules.mk
@@ -0,0 +1,3 @@
+# CONSOLE_ENABLE = yes
+# DEBUG_ENABLE = yes
+COMMAND_ENABLE = no
diff --git a/keyboards/ergodox_ez/keymaps/bocaj/bocaj.h b/keyboards/ergodox_ez/keymaps/bocaj/bocaj.h
deleted file mode 100644
index 2c41c01aa8..0000000000
--- a/keyboards/ergodox_ez/keymaps/bocaj/bocaj.h
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
-Copyright 2018 Jacob Jerrell <jacob.jerrell@gmail.com>
-
-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"
-
-// Layers
-enum layers {
- _SWRKMN = 0,
- _HWRKMN,
- _LOWER,
- _RAISE,
- _ADJUST,
- _DIABLO
-};
-
-
-
-enum custom_keycodes {
- KC_EPRM = SAFE_RANGE,
- KC_SWRK,
- KC_HWRK,
- KC_VRSN,
- JJ_COPY,
- JJ_PASTE,
- JJ_ARRW,
- MC_LOCK,
- KC_DIABLO_CLEAR,
- KC_NMPD
-// UC_FLIP
-};
-
-// Space Cadet Hyper/Meh and [/]
-#define HYP_LBK ALL_T(KC_LBRACKET)
-#define MEH_RBK MEH_T(KC_RBRACKET)
-
-#define KC_LWSP LT(_LOWER, KC_SPACE)
-#define KC_RSEN LT(_RAISE, KC_ENTER)
-#define KC_ADJS TT(_ADJUST)
-
-#define XXXXXXX KC_NO
-#define _______ KC_TRNS
-
-#ifdef TAP_DANCE_ENABLE
-enum {
- TD_D3_1 = 0,
- TD_D3_2,
- TD_D3_3,
- TD_D3_4
-};
-#endif // TAP_DANCE_ENABLE
-
-// 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 diablo macro timer variables
-extern uint16_t diablo_timer[4];
-extern uint8_t diablo_times[];
-extern uint8_t diablo_key_time[4];
-
-
-void run_diablo_macro_check(void);
-
-
-#define LAYOUT_ergodox_pretty_wrapper(...) LAYOUT_ergodox_pretty(__VA_ARGS__)
-
-/* Pretty Layout
-.---------------------------------------------. .---------------------------------------------.
-| 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 |
-!-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
-| 29 | 30 | 31 | 32 | 33 | 34 |-------! !-------! 35 | 36 | 37 | 38 | 39 | 40 |
-!-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
-| 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 | 68 | '------------------------------'
- .-------+-------+-------! !-------+-------+-------.
- ! ! | 69 | ! 70 | ! !
- ! ! !-------! !-------! ! !
- | 71 | 72 | 73 | ! 74 | 75 | 76 |
- '-----------------------' '-----------------------'
-*/
-
-#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 ______________________SPECIAL_LEFT_______________________ KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC
-#define ______________________SPECIAL_RIGHT______________________ KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN
-
-#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 _________________________________________________________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
-#define XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX KC_NO, KC_NO, KC_NO, KC_NO, KC_NO
-
-#define _______________________SWORKMAN_L1_______________________ KC_Q, KC_W, KC_E, KC_R, KC_T
-#define _______________________SWORKMAN_L2_______________________ KC_A, SFT_T(KC_S), GUI_T(KC_D), ALT_T(KC_F), KC_G
-#define _______________________SWORKMAN_L3_______________________ CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B
-
-#define _______________________SWORKMAN_R1_______________________ KC_Y, KC_U, KC_I, KC_O, KC_P
-#define _______________________SWORKMAN_R2_______________________ KC_H, ALT_T(KC_J), GUI_T(KC_K), SFT_T(KC_L), KC_SCLN
-#define _______________________SWORKMAN_R3_______________________ KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLASH)
-
-// Hardware Driven Workman
-#define _______________________HWORKMAN_L1_______________________ KC_Q, KC_D, KC_R, KC_W, KC_B
-#define _______________________HWORKMAN_L2_______________________ KC_A, SFT_T(KC_S), GUI_T(KC_H), ALT_T(KC_T), KC_G
-#define _______________________HWORKMAN_L3_______________________ CTL_T(KC_Z), KC_X, KC_M, KC_C, KC_V
-
-#define _______________________HWORKMAN_R1_______________________ KC_J, KC_F, KC_U, KC_P, KC_SCLN
-#define _______________________HWORKMAN_R2_______________________ KC_Y, ALT_T(KC_N), GUI_T(KC_E), SFT_T(KC_O), KC_I
-#define _______________________HWORKMAN_R3_______________________ KC_K, KC_L, KC_COMM, KC_DOT, CTL_T(KC_SLASH)
-
-#define ___________________ERGODOX_BOTTOM_LEFT___________________ TT(_DIABLO), TT(_ADJUST), XXXXXXX, KC_UP, KC_LEFT
-#define ___________________ERGODOX_BOTTOM_RIGHT__________________ KC_RIGHT, KC_DOWN, TT(_RAISE), TT(_LOWER), TT(_ADJUST)
-
-// LEFT | RIGHT
-#define ______________________ERGODOX_THUMBS_____________________ KC_APP,KC_HOME, KC_PGUP,KC_ESC, \
- KC_END, KC_PGDOWN, \
- KC_LWSP,KC_BSPACE,JJ_COPY, JJ_PASTE,KC_TAB,KC_RSEN
diff --git a/keyboards/ergodox_ez/keymaps/bocaj/config.h b/keyboards/ergodox_ez/keymaps/bocaj/config.h
deleted file mode 100644
index 59605bc256..0000000000
--- a/keyboards/ergodox_ez/keymaps/bocaj/config.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef USERSPACE_CONFIG_H
- #define USERSPACE_CONFIG_H
-
- #ifndef 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,
- // and when this option isn't enabled, z rapidly followed by x
- // actually sends Ctrl-x. That's bad.)
- #define IGNORE_MOD_TAP_INTERRUPT
- #define PERMISSIVE_HOLD
- #undef PREVENT_STUCK_MODIFIERS
-
- // Disable action_get_macro and fn_actions, since we don't use these
- // and it saves on space in the firmware.
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-
-#endif // !USERSPACE_CONFIG_H
diff --git a/keyboards/ergodox_ez/keymaps/bocaj/keymap.c b/keyboards/ergodox_ez/keymaps/bocaj/keymap.c
deleted file mode 100644
index 07117f1164..0000000000
--- a/keyboards/ergodox_ez/keymaps/bocaj/keymap.c
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
-Copyright 2018 Jacob Jerrell <jacob.jerrell@gmail.com>
-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 QMK_KEYBOARD_H
-#include "bocaj.h"
-
-#ifdef UNICODEMAP_ENABLE
-#include "bocaj_unicode.h"
-#endif // UNICODEMAP_ENABLE
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-/* Software Workman / QWERTY - http://www.keyboard-layout-editor.com/#/gists/b6c016a22a9d31381a276a603a42fe5f
- .---------------------------------------------. .---------------------------------------------.
- | ESC | 1 | 2 | 3 | 4 | 5 | -> | ! - | 6 | 7 | 8 | 9 | 0 | = |
- !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
- | DEL | Q | W | E | R | T | ( | ! ) | Y | U | I | O | P | \ |
- !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
- | ADJST | A | S | D | F | G |-------! !-------! H | J | K | L | ; | ' |
- !-------+-----+-----+-----x-----x-----! HYP ! ! MEH !-----x-----x-----+-----+-----+-------!
- | SHIFT | Z | X | C | V | B | { | ! } | N | M | , | . | / | SHIFT |
- '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
- | GAME | NUM | VRS | UP | LFT | .---------------. .---------------. ! RGT | DWN | RSE | LWR | ADJ |
- '------------------------------' | APP | HOME | ! PGUP | ESC | '------------------------------'
- .-------+-------+-------! !-------+-------+-------.
- ! SPACE ! | END | ! PGDN | ! ENTER !
- ! / ! BSPCE !-------! !-------! TAB ! / !
- | LOWER | | COPY | ! PASTE | | RAISE |
- '-----------------------' '-----------------------'
-*/
- [_SWRKMN] = LAYOUT_ergodox_pretty_wrapper(
- KC_ESC, ______________________NUMBER_LEFT________________________, JJ_ARRW, KC_MINUS, ______________________NUMBER_RIGHT_______________________, KC_EQUAL,
- KC_DEL, _______________________SWORKMAN_L1_______________________, KC_LPRN, KC_RPRN, _______________________SWORKMAN_R1_______________________, KC_BSLS,
- KC_ADJS,_______________________SWORKMAN_L2_______________________, _______________________SWORKMAN_R2_______________________, KC_QUOTE,
- KC_LSFT,_______________________SWORKMAN_L3_______________________, HYP_LBK, MEH_RBK, _______________________SWORKMAN_R3_______________________, KC_RSFT,
- ___________________ERGODOX_BOTTOM_LEFT___________________, ___________________ERGODOX_BOTTOM_RIGHT__________________,
- ______________________ERGODOX_THUMBS_____________________
- ),
-/* Hardware Workman - http://www.keyboard-layout-editor.com/#/gists/7a07cb982ec3597ba3e3d947554225f1
- .---------------------------------------------. .---------------------------------------------.
- | ESC | 1 | 2 | 3 | 4 | 5 | -> | ! - | 6 | 7 | 8 | 9 | 0 | = |
- !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
- | DEL | Q | D | R | W | B | ( | ! ) | J | F | U | P | ; | \ |
- !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
- | ADJST | A | S | H | T | G |-------! !-------! Y | N | E | O | I | ' |
- !-------+-----+-----+-----x-----x-----! HYP ! ! MEH !-----x-----x-----+-----+-----+-------!
- | SHIFT | Z | X | M | C | V | { | ! } | K | L | , | . | / | SHIFT |
- '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
- | GAME | NUM | VRS | UP | LFT | .---------------. .---------------. ! RGT | DWN | RSE | LWR | ADJ |
- '------------------------------' | APP | HOME | ! PGUP | ESC | '------------------------------'
- .-------+-------+-------! !-------+-------+-------.
- ! SPACE ! | END | ! PGDN | ! ENTER !
- ! / ! BSPCE !-------! !-------! TAB ! / !
- | LOWER | | COPY | ! PASTE | | RAISE |
- '-----------------------' '-----------------------'
-*/
- [_HWRKMN] = LAYOUT_ergodox_pretty_wrapper(
- KC_ESC, ______________________NUMBER_LEFT________________________, JJ_ARRW, KC_MINUS, ______________________NUMBER_RIGHT_______________________, KC_EQUAL,
- KC_DEL, _______________________HWORKMAN_L1_______________________, KC_LPRN, KC_RPRN, _______________________HWORKMAN_R1_______________________, KC_BSLS,
- KC_ADJS,_______________________HWORKMAN_L2_______________________, _______________________HWORKMAN_R2_______________________, KC_QUOTE,
- KC_LSFT,_______________________HWORKMAN_L3_______________________, HYP_LBK, MEH_RBK, _______________________HWORKMAN_R3_______________________, KC_RSFT,
- ___________________ERGODOX_BOTTOM_LEFT___________________, ___________________ERGODOX_BOTTOM_RIGHT__________________,
- ______________________ERGODOX_THUMBS_____________________
- ),
-/* Lower - http://www.keyboard-layout-editor.com/#/gists/f1d745a88d1c48ab55e095efd9e7a43a
- .---------------------------------------------. .---------------------------------------------.
- | | F1 | F2 | F3 | F4 | F5 | | ! | F6 | F7 | F8 | F9 | F10 | |
- !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
- | ` | 1 | 2 | 3 | 4 | 5 | | ! | 6 | 7 | 8 | 9 | 0 | |
- !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
- | | | | | | |-------! !-------! | | | | | |
- !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
- | | | | | | | | ! | | | | | | |
- '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
- | | | | | | .---------------. .---------------. ! | | | | |
- '------------------------------' | | | ! | | '------------------------------'
- .-------+-------+-------! !-------+-------+-------.
- ! ! | | ! | ! !
- ! ! !-------! !-------! ! !
- | | | | ! | | |
- '-----------------------' '-----------------------'
-*/
- [_LOWER] = LAYOUT_ergodox_pretty_wrapper(
- _______,_______________________FUNC_LEFT_________________________, _______, _______, _______________________FUNC_RIGHT________________________, _______,
- KC_GRV ,______________________NUMBER_LEFT________________________, _______, _______, ______________________NUMBER_RIGHT_______________________, _______,
- _______,_________________________________________________________, _________________________________________________________, _______,
- _______,_________________________________________________________, _______, _______, _________________________________________________________, _______,
- _________________________________________________________, _________________________________________________________,
- ______________________ERGODOX_THUMBS_____________________
- ),
-/* Raise - http://www.keyboard-layout-editor.com/#/gists/e0f591ec2ce9f24675a02d15c7048b25
- .---------------------------------------------. .---------------------------------------------.
- | | F1 | F2 | F3 | F4 | F5 | | ! _ | F6 | F7 | F8 | F9 | F10 | |
- !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
- | ~ | ! | @ | # | $ | % | | ! | ^ | & | * | ( | ) | |
- !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
- | | | | | | |-------! !-------! | | | | | |
- !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
- | | | | | | | | ! | | | | | | |
- '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
- | | | | | | .---------------. .---------------. ! | | | | |
- '------------------------------' | | | ! | | '------------------------------'
- .-------+-------+-------! !-------+-------+-------.
- ! ! | | ! | ! !
- ! ! !-------! !-------! ! !
- | | | | ! | | |
- '-----------------------' '-----------------------'
-*/
- [_RAISE] = LAYOUT_ergodox_pretty_wrapper(
- _______,_______________________FUNC_LEFT_________________________, _______, KC_UNDS, _______________________FUNC_RIGHT________________________, _______,
- KC_TILD,______________________SPECIAL_LEFT_______________________, _______, _______, ______________________SPECIAL_RIGHT______________________, _______,
- _______,_________________________________________________________, _________________________________________________________, _______,
- _______,_________________________________________________________, _______, _______, _________________________________________________________, _______,
- _________________________________________________________, _________________________________________________________,
- ______________________ERGODOX_THUMBS_____________________
- ),
- /* Adjust - http://www.keyboard-layout-editor.com/#/gists/dedeae17b35a5d5f745a42aaea78f007
- .---------------------------------------------. .---------------------------------------------.
- | | | | | | | EPRM | ! EPRM | | | | | | |
- !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
- | | | | | | | | ! | | 7 | 8 | 9 | * | |
- !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
- | | 🔇 | 🔉 | 🔊 | LCK | |-------! !-------! | 4 | 5 | 6 | + | SWRKM |
- !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
- | | | | | | | | ! | | 1 | 2 | 3 | - | HWRKM |
- '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
- | | | | | | .---------------. .---------------. ! 0 | . | , | = | |
- '------------------------------' | | | ! | | '------------------------------'
- .-------+-------+-------! !-------+-------+-------.
- ! ! | | ! | ! !
- ! ! !-------! !-------! ! !
- | | | | ! | | |
- '-----------------------' '-----------------------'
-*/
- [_ADJUST] = LAYOUT_ergodox_pretty_wrapper(
- XXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, KC_EPRM, KC_EPRM, XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX,
- XXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_7, KC_KP_8, KC_KP_9, KC_PAST, XXXXXXX,
- _______,KC__MUTE, KC__VOLDOWN, KC__VOLUP, MC_LOCK, XXXXXXX, XXXXXXX, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, KC_SWRK,
- XXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, KC_PMNS, KC_HWRK,
- XXXXXXX,_______,XXXXXXX,XXXXXXX,XXXXXXX, KC_KP_0, KC_PDOT, KC_COMM, KC_PEQL, _______,
- ______________________ERGODOX_THUMBS_____________________
- ),
-// Diablo - http://www.keyboard-layout-editor.com/#/gists/28476e4237e77d4835ac8a9d7e5f9b2c
- [_DIABLO] = LAYOUT_ergodox_pretty_wrapper(
- KC_ESC , KC_V , KC_D ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
- KC_TAB , KC_S , KC_I , KC_F , KC_T , KC_J ,XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_7, KC_KP_8, KC_KP_9, XXXXXXX, XXXXXXX,
- KC_Q , KC_1 , KC_2 , KC_3 , KC_4 , KC_M , XXXXXXX, KC_KP_4, KC_KP_5, KC_KP_6, XXXXXXX, XXXXXXX,
- KC_LSFT,KC_D3_1 ,KC_D3_2 ,KC_D3_3 ,KC_D3_4 ,XXXXXXX ,XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, XXXXXXX, XXXXXXX,
- _______,ALT_T(KC_Z) ,KC_G ,KC_Y ,XXXXXXX , KC_KP_0, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
- XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,
- XXXXXXX, XXXXXXX,
- KC_BTN1,KC_BTN2,KC_DIABLO_CLEAR, XXXXXXX,XXXXXXX,XXXXXXX
- )
-};
-
-// Defines actions for my custom keycodes
-bool process_record_user(uint16_t keycode, keyrecord_t *record) {
- switch (keycode) {
- // KC_COPY and KC_PASTE have problems with different hardware/software mappings
- // e.g. If the mappings conflict, KC_COPY will send Cmd+M which minimizes the
- // window and is very annoying. JJ_COPY and JJ_PASTE fix this by sending the
- // raw character rather than the KC_* code
- case JJ_COPY:
- if (!record->event.pressed) {
- SEND_STRING(SS_LGUI("c"));
- }
- return false;
- break;
- case JJ_PASTE:
- if (!record->event.pressed) {
- SEND_STRING(SS_LGUI("v"));
- }
- return false;
- break;
- case JJ_ARRW:
- if (!record->event.pressed) {
- SEND_STRING("->");
- }
- return false;
- break;
- case KC_SWRK:
- if (!record->event.pressed) {
- set_single_persistent_default_layer(_SWRKMN);
- layer_move(_SWRKMN);
- ergodox_blink_all_leds();
- ergodox_blink_all_leds();
- }
- return false;
- break;
- case KC_HWRK:
- if (!record->event.pressed) {
- set_single_persistent_default_layer(_HWRKMN);
- layer_move(_HWRKMN);
- ergodox_blink_all_leds();
- ergodox_blink_all_leds();
- }
- return false;
- break;
- case KC_EPRM:
- if (!record->event.pressed) {
- ergodox_blink_all_leds();
- eeconfig_init();
- }
- return false;
- break;
- case MC_LOCK:
- if (!record->event.pressed) {
- layer_move(_HWRKMN);
- SEND_STRING(SS_LCTRL(SS_LGUI("q")));
- }
- return false;
- break;
- case KC_DIABLO_CLEAR:
-#ifdef TAP_DANCE_ENABLE
- if (record->event.pressed) {
- uint8_t dtime;
- for (dtime = 0; dtime < 4; dtime++) {
- diablo_key_time[dtime] = diablo_times[0];
- }
- }
-#endif // TAP_DANCE_ENABLE
- return false;
- break;
- }
- return true;
-}
-
-void tap(uint16_t keycode){ register_code(keycode); unregister_code(keycode); };
-
-// Diablo III Fun stuff
-//define diablo macro timer variables
-uint16_t diablo_timer[4];
-uint8_t diablo_times[] = { 0, 1, 3, 5, 10, 30 };
-uint8_t diablo_key_time[4];
-
-// has the correct number of seconds elapsed (as defined by diablo_times)
-bool check_dtimer(uint8_t dtimer) { return (timer_elapsed(diablo_timer[dtimer]) < (diablo_key_time[dtimer] * 1000)) ? false : true; };
-
-// 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, uint8_t diablo_key) {
- if (state->count >= 7) {
- diablo_key_time[diablo_key] = diablo_times[0];
- reset_tap_dance(state);
- } else {
- diablo_key_time[diablo_key] = diablo_times[state->count - 1];
- }
-}
-
-// Would rather have one function for all of this, but no idea how to do that...
-void diablo_tapdance1(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 0); }
-void diablo_tapdance2(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 1); }
-void diablo_tapdance3(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 2); }
-void diablo_tapdance4(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 3); }
-
-//Tap Dance Definitions
-qk_tap_dance_action_t tap_dance_actions[] = {
- // tap once to disable, and more to enable timed micros
- [TD_D3_1] = ACTION_TAP_DANCE_FN(diablo_tapdance1),
- [TD_D3_2] = ACTION_TAP_DANCE_FN(diablo_tapdance2),
- [TD_D3_3] = ACTION_TAP_DANCE_FN(diablo_tapdance3),
- [TD_D3_4] = ACTION_TAP_DANCE_FN(diablo_tapdance4),
-};
-
-// Sends the key press to system, but only if on the Diablo layer
-void send_diablo_keystroke(uint8_t diablo_key) {
- if (biton32(layer_state) == _DIABLO) {
- switch (diablo_key) {
- case 0:
- tap(KC_1); break;
- case 1:
- tap(KC_2); break;
- case 2:
- tap(KC_3); break;
- case 3:
- tap(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_key_time[dtime]) {
- diablo_timer[dtime] = timer_read();
- send_diablo_keystroke(dtime);
- }
- }
-}
-
-void matrix_scan_user(void) {
- uint8_t layer = biton32(layer_state);
- ergodox_board_led_off();
- ergodox_right_led_1_off();
- ergodox_right_led_2_off();
- ergodox_right_led_3_off();
- switch (layer) {
- /*
- Lights are treated as binary here for easy identification.
- LED1 = 4; LED2 = 2; LED1 = 1
- This allows for up to 8 identified layers (default layers being no lights on)
- Which is way more than I should ever need
- */
- case _LOWER:
- ergodox_right_led_3_on();
- ergodox_right_led_3_set(10); // Default brightness is deadly in a dark room
- break;
- case _RAISE:
- ergodox_right_led_2_on();
- ergodox_right_led_2_set(10);
- break;
- case _ADJUST:
- ergodox_right_led_2_on();
- ergodox_right_led_2_set(10);
- ergodox_right_led_3_on();
- ergodox_right_led_3_set(10);
- break;
- case _DIABLO:
- ergodox_right_led_1_on();
- ergodox_right_led_1_set(10);
- break;
- default:
- // none
- break;
- }
- #ifdef TAP_DANCE_ENABLE
- run_diablo_macro_check();
- #endif
-};
diff --git a/keyboards/ergodox_ez/keymaps/bocaj/readme.md b/keyboards/ergodox_ez/keymaps/bocaj/readme.md
deleted file mode 100644
index 9d5aa60501..0000000000
--- a/keyboards/ergodox_ez/keymaps/bocaj/readme.md
+++ /dev/null
@@ -1,48 +0,0 @@
-# Ergodox EZ Layout by JacobJerrell
-
-My personal Ergodox EZ layout.
-
-## Summary
-
-Contains two base layers because I carry my keyboard between different machines and occassionally use the machines without this keyboard. A side-effect to using it in this manner (with a non-QWERTY layout) is that software/hardware mappings conflict so this allows a quick (2-buttons) to get the keyboard to a compatible layer
-
-## Layers
-
-| Layer | Purpose |
-| ----- | ------- |
-| 0 | [Hardware Workman](#hardware-workman) - For OS mapped to QWERTY |
-| 1 | [Software Workman](#software-workman) - For OS mapped to Workman |
-| 2 | [Lower](#lower) |
-| 3 | [Raise](#raise) |
-| 4 | [Adjust](#adjust) |
-| 5 | [Diablo III](#diablo-iii) |
-
-### Hardware Workman
-
-For easy plug and play into QWERTY machines
-![Hardware Workman](https://imgur.com/HHMIOEf.png)
-
-### Software Workman
-
-To switch to when I was previously using the laptop keyboard with software mapped to Workman. Or so other people can take the Ergodox for a spin.
-![Software Workman](https://imgur.com/WnSci7o.png)
-
-### Lower
-
-Reveals F1-12 keys and brings numkeys down.
-![Lowered](https://imgur.com/mGfjwcn.png)
-
-### Raise
-
-Reveals F1-F12 keys and gives shifted numkeys.
-![Raised](https://imgur.com/NC96Jus.png)
-
-### Adjust
-
-Numpad, Wipe EEPROM, OSX Volume Control, OSX Lockscreen, and Default Layer Switching.
-![Adjusted](https://imgur.com/aQtOxZU.png)
-
-### Diablo III
-
-Arranged to make playing on a laptop much more enjoyable. Credit for the D1-4 macros (as well as much of the ideas in this layout goes to Drashna)
-![Diablo III](https://imgur.com/5eQcDOQ.png)
diff --git a/keyboards/ergodox_ez/keymaps/bocaj/rules.mk b/keyboards/ergodox_ez/keymaps/bocaj/rules.mk
deleted file mode 100644
index b667841a18..0000000000
--- a/keyboards/ergodox_ez/keymaps/bocaj/rules.mk
+++ /dev/null
@@ -1,5 +0,0 @@
-AUTO_SHIFT_ENABLE = no
-COMMAND_ENABLE = no
-SWAP_HANDS_ENABLE = no
-TAP_DANCE_ENABLE = yes
-EXTRAKEY_ENABLE = no
diff --git a/keyboards/ergodox_ez/keymaps/default/keymap.c b/keyboards/ergodox_ez/keymaps/default/keymap.c
index e400ffcd37..5834fa43af 100644
--- a/keyboards/ergodox_ez/keymaps/default/keymap.c
+++ b/keyboards/ergodox_ez/keymaps/default/keymap.c
@@ -1,6 +1,4 @@
#include QMK_KEYBOARD_H
-#include "debug.h"
-#include "action_layer.h"
#include "version.h"
#define BASE 0 // default layer
@@ -8,8 +6,7 @@
#define MDIA 2 // media keys
enum custom_keycodes {
- PLACEHOLDER = SAFE_RANGE, // can always be here
- EPRM,
+ EPRM = SAFE_RANGE,
VRSN,
RGB_SLD
};
@@ -36,28 +33,26 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | |ace | End | | PgDn | | |
* `--------------------' `----------------------'
*/
-// If it accepts an argument (i.e, is a function), it doesn't need KC_.
-// Otherwise, it needs KC_*
-[BASE] = LAYOUT_ergodox( // layer 0 : default
- // left hand
- KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT,
- KC_DELT, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB),
- KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G,
- KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO),
- LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT,
- ALT_T(KC_APP), KC_LGUI,
- KC_HOME,
- KC_SPC,KC_BSPC,KC_END,
- // right hand
- KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
- TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
- KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),GUI_T(KC_QUOT),
- MEH_T(KC_NO),KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT,
- KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1,
- KC_LALT, CTL_T(KC_ESC),
- KC_PGUP,
- KC_PGDN,KC_TAB, KC_ENT
- ),
+[BASE] = LAYOUT_ergodox(
+ // left hand
+ KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT,
+ KC_DELT, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB),
+ KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G,
+ KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO),
+ LT(SYMB,KC_GRV), KC_QUOT, LALT(KC_LSFT), KC_LEFT, KC_RGHT,
+ ALT_T(KC_APP), KC_LGUI,
+ KC_HOME,
+ KC_SPC, KC_BSPC, KC_END,
+ // right hand
+ KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
+ TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
+ KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN), GUI_T(KC_QUOT),
+ MEH_T(KC_NO), KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLSH), KC_RSFT,
+ KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, KC_FN1,
+ KC_LALT, CTL_T(KC_ESC),
+ KC_PGUP,
+ KC_PGDN, KC_TAB, KC_ENT
+),
/* Keymap 1: Symbol Layer
*
* ,---------------------------------------------------. ,--------------------------------------------------.
@@ -79,26 +74,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | |
* `--------------------' `--------------------'
*/
-// SYMBOLS
[SYMB] = LAYOUT_ergodox(
- // left hand
- VRSN, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
- KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
- KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
- KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
- EPRM,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
- RGB_MOD,KC_TRNS,
- KC_TRNS,
- RGB_VAD,RGB_VAI,KC_TRNS,
- // right hand
- KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
- KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
- KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
- KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
- KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS,
- RGB_TOG, RGB_SLD,
- KC_TRNS,
- KC_TRNS, RGB_HUD, RGB_HUI
+ // left hand
+ VRSN, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
+ KC_TRNS, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, KC_TRNS,
+ KC_TRNS, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRV,
+ KC_TRNS, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, KC_TRNS,
+ EPRM, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ RGB_MOD, KC_TRNS,
+ KC_TRNS,
+ RGB_VAD, RGB_VAI, KC_TRNS,
+ // right hand
+ KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
+ KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
+ KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
+ KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
+ KC_TRNS, KC_DOT, KC_0, KC_EQL, KC_TRNS,
+ RGB_TOG, RGB_SLD,
+ KC_TRNS,
+ KC_TRNS, RGB_HUD, RGB_HUI
),
/* Keymap 2: Media and mouse keys
*
@@ -121,25 +115,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | |
* `--------------------' `--------------------'
*/
-// MEDIA AND MOUSE
[MDIA] = LAYOUT_ergodox(
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
- KC_TRNS, KC_TRNS,
- KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS,
- // right hand
- 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_MPLY,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
- KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS,
- KC_TRNS,
- KC_TRNS, KC_TRNS, KC_WBAK
+ // left hand
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS,
+ // right hand
+ 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_MPLY,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
+ KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_WBAK
),
};
@@ -147,47 +141,21 @@ const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
};
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
- // MACRODOWN only works in this function
- switch(id) {
- case 0:
- if (record->event.pressed) {
- SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
- }
- break;
- case 1:
- if (record->event.pressed) { // For resetting EEPROM
- eeconfig_init();
- }
- break;
- }
- return MACRO_NONE;
-};
-
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
- switch (keycode) {
- // dynamically generate these.
- case EPRM:
- if (record->event.pressed) {
+ if (record->event.pressed) {
+ switch (keycode) {
+ case EPRM:
eeconfig_init();
- }
- return false;
- break;
- case VRSN:
- if (record->event.pressed) {
+ return false;
+ case VRSN:
SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
- }
- return false;
- break;
- case RGB_SLD:
- if (record->event.pressed) {
- #ifdef RGBLIGHT_ENABLE
- rgblight_mode(1);
- #endif
- }
- return false;
- break;
+ return false;
+ #ifdef RGBLIGHT_ENABLE
+ case RGB_SLD:
+ rgblight_mode(1);
+ return false;
+ #endif
+ }
}
return true;
}
@@ -199,11 +167,6 @@ void matrix_init_user(void) {
#endif
};
-// Runs constantly in the background, in a loop.
-void matrix_scan_user(void) {
-
-};
-
// Runs whenever there is a layer state change.
uint32_t layer_state_set_user(uint32_t state) {
ergodox_board_led_off();
@@ -266,7 +229,7 @@ uint32_t layer_state_set_user(uint32_t state) {
ergodox_right_led_2_on();
ergodox_right_led_3_on();
#ifdef RGBLIGHT_COLOR_LAYER_7
- rgblight_setrgb(RGBLIGHT_COLOR_LAYER_6);
+ rgblight_setrgb(RGBLIGHT_COLOR_LAYER_7);
#endif
break;
default:
diff --git a/keyboards/ergodox_ez/keymaps/default_glow/keymap.c b/keyboards/ergodox_ez/keymaps/default_glow/keymap.c
new file mode 100644
index 0000000000..526c364029
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/default_glow/keymap.c
@@ -0,0 +1 @@
+// Placeholder. See ../default/keymap.c for details
diff --git a/keyboards/ergodox_ez/keymaps/default_glow/rules.mk b/keyboards/ergodox_ez/keymaps/default_glow/rules.mk
new file mode 100644
index 0000000000..360c3c51b8
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/default_glow/rules.mk
@@ -0,0 +1,4 @@
+RGBLIGHT_ENABLE = no
+RGB_MATRIX_ENABLE = yes # enable later
+
+SRC += ../default/keymap.c
diff --git a/keyboards/ergodox_ez/keymaps/dvorak_42_key/keymap.c b/keyboards/ergodox_ez/keymaps/dvorak_42_key/keymap.c
index 94d035c6b9..dd5ee28979 100644
--- a/keyboards/ergodox_ez/keymaps/dvorak_42_key/keymap.c
+++ b/keyboards/ergodox_ez/keymaps/dvorak_42_key/keymap.c
@@ -230,7 +230,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, SHELL_EXPAND_OE_TRANPATTERN,
RCTL(KC_L), RCTL(KC_W), KC_HOME, KC_UP, KC_END, KC_TRNS, SHELL_EXPAND_OE_LOGPATTERN,
LALT(KC_B), KC_LEFT, KC_DOWN, KC_RIGHT, LALT(KC_F), RCTL(KC_W),
- RCTL(KC_C), RCTL(KC_U), LALT(KC_DOT), RCTL(KC_R), MEH(KC_V), RCTL(KC_K), SHELL_DUMPTLOG,
+ RCTL(KC_C), RCTL(KC_U), LALT(KC_DOT), RCTL(KC_R), KC_BTN2, RCTL(KC_K), SHELL_DUMPTLOG,
// bottom row (match functionality of base layer)
KC_BSPC, RCTL(KC_W), KC_DELETE, LALT(KC_D), RCTL(KC_U),
// thumb cluster
diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/.gitignore b/keyboards/ergodox_ez/keymaps/hacker_dvorak/.gitignore
new file mode 100644
index 0000000000..504afef81f
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/.gitignore
@@ -0,0 +1,2 @@
+node_modules/
+package-lock.json
diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/config.h b/keyboards/ergodox_ez/keymaps/hacker_dvorak/config.h
new file mode 100644
index 0000000000..e188d95d51
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/config.h
@@ -0,0 +1,88 @@
+/*
+ Set any config.h overrides for your specific keymap here.
+ See config.h options at https://docs.qmk.fm/#/config_options?id=the-configh-file
+*/
+#pragma once
+
+
+#undef TAPPING_TERM
+#define TAPPING_TERM 200
+
+#undef DEBOUNCE
+#define DEBOUNCE 10
+
+#undef IGNORE_MOD_TAP_INTERRUPT
+
+#undef FORCE_NKRO
+#define FORCE_NKRO
+
+#undef TAPPING_TOGGLE
+#define TAPPING_TOGGLE 5
+
+#define LEADER_TIMEOUT 1000
+#define IGNORE_MOD_TAP_INTERRUPT
+#define PERMISSIVE_HOLD
+#define QMK_KEYS_PER_SCAN 4
+#define DANCING_TERM 175
+
+#define ONESHOT_TAP_TOGGLE 5
+#define ONESHOT_TIMEOUT 5000
+
+#define COMBO_COUNT 4
+#define COMBO_TERM 200
+
+
+#undef RGBLIGHT_HUE_STEP
+#define RGBLIGHT_HUE_STEP 24
+
+#undef RGBLIGHT_SAT_STEP
+#define RGBLIGHT_SAT_STEP 24
+
+#undef RGBLIGHT_VAL_STEP
+#define RGBLIGHT_VAL_STEP 24
+
+#undef RGBLIGHT_BRI_STEP
+#define RGBLIGHT_BRI_STEP 24
+
+#undef RGBLIGHT_LIMIT_VAL
+#define RGBLIGHT_LIMIT_VAL 255
+
+
+#undef MOUSEKEY_INTERVAL
+#define MOUSEKEY_INTERVAL 10
+
+#undef MOUSEKEY_DELAY
+#define MOUSEKEY_DELAY 15
+
+#undef MOUSEKEY_MAX_SPEED
+#define MOUSEKEY_MAX_SPEED 20
+
+#undef MOUSEKEY_TIME_TO_MAX
+#define MOUSEKEY_TIME_TO_MAX 200
+
+#undef MOUSEKEY_WHEEL_MAX_SPEED
+#define MOUSEKEY_WHEEL_MAX_SPEED 20
+
+#undef MOUSEKEY_WHEEL_TIME_TO_MAX
+#define MOUSEKEY_WHEEL_TIME_TO_MAX 200
+
+
+// #undef NO_DEBUG
+// #define NO_DEBUG
+
+// #undef NO_PRINT
+// #define NO_PRINT
+
+// #define RETRO_TAPPING
+// #define TAPPING_FORCE_HOLD
+
+// #define AUTO_SHIFT_TIMEOUT 150
+// #define NO_AUTO_SHIFT_SPECIAL
+// #define NO_AUTO_SHIFT_NUMERIC
+// #define NO_AUTO_SHIFT_ALPHA
+
+// #define EXTRA_LONG_COMBOS
+// #define EXTRA_EXTRA_LONG_COMBOS
+// #define COMBO_ALLOW_ACTION_KEYS
+
+// #define RGBLIGHT_SLEEP
diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/gulpfile.js b/keyboards/ergodox_ez/keymaps/hacker_dvorak/gulpfile.js
new file mode 100644
index 0000000000..23f19d18af
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/gulpfile.js
@@ -0,0 +1,19 @@
+let gulp = require('gulp');
+let run = require('gulp-run-command').default;
+
+
+gulp.task('clean', run('rm -rf ../../../../.build'));
+
+gulp.task('build', ['clean'], run('make -C ../../../../ ergodox_ez:hacker_dvorak', {
+ ignoreErrors: true
+}));
+
+gulp.task('watch', ['build'], () => {
+ gulp.watch([
+ 'keymap.c',
+ 'config.h',
+ 'rules.mk',
+ ], ['build']);
+});
+
+gulp.task('default', ['watch']);
diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/hacker_dvorak.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/hacker_dvorak.c
new file mode 100644
index 0000000000..65878a67cb
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/hacker_dvorak.c
@@ -0,0 +1,353 @@
+// Keyboard keymap:
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [DVORAK] = LAYOUT_ergodox(
+
+ // HACKER DVORAK left hand
+
+ //------------------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+------------------------//
+ // ESCAPE | | | | | | START RECORDING //
+ // | | | | | | //
+ KC_ESC, TD(GRV_TILD), TD(AT_DLR), TD(LCBR_LABK), TD(LPRN_LBRC), TD(EXLM_QUES), DYN_REC_START1, //
+ // | ~ | $ | < | [ | ? | //
+ // | TAP DANCE: ` | TAP DANCE: @ TAP DANCE: { | TAP DANCE: ( | TAP DANCE: ! | DYNAMIC MARCO 1 //
+ //------------------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+------------------------//
+ // TAB | MOD TAP: ALT+SHIFT | MOD TAP: CTRL+ALT | MOD TAP: CTRL+SHIFT | P | Y | //
+ // | | | | | | //
+ KC_TAB, TD(NONE_LEAD), TD(QUOT_DQUO), TD(DOT_COMM), ALL_T(KC_P), MEH_T(KC_Y), DYN_MACRO_PLAY1, //
+ // | LEAD | " | , | | | //
+ // | TAP DANCE: NONE | TAP DANCE: ' | TAP DANCE: . | MOD TAP: HYPER | MOD TAP: MEH | //
+ //------------------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------| PLAY DYNAMIC MACRO 1 //
+ // | MOD TAP: ALT | MOD TAP: CTRL | LAYER TAP: SHIFT | LAYER TAP: ARROW KEYS | MOD TAP: GUI | //
+ // | | | | Ü | | //
+ TD(EQL_PLUS), ALT_T(KC_A), CTL_T(KC_O), SFT_T(KC_E), LT(ARROWS, KC_U), LGUI_T(KC_I), //-----------------------//
+ // + | Á | Ó | É | Ú | Í | //
+ // TAP DANCE: = | TAP DANCE: A | TAP DANCE: O | TAP DANCE: E | TAP DANCE: U | TAP DANCE: I | //
+ //------------------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------| META //
+ // STOP RECORDING | MOD TAP: GUI+SHIFT+ALT | Q | J | K | X | //
+ // | | | | | | //
+ DYN_REC_STOP, TD(SCLN_COLN), SGUI_T(KC_Q), LT(MEDIA_FN, KC_J), LT(NUMPAD, KC_K), LCAG_T(KC_X), KC_LGUI, //
+ // | : | | | | | //
+ // DYNAMIC MACRO | TAP DANCE: ; | MOD TAP: SHIFT+GUI | LAYER TAP: MEDIA/F-KEYS | LAYER TAP: ATM NUMPAD | MOD TAP: CTL+ALT+GUI | //
+ //------------------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+------------------------//
+ // LAYERS SWITCHER | APPLICATION MENU | | | //
+ // | | | | SCROLL //
+ TG(LAYERS), KC_APP, KC_NLCK, KC_SLCK, KC_CAPS, //
+ // | | | | NUM //
+ // LAYER TOGGLE | | | | TAP DANCE: CAPS //
+ //------------------------+-------------------------+-------------------------+-------------------------+------------------------//
+
+ // HACKER DVORAK left thumb
+
+ //------------------------+------------------------//
+ // MOUSE WHEEL LEFT | MOUSE WHEEL RIGHT //
+ // | //
+ KC_WH_L, KC_WH_R, //
+ // | //
+ // | //
+ //-------------------------+-------------------------+------------------------//
+ // | | HOME //
+ // | | //
+ /* SPACE | BACKSPACE */ KC_HOME, //
+ // | | //
+ // | | //
+ KC_SPC, KC_BSPC, //-----------------------//
+ // | | END //
+ // | | //
+ /* | */ KC_END, //
+ // | | //
+ // | | //
+ //-------------------------+-------------------------+------------------------//
+
+ // HACKER DVORAK right hand
+
+ //------------------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+------------------------//
+ // | | | | | | //
+ // | | | | | | //
+ DYN_REC_START2, TD(APMR_PIPE), TD(RPRN_RBRC), TD(RCBR_RABK), TD(HASH_PERC), TD(ASTR_CIRC), XXXXXXX, //
+ // | | | | | | //
+ // | | | | | | //
+ //------------------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+------------------------//
+ // | | | | | | //
+ // | | | | | | //
+ DYN_MACRO_PLAY2, MEH_T(KC_F), ALL_T(KC_G), C_S_T(KC_C), LCA_T(KC_R), LAS_T(KC_L), TD(SLSH_BSLS), //
+ // | | | | | | //
+ // | | | | | | //
+ // |-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+------------------------//
+ // | | | | | | //
+ // | | | | | | //
+ /*-----------------------*/ LGUI_T(KC_D), LT(MOUSE, KC_H), SFT_T(KC_T), CTL_T(KC_N), ALT_T(KC_S), TD(MINS_UNDS), //
+ // | | | | | | //
+ // | | | | | | //
+ // |-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+------------------------//
+ // | | | | | | //
+ // | | | | | | //
+ KC_LGUI, LCAG_T(KC_B), LT(HYPER, KC_M), LT(MEDIA_FN, KC_W), SGUI_T(KC_V), LGAS_T(KC_Z), COMPOSE, //
+ // | | | | | | //
+ // | | | | | | ⎄ //
+ //------------------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+------------------------//
+ // | | | | //
+ // | | | | //
+ KC_LEFT, KC_UP, KC_DOWN, KC_RGHT, KC_SYSREQ, //
+ // | | | | //
+ // | | | | //
+ //------------------------+-------------------------+-------------------------+-------------------------+------------------------//
+
+ // HACKER DVORAK right thumb
+
+ //------------------------+------------------------//
+ // | //
+ // | //
+ KC_WH_U, KC_WH_D, //
+ // | //
+ // | //
+ //------------------------+-------------------------+------------------------//
+ // | | //
+ // | | //
+ KC_PGUP, // | //
+ // | | //
+ // | | //
+ //------------------------| | //
+ // | | //
+ // | | //
+ KC_PGDN, KC_DEL, KC_ENT //
+ // | | //
+ // | | //
+ //------------------------+-------------------------+------------------------//
+
+ ),
+
+ [PLOVER] = LAYOUT_ergodox(
+ // left hand
+ XXXXXXX, XXXXXXX, KC_MS_BTN2, KC_MS_UP, KC_MS_BTN1, KC_MS_BTN3, GUI_T(KC_NO),
+ KC_ESC, KC_MS_BTN4, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_BTN5, PV_NUM,
+ KC_TAB, PV_LS, PV_LT, PV_LP, PV_LH, PV_STAR,
+ KC_CLCK, PV_LS, PV_LK, PV_LW, PV_LR, PV_STAR, PV_STAR,
+ XXXXXXX, TG(LAYERS), PV_NUM, PV_NUM, PV_NUM,
+
+ // left thumb
+ KC_SPACE, KC_BSPACE,
+ KC_HOME,
+ PV_A, PV_O, KC_END,
+
+ // right hand
+ KC_MS_ACCEL2, KC_MS_ACCEL1, KC_MS_ACCEL0, KC_UP, KC_APPLICATION, XXXXXXX, KC_MS_WH_UP,
+ PV_NUM, KC_MS_WH_LEFT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_MS_WH_RIGHT, KC_MS_WH_DOWN,
+ PV_STAR, PV_RF, PV_RP, PV_RL, PV_RT, PV_RD,
+ PV_STAR, PV_STAR, PV_RR, PV_RB, PV_RG, PV_RS, PV_RZ,
+ PV_NUM, PV_NUM, PV_NUM, PV_NUM, XXXXXXX,
+
+ // right thumb
+ KC_DELETE, KC_ENTER,
+ KC_PGUP,
+ KC_PGDOWN, PV_E, PV_U
+ ),
+
+ [GAMING] = LAYOUT_ergodox(
+ // left hand
+ KC_ESCAPE, GUI_T(KC_MINS), KC_I, KC_O, KC_P, ALGR_T(KC_EQL), KC_T,
+ KC_TAB, KC_LALT, KC_Q, KC_W, KC_E, ALL_T(KC_R), KC_G,
+ LT(MOUSE, KC_GRV), KC_LCTRL, KC_A, KC_S, KC_D, MEH_T(KC_F),
+ KC_BSLS, KC_LSHIFT, KC_Z, KC_X, KC_C, SCMD_T(KC_V), KC_M,
+ XXXXXXX, TG(LAYERS), KC_COMM, KC_DOT, KC_LBRC,
+
+ // left thumb
+ MO(MEDIA_FN), KC_NLCK,
+ KC_SCLN,
+ KC_SPACE, KC_ENTER, KC_BSPACE,
+
+ // right hand
+ KC_QUOT, KC_Y, KC_K, KC_U, KC_KP_7, KC_KP_8, KC_KP_9,
+ KC_MS_WH_UP, KC_H, KC_J, KC_L, KC_KP_4, KC_KP_2, KC_KP_6,
+ KC_B, KC_MS_UP, KC_N, KC_KP_1, KC_KP_5, KC_KP_3,
+ KC_MS_WH_DOWN, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_UP, KC_KP_0, KC_SLASH,
+ KC_RBRC, KC_LEFT, KC_DOWN, KC_RIGHT, XXXXXXX,
+
+ // right thumb
+ KC_MS_BTN5, MO(HYPER),
+ KC_MS_BTN4,
+ KC_MS_BTN3, KC_MS_BTN2, KC_MS_BTN1
+ ),
+
+ [ARROWS] = LAYOUT_ergodox(
+ // left hand
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, SCMD_T(KC_NO), MEH_T(KC_NO), ALL_T(KC_NO), XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, KC_LCTRL, KC_LSHIFT, XXXXXXX, _______, XXXXXXX,
+ XXXXXXX, KC_RALT, KC_LALT, GUI_T(KC_NO), XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // left thumb
+ XXXXXXX, XXXXXXX,
+ KC_HOME,
+ KC_SPACE, KC_BSPACE, KC_END,
+
+ // right hand
+ LGUI(KC_X), XXXXXXX, LCTL(KC_X), KC_MS_WH_UP, XXXXXXX, XXXXXXX, XXXXXXX,
+ LGUI(KC_C), XXXXXXX, LCTL(KC_C), KC_UP, SCTL(KC_C), LCTL(KC_Z), LGUI(KC_Z),
+ KC_MS_WH_LEFT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_MS_WH_RIGHT, KC_APPLICATION,
+ LGUI(KC_V), XXXXXXX, LCTL(KC_V), KC_MS_WH_DOWN, SCTL(KC_V), LCTL(KC_Y), SGUI(KC_Z),
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_SLCK,
+
+ // right thumb
+ XXXXXXX, XXXXXXX,
+ KC_PGUP,
+ KC_PGDOWN, KC_DELETE, KC_ENTER
+ ),
+
+ [MOUSE] = LAYOUT_ergodox(
+ // left hand
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_WH_UP, LCTL(KC_X), XXXXXXX, LGUI(KC_X),
+ LGUI(KC_Z), LCTL(KC_Z), SCTL(KC_C), KC_MS_UP, LCTL(KC_C), KC_MS_BTN4, LGUI(KC_C),
+ KC_MS_BTN3, KC_MS_WH_LEFT, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_WH_RIGHT,
+ LGUI(KC_Z), LCTL(KC_Y), SCTL(KC_V), KC_MS_WH_DOWN, LCTL(KC_V), KC_MS_BTN5, LGUI(KC_V),
+ KC_SLCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // left thumb
+ XXXXXXX, XXXXXXX,
+ XXXXXXX,
+ KC_MS_BTN1, KC_MS_BTN2, XXXXXXX,
+
+ // right hand
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, ALL_T(KC_NO), MEH_T(KC_NO), SCMD_T(KC_NO), XXXXXXX,
+ XXXXXXX, _______, KC_MS_ACCEL1, KC_LSHIFT, KC_LCTRL, KC_MS_ACCEL2,
+ XXXXXXX, XXXXXXX, XXXXXXX, GUI_T(KC_NO), KC_LALT, KC_RALT, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // right thumb
+ XXXXXXX, XXXXXXX,
+ XXXXXXX,
+ XXXXXXX, XXXXXXX, KC_MS_ACCEL0
+ ),
+
+ [NUMPAD] = LAYOUT_ergodox(
+ // left hand
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, GUI_T(KC_NO), XXXXXXX, ALL_T(KC_NO), XXXXXXX, XXXXXXX,
+ _______, KC_LCTRL, KC_LSHIFT, _______, MEH_T(KC_NO), XXXXXXX,
+ XXXXXXX, KC_RALT, KC_LALT, XXXXXXX, SCMD_T(KC_NO), XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // left thumb
+ XXXXXXX, XXXXXXX,
+ KC_HOME,
+ KC_SPACE, KC_BSPACE, KC_END,
+
+ // right hand
+ KC_X, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F,
+ KC_O, KC_I, KC_1, KC_2, KC_3, KC_SLSH, KC_PERC,
+ KC_M, KC_4, KC_5, KC_6, KC_PLUS, KC_MINS,
+ KC_L, KC_J, KC_7, KC_8, KC_9, KC_ASTR, KC_CIRC,
+ KC_DOT, KC_0, KC_COMM, KC_UNDS, KC_BSLS,
+
+ // right thumb
+ XXXXXXX, XXXXXXX,
+ KC_PGUP,
+ KC_PGDOWN, KC_DELETE, KC_ENTER
+ ),
+
+ [LAYERS] = LAYOUT_ergodox(
+ // left hand
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // left thumb
+ XXXXXXX, XXXXXXX,
+ XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // right hand
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, TO(DVORAK), TO(PLOVER), TO(GAMING), XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // right thumb
+ XXXXXXX, XXXXXXX,
+ XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX
+ ),
+
+ [MEDIA_FN] = LAYOUT_ergodox(
+ // left hand
+ KC_VOLD, KC_MUTE, RGB_TOG, XXXXXXX, KC_MAIL, KC_FIND, KC_WWW_REFRESH,
+ KC_MPRV, KC_F9, KC_F7, KC_F5, KC_F3, KC_F1, KC_WWW_HOME,
+ KC_PAUS, KC_F19, KC_F17, KC_F15, KC_F13, KC_F11,
+ RGB_HUD, XXXXXXX, XXXXXXX, _______, KC_F23, KC_F21, KC_WWW_BACK,
+ RGB_VAD, KC_CLCK, KC_PSCREEN, XXXXXXX, MO(FIRMWARE),
+
+ // left thumb
+ _______, XXXXXXX,
+ XXXXXXX,
+ XXXXXXX, XXXXXXX, KC_MEDIA_EJECT,
+
+ // right hand
+ KC_WWW_FAVORITES, KC_MYCM, KC_CALC, XXXXXXX, RGB_MOD, RGB_M_P, KC_VOLU,
+ KC_WWW_SEARCH, KC_F2, KC_F4, KC_F6, KC_F8, KC_F10, KC_MNXT,
+ KC_F12, KC_F14, KC_F16, KC_F18, KC_F20, KC_MPLY,
+ KC_WWW_FORWARD, KC_F22, KC_F24, _______, XXXXXXX, XXXXXXX, RGB_HUI,
+ KC_PWR, XXXXXXX, KC_SLEP, KC_WAKE, RGB_VAI,
+
+ // right thumb
+ XXXXXXX, XXXXXXX,
+ XXXXXXX,
+ RGB_GREEN, XXXXXXX, XXXXXXX
+ ),
+
+ [HYPER] = LAYOUT_ergodox(
+ // left hand
+ XXXXXXX, HYPR(KC_F1), HYPR(KC_F2), HYPR(KC_F3), HYPR(KC_F4), HYPR(KC_F5), XXXXXXX,
+ XXXXXXX, HYPR(KC_F6), HYPR(KC_F7), HYPR(KC_F8), HYPR(KC_F9), HYPR(KC_F10), XXXXXXX,
+ XXXXXXX, HYPR(KC_F11), HYPR(KC_F12), HYPR(KC_F13), HYPR(KC_F14), HYPR(KC_F15),
+ XXXXXXX, HYPR(KC_F16), HYPR(KC_F17), HYPR(KC_F18), HYPR(KC_F19), HYPR(KC_F20), XXXXXXX,
+ XXXXXXX, HYPR(KC_F21), HYPR(KC_F22), HYPR(KC_F23), HYPR(KC_F24),
+
+ // left thumb
+ XXXXXXX, XXXXXXX,
+ XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // right hand
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // right thumb
+ XXXXXXX, _______,
+ XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX
+ ),
+
+ [FIRMWARE] = LAYOUT_ergodox(
+
+ // left hand
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
+
+ // left thumb
+ XXXXXXX, XXXXXXX,
+ XXXXXXX,
+ RESET, XXXXXXX, XXXXXXX,
+
+ // right hand
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // right thumb
+ XXXXXXX, XXXXXXX,
+ XXXXXXX,
+ XXXXXXX, XXXXXXX, EEP_RST
+ )
+};
diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/keycodes/aliases_definitions.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/keycodes/aliases_definitions.c
new file mode 100644
index 0000000000..e5eba18202
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/keycodes/aliases_definitions.c
@@ -0,0 +1,5 @@
+// Keycode aliases
+#define SCTL(kc) LSFT(LCTL(kc)) // Modifier keys: SHIFT+CTRL+kc combination.
+#define LGAS_T(kc) MT(MOD_LGUI | MOD_LALT | MOD_LSFT, kc) // Mod tap: kc when tapped, GUI+ALT+SHIFT when held.
+#define LAS_T(kc) MT(MOD_LALT | MOD_LSFT, kc) // Mod tap: kc when tapped, ALT+SHIFT whin held.
+#define COMPOSE KC_RALT // Compose key (used to input characters like á, ñ, ü).
diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/keycodes/custom_keycodes.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/keycodes/custom_keycodes.c
new file mode 100644
index 0000000000..368062172b
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/keycodes/custom_keycodes.c
@@ -0,0 +1,8 @@
+// Define custom user keycodes:
+enum custom_keycodes {
+ PLACEHOLDER = SAFE_RANGE, // Can always be here.
+ RGB_GREEN, // To set default RGB layer as green once.
+ MY_CUSTOM_MACRO, // Custom macro example.
+ MY_OTHER_MACRO, // Custom macro example.
+ DYNAMIC_MACRO_RANGE // Should always be the last.
+};
diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/keymap.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/keymap.c
new file mode 100644
index 0000000000..af06d2bd81
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/keymap.c
@@ -0,0 +1,19 @@
+#include QMK_KEYBOARD_H // Includes the QMK-verse.
+#include "keymap_plover.h" // Includes the Plover keymap for easier readability.
+
+
+// TODO: No eeprom changes unless needed, custom rgb settings for animations.
+#include "keycodes/aliases_definitions.c"
+#include "layers/layers_definitions.c"
+#include "tap_dance/tap_dance_setup.c"
+#include "tap_dance/tap_dances.c"
+#include "user/matrix_scan_user.c"
+#include "tap_dance/mod_tap_layer_dances/none_lead.c"
+#include "tap_dance/tap_dance_actions.c"
+#include "keycodes/custom_keycodes.c"
+#include "dynamic_macro.h" // Includes dynamic macro definitions, needed *after* the custom keycodes.
+#include "hacker_dvorak.c"
+#include "user/eeconfig_init_user.c"
+#include "user/process_record_user.c"
+#include "plover/plover_mode.c"
+#include "user/layer_set_state_user.c"
diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/layers/layers_definitions.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/layers/layers_definitions.c
new file mode 100644
index 0000000000..f190e4f6f9
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/layers/layers_definitions.c
@@ -0,0 +1,12 @@
+enum layers { // Hacker Dvorak keyboard layers:
+ DVORAK = 0, // * Dvorak base layer.
+ PLOVER = 1, // * Steno layer for use with Plover.
+ GAMING = 2, // * Gaming layer intended for general purpose playing.
+ ARROWS = 3, // * Arrows movement keys and edition shortcuts.
+ MOUSE = 4, // * Mouse movement keys and edition shortcuts.
+ NUMPAD = 5, // * ATM style numpad with symbols and letters that should suffice to input any numeric literal.
+ LAYERS = 6, // * Layer switcher used to change between DVORAK, PLOVER and GAMING layers.
+ MEDIA_FN = 7, // * Media, RGB and function keys from F1 to F24 in symmetric fashion.
+ HYPER = 8, // * Hot keys layer (uses hyper + F1 .. F24) suitable for global shortcut tasks.
+ FIRMWARE = 9 // * Layer with firmware related functionality, like the reset and EEPROM keys.
+};
diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/leader/leader_dictionary.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/leader/leader_dictionary.c
new file mode 100644
index 0000000000..8d5fa00a7d
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/leader/leader_dictionary.c
@@ -0,0 +1,14 @@
+LEADER_DICTIONARY() {
+ leading = false;
+ leader_end();
+
+ SEQ_ONE_KEY(TD(APMR_PIPE)) {
+ register_code(KC_LCTL);
+ register_code(KC_LSFT);
+ register_code(KC_U);
+
+ unregister_code(KC_U);
+ unregister_code(KC_LSFT);
+ unregister_code(KC_LCTL);
+ }
+}
diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/leader/leader_setup.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/leader/leader_setup.c
new file mode 100644
index 0000000000..1e89c4bfca
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/leader/leader_setup.c
@@ -0,0 +1,14 @@
+LEADER_EXTERNS();
+
+void qk_leader_start(void) {
+ if (!leading) {
+ leading = true;
+ leader_time = timer_read();
+ leader_sequence_size = 0;
+ leader_sequence[0] = 0;
+ leader_sequence[1] = 0;
+ leader_sequence[2] = 0;
+ leader_sequence[3] = 0;
+ leader_sequence[4] = 0;
+ }
+}
diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/package.json b/keyboards/ergodox_ez/keymaps/hacker_dvorak/package.json
new file mode 100644
index 0000000000..116911e46b
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "hacker_dvorak",
+ "version": "1.0.0",
+ "description": "Inspired by the [*Programmer Dvorak*](https://www.kaufmann.no/roland/dvorak) keyboard layout, cherry picked ideas from other layouts in the [EZ Repository](https://configure.ergodox-ez.com/search?q=dvorak&legacy=true), a character distribution [heatmap vizualizer](https://run.plnkr.co/plunks/5EEO8nJ2wRzYAfT3), my own subjective use cases and lots of trial and error.",
+ "main": "gulpfile.js",
+ "scripts": {
+ "test": "test"
+ },
+ "author": "SalchiPapa",
+ "license": "GPL-2.0",
+ "dependencies": {
+ "gulp": "^3.9.1",
+ "gulp-run-command": "0.0.9"
+ }
+}
diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/plover/plover_mode.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/plover/plover_mode.c
new file mode 100644
index 0000000000..b388264907
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/plover/plover_mode.c
@@ -0,0 +1,20 @@
+// TODO: improve feedback
+void plover_toggle(void) {
+ // Press "PHROLG"
+ register_code(PV_LP);
+ register_code(PV_LH);
+ register_code(PV_LR);
+ register_code(PV_O);
+ register_code(PV_RL);
+ register_code(PV_RG);
+
+ // Release "PHROLG"
+ unregister_code(PV_LP);
+ unregister_code(PV_LH);
+ unregister_code(PV_LR);
+ unregister_code(PV_O);
+ unregister_code(PV_RL);
+ unregister_code(PV_RG);
+}
+
+bool PLOVER_MODE = false;
diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/readme.md b/keyboards/ergodox_ez/keymaps/hacker_dvorak/readme.md
new file mode 100644
index 0000000000..8089a6d55a
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/readme.md
@@ -0,0 +1,62 @@
+# [Ergodox EZ Hacker Dvorak Layout](https://configure.ergodox-ez.com/layouts/Wadz/latest/0)
+
+Inspired by the [*Programmer Dvorak*](https://www.kaufmann.no/roland/dvorak) keyboard layout, cherry picked ideas from other layouts in the [EZ Repository](https://configure.ergodox-ez.com/search?q=dvorak&legacy=true), a character distribution [heatmap vizualizer](https://run.plnkr.co/plunks/5EEO8nJ2wRzYAfT3), my own subjective use cases and lots of trial and error.
+
+## Setup
+
+Configure your OS keyboard layout to US, or the keymap will be incorrect.
+
+## Limitations
+
+I plan to use [QMK](https://docs.qmk.fm) in the future, in order to overcome some limitations of the Ergodox EZ [graphical configurator](https://configure.ergodox-ez.com/layouts/default/latest/0)), however I will defer that, until more progress is made to the new [configurator](https://medium.com/the-ergo/the-configurator-is-out-of-beta-e107aec80cae).
+
+## Layers
+
+1. Dvorak
+ * US Dvorak layout.
+ * All symbols (including shifted symbols).
+ * All modifier are dual keys positioned near the home row.
+2. Querty
+ * Used to overcome the limitation pointed above, when your OS layout is set to Dvorak instead of US, this way you can use
+ Standard Dvorak (available by default on all the main operating systems) on other normal keybdoards and Hacker Dvorak on
+ the Ergodox EZ Shine at the same time, without changing back and forth tho OS layout.
+3. Gaming
+ * Still in development.
+ * Left side is mainly "normal" Qwerty.
+ * Right side is mainly for movement, either using the mouse, the arrow keys, the number pad or the `H`, `J`, `K`, `L` as direction keys.
+4. Arrows
+ * Arrow keys navigation.
+ * All modifier keys.
+ * Common text edititng shortcuts (doesn't work for MacOS).
+5. Mouse
+ * Mouse navigation.
+ * All modifier keys.
+ * Common text edititng shortcuts (doesn't work for MacOS).
+6. Numpad
+ * ATM style numpad.
+ * All modifier keys.
+ * Letters from `A` to `F` for hexadecimal numbers (`B` is also used for binary numeric literals in most programming
+ languages, ie. `0b11001`).
+ * `X` for hexadecimal numeric literals in most programming languages, ie. `0xbeef`.
+ * `O` for octal numeric literals in most programming languages, ie `0o123`.
+ * `J` for complex numeric literals in Python, ie. `3j`.
+ * `I` and `M` for complex Julia numeric literals, ie. `3im`.
+ * Common symbols for mathematical operations.
+7. Hyper Fn
+ * Useful for custom global shortcuts.
+8. Media Fn
+ * Media keys.
+ * Function keys.
+ * EZ Shine keys.
+9. Meh Fn
+ * Useful for custom application shortcuts.
+10. Meh Fn +
+ * Useful for custom standard shortcuts.
+
+## To Do
+
+Add images.
+
+***
+
+Please comment below if you have any ideas or suggestions. If you have used this layout or used it as a base, I'd love to hear about your experience!
diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/rules.mk b/keyboards/ergodox_ez/keymaps/hacker_dvorak/rules.mk
new file mode 100644
index 0000000000..51a9ff0d49
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/rules.mk
@@ -0,0 +1,40 @@
+# Set any rules.mk overrides for your specific keymap here.
+# See rules at https://docs.qmk.fm/#/config_options?id=the-rulesmk-file
+
+NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+TAP_DANCE_ENABLE = yes
+MOUSEKEY_ENABLE = yes # Mouse keys(+4700b).
+EXTRAKEY_ENABLE = yes # Audio control and System control(+450b).
+RGBLIGHT_ENABLE = yes
+LEADER_ENABLE = yes
+
+UNICODE_ENABLE = no
+COMMAND_ENABLE = no # Commands for debug and configuration
+SWAP_HANDS_ENABLE = no # Allow swapping hands of keyboard.
+
+
+# This are by default off:
+# COMBO_ENABLE = no
+# UCIS_ENABLE = no # For Unicode.
+# UNICODEMAP_ENABLE = no
+# SLEEP_LED_ENABLE = no # Turn off leds when computer is sleeping.
+# KEY_LOCK_ENABLE = no # (+1730b)
+# CONSOLE_ENABLE = no # Console for debug(+400b)
+# BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000b)
+# API_SYSEX_ENABLE = no
+# MIDI_ENABLE = no
+# BLUETOOTH_ENABLE = no
+# AUDIO_ENABLE = no
+# FAUXCLICKY_ENABLE = no
+# VARIABLE_TRACE = no
+# BACKLIGHT_ENABLE = no
+# RGB_MATRIX_ENABLE = no
+
+# POINTING_DEVICE_ENABLE = no
+
+# AUTO_SHIFT_ENABLE = no
+# AUTO_SHIFT_MODIFIERS = no
+
+# This don't need argument?
+# CUSTOM_MATRIX # Custom matrix file for the ErgoDox EZ
+# SPLIT_KEYBOARD
diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/mod_tap_layer_dances/none_lead.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/mod_tap_layer_dances/none_lead.c
new file mode 100644
index 0000000000..6debc1ce45
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/mod_tap_layer_dances/none_lead.c
@@ -0,0 +1,40 @@
+//instanalize an instance of 'tap' for the None - Lead tap dance.
+static tap none_lead_state = {
+ .is_press_action = true,
+ .state = 0
+};
+
+void none_lead_finished(qk_tap_dance_state_t *state, void *user_data) {
+ none_lead_state.state = current_dance(state);
+ switch (none_lead_state.state) {
+ case SINGLE_TAP:
+ register_code(KC_NO);
+ break;
+
+ case SINGLE_HOLD:
+ register_code(KC_LALT);
+ register_code(KC_LSFT);
+ break;
+
+ case DOUBLE_TAP:
+ qk_leader_start();
+ break;
+ }
+}
+
+void none_lead_reset(qk_tap_dance_state_t *state, void *user_data) {
+ switch (none_lead_state.state) {
+ case SINGLE_TAP:
+ unregister_code(KC_NO);
+ break;
+
+ case SINGLE_HOLD:
+ unregister_code(KC_LALT);
+ unregister_code(KC_LSFT);
+ break;
+
+ case DOUBLE_TAP:
+ break;
+ }
+ none_lead_state.state = 0;
+}
diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dance_actions.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dance_actions.c
new file mode 100644
index 0000000000..550e1f7c84
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dance_actions.c
@@ -0,0 +1,20 @@
+// Register the double tap dances:
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [EQL_PLUS] = ACTION_TAP_DANCE_DOUBLE(KC_EQL, KC_PLUS),
+ [MINS_UNDS] = ACTION_TAP_DANCE_DOUBLE(KC_MINS, KC_UNDS),
+ [SLSH_BSLS] = ACTION_TAP_DANCE_DOUBLE(KC_SLSH, KC_BSLS),
+ [GRV_TILD] = ACTION_TAP_DANCE_DOUBLE(KC_GRV, KC_TILD),
+ [QUOT_DQUO] = ACTION_TAP_DANCE_DOUBLE(KC_QUOT, KC_DQUO),
+ [SCLN_COLN] = ACTION_TAP_DANCE_DOUBLE(KC_SCLN, KC_COLN),
+ [ASTR_CIRC] = ACTION_TAP_DANCE_DOUBLE(KC_ASTR, KC_CIRC),
+ [APMR_PIPE] = ACTION_TAP_DANCE_DOUBLE(KC_AMPR, KC_PIPE),
+ [EXLM_QUES] = ACTION_TAP_DANCE_DOUBLE(KC_EXLM, KC_QUES),
+ [HASH_PERC] = ACTION_TAP_DANCE_DOUBLE(KC_HASH, KC_PERC),
+ [AT_DLR] = ACTION_TAP_DANCE_DOUBLE(KC_AT, KC_DLR),
+ [LPRN_LBRC] = ACTION_TAP_DANCE_DOUBLE(KC_LPRN, KC_LBRC),
+ [RPRN_RBRC] = ACTION_TAP_DANCE_DOUBLE(KC_RPRN, KC_RBRC),
+ [LCBR_LABK] = ACTION_TAP_DANCE_DOUBLE(KC_LCBR, KC_LABK),
+ [RCBR_RABK] = ACTION_TAP_DANCE_DOUBLE(KC_RCBR, KC_RABK),
+ [DOT_COMM] = ACTION_TAP_DANCE_DOUBLE(KC_DOT, KC_COMM),
+ [NONE_LEAD] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, none_lead_finished, none_lead_reset, DANCING_TERM)
+};
diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dance_setup.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dance_setup.c
new file mode 100644
index 0000000000..340ccca133
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dance_setup.c
@@ -0,0 +1,75 @@
+typedef struct {
+ bool is_press_action;
+ int state;
+} tap;
+
+enum {
+ SINGLE_TAP = 1,
+ SINGLE_HOLD = 2,
+ DOUBLE_TAP = 3,
+ DOUBLE_HOLD = 4,
+ DOUBLE_SINGLE_TAP = 5, // Send two single taps.
+ TRIPLE_TAP = 6,
+ TRIPLE_HOLD = 7,
+ TRIPLE_SINGLE_TAP = 8 // Send three single taps.
+};
+
+/* Return an integer that corresponds to what kind of tap dance should be executed.
+ *
+ * How to figure out tap dance state: interrupted and pressed.
+ *
+ * Interrupted: If the state of a dance dance is "interrupted", that means that another key has been hit
+ * under the tapping term. This is typically indicitive that you are trying to "tap" the key.
+ *
+ * Pressed: Whether or not the key is still being pressed. If this value is true, that means the tapping term
+ * has ended, but the key is still being pressed down. This generally means the key is being "held".
+ *
+ * One thing that is currenlty not possible with qmk software in regards to tap dance is to mimic the "permissive hold"
+ * feature. In general, advanced tap dances do not work well if they are used with commonly typed letters.
+ * For example "A". Tap dances are best used on non-letter keys that are not hit while typing letters.
+ *
+ * Good places to put an advanced tap dance:
+ * z,q,x,j,k,v,b, any function key, home/end, comma, semi-colon
+ *
+ * Criteria for "good placement" of a tap dance key:
+ * Not a key that is hit frequently in a sentence
+ * Not a key that is used frequently to double tap, for example 'tab' is often double tapped in a terminal, or
+ * in a web form. So 'tab' would be a poor choice for a tap dance.
+ * Letters used in common words as a double. For example 'p' in 'pepper'. If a tap dance function existed on the
+ * letter 'p', the word 'pepper' would be quite frustating to type.
+ *
+ * For the third point, there does exist the 'DOUBLE_SINGLE_TAP', however this is not fully tested
+ *
+ */
+int current_dance(qk_tap_dance_state_t *state) {
+ int current_state = 0;
+ if (state->count == 1) {
+ if (state->interrupted || !state->pressed) {
+ current_state = SINGLE_TAP;
+ } else {
+ current_state = SINGLE_HOLD; //key has not been interrupted, but they key is still held. Means you want to send a 'HOLD'.
+ }
+ } else if (state->count == 2) {
+ /*
+ * DOUBLE_SINGLE_TAP is to distinguish between typing "pepper", and actually wanting a double tap
+ * action when hitting 'pp'. Suggested use case for this return value is when you want to send two
+ * keystrokes of the key, and not the 'double tap' action/macro.
+ */
+ if (state->interrupted) {
+ current_state = DOUBLE_SINGLE_TAP;
+ } else if (state->pressed) {
+ current_state = DOUBLE_HOLD;
+ } else {
+ current_state = DOUBLE_TAP;
+ }
+ } else if (state->count == 3) {
+ if (state->interrupted) {
+ current_state = TRIPLE_SINGLE_TAP;
+ } else if (state->pressed) {
+ current_state = TRIPLE_HOLD;
+ } else {
+ current_state = TRIPLE_TAP;
+ }
+ }
+ return current_state;
+}
diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dances.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dances.c
new file mode 100644
index 0000000000..3d44698729
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/tap_dance/tap_dances.c
@@ -0,0 +1,74 @@
+ //--------------------------------------------------------------------------------------------//
+ // | | | | | //
+ // Single tap | Single hold | Double tap | Double hold | Triple tap | Triple hold //
+// Mod tap dances: // | | | | | //
+enum tap_dances { //--------------------------------------------------------------------------------------------//
+ // | | | | | //
+ EQL_PLUS = 0, // = | + | | | | //
+ // | | | | | //
+ //--------------------------------------------------------------------------------------------//
+ // | | | | | //
+ MINS_UNDS = 1, // - | _ | | | | //
+ // | | | | | //
+ //--------------------------------------------------------------------------------------------//
+ // | | | | | //
+ SLSH_BSLS = 2, // / | \ | | | | //
+ // | | | | | //
+ //--------------------------------------------------------------------------------------------//
+ // | | | | | //
+ GRV_TILD = 3, // ` | ~ | | | | //
+ // | | | | | //
+ //--------------------------------------------------------------------------------------------//
+ // | | | | | //
+ QUOT_DQUO = 4, // ' | " | | | | //
+ // | | | | | //
+ //--------------------------------------------------------------------------------------------//
+ // | | | | | //
+ SCLN_COLN = 5, // ; | : | | | | //
+ // | | | | | //
+ //--------------------------------------------------------------------------------------------//
+ // | | | | | //
+ ASTR_CIRC = 6, // * | ^ | | | | //
+ // | | | | | //
+ //--------------------------------------------------------------------------------------------//
+ // | | | | | //
+ APMR_PIPE = 7, // & | | | | | | //
+ // | | | | | //
+ //--------------------------------------------------------------------------------------------//
+ // | | | | | //
+ EXLM_QUES = 8, // ! | ? | | | | //
+ // | | | | | //
+ //--------------------------------------------------------------------------------------------//
+ // | | | | | //
+ HASH_PERC = 9, // # | % | | | | //
+ // | | | | | //
+ //--------------------------------------------------------------------------------------------//
+ // | | | | | //
+ AT_DLR = 10, // @ | $ | | | | //
+ // | | | | | //
+ //--------------------------------------------------------------------------------------------//
+ // | | | | | //
+ LPRN_LBRC = 11, // ( | [ | | | | //
+ // | | | | | //
+ //--------------------------------------------------------------------------------------------//
+ // | | | | | //
+ RPRN_RBRC = 12, // ) | ] | | | | //
+ // | | | | | //
+ //--------------------------------------------------------------------------------------------//
+ // | | | | | //
+ LCBR_LABK = 13, // { | < | | | | //
+ // | | | | | //
+ //--------------------------------------------------------------------------------------------//
+ // | | | | | //
+ RCBR_RABK = 14, // } | > | | | | //
+ // | | | | | //
+ //--------------------------------------------------------------------------------------------//
+ // | | | | | //
+ DOT_COMM = 15, // . | , | | | | //
+ // | | | | | //
+ //--------------------------------------------------------------------------------------------//
+ // | | | | | //
+ NONE_LEAD = 16, // NONE | ALT+SHIFT | LEAD | | | //
+ // | | | | | //
+ //--------------------------------------------------------------------------------------------//
+};
diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/eeconfig_init_user.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/eeconfig_init_user.c
new file mode 100644
index 0000000000..41b7b66941
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/eeconfig_init_user.c
@@ -0,0 +1,3 @@
+// void eeconfig_init_user(void) {
+//
+// };
diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/layer_set_state_user.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/layer_set_state_user.c
new file mode 100644
index 0000000000..e2eeed6fa9
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/layer_set_state_user.c
@@ -0,0 +1,121 @@
+
+uint32_t layer_state_set_user(uint32_t state) {
+ uint8_t layer = biton32(state);
+
+ switch (layer) {
+ case DVORAK:
+ rgblight_sethsv_noeeprom_green();
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
+
+ if (PLOVER_MODE) {
+ plover_toggle();
+ PLOVER_MODE = false;
+ }
+
+ break;
+
+ case PLOVER:
+ rgblight_sethsv_noeeprom_red();
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3);
+
+ if (!(PLOVER_MODE)) {
+ plover_toggle();
+ PLOVER_MODE = true;
+ }
+
+ break;
+
+ case GAMING:
+ rgblight_sethsv_noeeprom_red();
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2);
+
+ if (PLOVER_MODE) {
+ plover_toggle();
+ PLOVER_MODE = false;
+ }
+
+ break;
+
+ case ARROWS:
+ rgblight_sethsv_noeeprom_blue();
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2);
+
+ if (PLOVER_MODE) {
+ plover_toggle();
+ PLOVER_MODE = false;
+ }
+
+ break;
+
+ case MOUSE:
+ rgblight_sethsv_noeeprom_blue();
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2);
+
+ if (PLOVER_MODE) {
+ plover_toggle();
+ PLOVER_MODE = false;
+ }
+
+ break;
+
+ case NUMPAD:
+ rgblight_sethsv_noeeprom_blue();
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2);
+
+ if (PLOVER_MODE) {
+ plover_toggle();
+ PLOVER_MODE = false;
+ }
+
+ break;
+
+ case LAYERS:
+ rgblight_sethsv_noeeprom_cyan();
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2);
+
+ if (PLOVER_MODE) {
+ plover_toggle();
+ PLOVER_MODE = false;
+ }
+
+ break;
+
+ case MEDIA_FN:
+ rgblight_sethsv_noeeprom_yellow();
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2);
+
+ if (PLOVER_MODE) {
+ plover_toggle();
+ PLOVER_MODE = false;
+ }
+
+ break;
+
+ case HYPER:
+ rgblight_sethsv_noeeprom_magenta();
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2);
+
+ if (PLOVER_MODE) {
+ plover_toggle();
+ PLOVER_MODE = false;
+ }
+
+ break;
+
+ case FIRMWARE:
+ rgblight_sethsv_noeeprom_magenta();
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2);
+
+ if (PLOVER_MODE) {
+ plover_toggle();
+ PLOVER_MODE = false;
+ }
+
+ break;
+
+ default:
+ break;
+ }
+
+ return state;
+}
diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/matrix_scan_user.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/matrix_scan_user.c
new file mode 100644
index 0000000000..3b78079cca
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/matrix_scan_user.c
@@ -0,0 +1,12 @@
+#include "../leader/leader_setup.c"
+
+bool MATRIX_SCANNED = false;
+
+void matrix_scan_user(void) {
+ if (!(MATRIX_SCANNED)) {
+ rgblight_sethsv_noeeprom_green();
+ MATRIX_SCANNED = true;
+ }
+
+ #include "../leader/leader_dictionary.c"
+};
diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/process_record_user.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/process_record_user.c
new file mode 100644
index 0000000000..7644635824
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/process_record_user.c
@@ -0,0 +1,75 @@
+// TODO: Improve this currently there is no feedback if activated by other means.
+bool CAPS_LOCK = false;
+bool NUM_LOCK = false;
+bool SCROLL_LOCK = false;
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (!process_record_dynamic_macro(keycode, record)) {
+ return false;
+ }
+
+ switch (keycode) {
+ case KC_CLCK:
+ if (record->event.pressed) {
+ if (!(CAPS_LOCK)) {
+ ergodox_right_led_1_on();
+ CAPS_LOCK = true;
+ } else {
+ ergodox_right_led_1_off();
+ CAPS_LOCK = false;
+ }
+ }
+
+ return true;
+
+ case KC_NLCK:
+ if (record->event.pressed) {
+ if (!(NUM_LOCK)) {
+ ergodox_right_led_2_on();
+ NUM_LOCK = true;
+ } else {
+ ergodox_right_led_2_off();
+ NUM_LOCK = false;
+ }
+ }
+
+ return true;
+
+ case KC_SLCK:
+ if (record->event.pressed) {
+ if (!(SCROLL_LOCK)) {
+ ergodox_right_led_3_on();
+ SCROLL_LOCK = true;
+ } else {
+ ergodox_right_led_3_off();
+ SCROLL_LOCK = false;
+ }
+ }
+
+ return true;
+
+ case KC_MS_WH_UP ... KC_MS_WH_RIGHT:
+ if (record->event.pressed) {
+ if (SCROLL_LOCK) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ case MY_CUSTOM_MACRO:
+ if (record->event.pressed) {
+ SEND_STRING("QMK is the best thing ever!"); // this is our macro!
+ return false;
+ }
+
+ case MY_OTHER_MACRO:
+ if (record->event.pressed) {
+ SEND_STRING(SS_LCTRL("ac")); // selects all and copies
+ return false;
+ }
+
+ default:
+ return true;
+ }
+}
diff --git a/keyboards/ergodox_ez/keymaps/heartrobotninja/rules.mk b/keyboards/ergodox_ez/keymaps/heartrobotninja/rules.mk
index 38112a9065..6f40259b61 100644
--- a/keyboards/ergodox_ez/keymaps/heartrobotninja/rules.mk
+++ b/keyboards/ergodox_ez/keymaps/heartrobotninja/rules.mk
@@ -13,6 +13,7 @@ AUTOLOG_ENABLE = no
RGBLIGHT_ENABLE = yes
RGBLIGHT_ANIMATION = yes
EXTRAKEY_ENABLE = yes
+LEADER_ENABLE = yes
OPT_DEFS += -DUSER_PRINT
@@ -29,6 +30,3 @@ KEYMAP_BRANCH = $(shell \
OPT_DEFS += -DKEYMAP_VERSION=\"$(KEYMAP_VERSION)\\\#$(KEYMAP_BRANCH)\"
-ifndef QUANTUM_DIR
- include ../../../../Makefile
-endif \ No newline at end of file
diff --git a/keyboards/ergodox_ez/keymaps/lukaus/config.h b/keyboards/ergodox_ez/keymaps/lukaus/config.h
new file mode 100644
index 0000000000..2b93445378
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/lukaus/config.h
@@ -0,0 +1,16 @@
+#pragma once
+#define CONFIG_USER_H
+
+#define TAPPING_TERM 200
+
+#ifdef RGBLIGHT_ENABLE
+#undef RGBLIGHT_SAT_STEP
+#define RGBLIGHT_SAT_STEP 12
+#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 7
+#define RGBLIGHT_EFFECT_SNAKE_LENGTH 7
+#define RGBLIGHT_EFFECT_BREATHE_CENTER 1
+#endif // RGBLIGHT_ENABLE
+
+#define FORCE_NKRO
+
+#define MODS_SHIFT_MASK (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))
diff --git a/keyboards/ergodox_ez/keymaps/lukaus/keymap.c b/keyboards/ergodox_ez/keymaps/lukaus/keymap.c
new file mode 100644
index 0000000000..40156b3ff3
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/lukaus/keymap.c
@@ -0,0 +1,843 @@
+#include QMK_KEYBOARD_H
+#include "version.h"
+
+#include "keymap_german.h"
+
+#include "keymap_nordic.h"
+
+enum custom_keycodes {
+ PLACEHOLDER = SAFE_RANGE, // can always be here
+
+ // Programmer's Dvorak "macros" :
+ // To be paired with get_mods to enable both
+ // Shift functionality and Programmer's Dvorak
+
+ DVP_ESC, // Grave escape basically i think
+ DVP_AMPR,
+ DVP_LBRACKET,
+ DVP_LCBR,
+ DVP_RCBR,
+ DVP_LPRN,
+ DVP_AT,
+
+ DVP_EQUAL,
+ DVP_ASTERISK,
+ DVP_RPRN,
+ DVP_PLUS,
+ DVP_RBRACKET,
+ DVP_EXLM,
+ DVP_HASH,
+
+ RU_2,
+ RU_3,
+ RU_4,
+ RU_6,
+ RU_7,
+ RU_DOT,
+
+ SHFT_COMMA,
+ SHFT_DOT,
+
+ RGB_SLD,
+ RGB_FF0000,
+ RGB_008000,
+ RGB_0000FF,
+ RGB_FFFFFF,
+ RGB_800080
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ // Programmer's Dvorak layer
+ [0] = LAYOUT_ergodox(
+ DVP_ESC, DVP_AMPR, DVP_LBRACKET, DVP_LCBR, DVP_RCBR, DVP_LPRN, DVP_AT,
+ KC_TAB, KC_SCOLON, KC_COMMA, KC_DOT, KC_P, KC_Y, MO(4),
+ MO(3), KC_A, KC_O, KC_E, KC_U, KC_I,
+ KC_LSHIFT, KC_QUOTE, KC_Q, KC_J, KC_K, KC_X, KC_HYPR,
+ KC_LCTL, KC_LALT, KC_LGUI, LCTL(KC_C), LCTL(KC_V),
+
+ KC_MS_BTN3, TO(1), KC_HOME, KC_SPACE, MO(4), KC_END,
+
+ DVP_EQUAL, DVP_ASTERISK, DVP_RPRN, DVP_PLUS, DVP_RBRACKET, DVP_EXLM, DVP_HASH,
+ TT(4), KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLASH,
+ KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINUS,
+ KC_MEH, KC_B, KC_M, KC_W, KC_V, KC_Z, MO(3),
+ KC_DELETE, KC_BSLASH, KC_RGUI, KC_RCTL, LCTL(KC_F),
+
+ KC_F17, KC_F18, KC_PGUP, KC_PGDOWN, KC_ENTER, KC_BSPACE
+ ),
+ // Gaming QWERTY layer
+ [1] = LAYOUT_ergodox(
+ KC_ESCAPE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_F14,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_F23,
+ MO(3), KC_A, KC_S, KC_D, KC_F, KC_G,
+ KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_F24,
+ KC_LCTL, KC_F8, KC_LALT, KC_F14, KC_F13,
+
+ KC_HOME, TO(0), KC_F15, KC_SPACE, KC_LCTL, KC_LALT,
+
+ KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQUAL,
+ KC_F24, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLASH,
+ KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOTE,
+ KC_F17, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_RSHIFT,
+ KC_DELETE, KC_F19, KC_LGUI, KC_F21, KC_F22,
+
+ KC_F17, KC_F18, KC_PGUP, KC_PGDOWN, KC_ENTER, KC_BSPACE
+ ),
+ [2] = LAYOUT_ergodox(
+ KC_ESCAPE, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_C,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, TO(0),
+ MO(3), KC_1, KC_2, KC_3, KC_4, KC_5,
+ KC_LSHIFT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_NO,
+ KC_LCTL, KC_F8, KC_LALT, KC_I, KC_S,
+
+ KC_MS_BTN3, TO(1), KC_HOME, KC_SPACE, KC_LSHIFT, KC_END,
+
+ KC_NO, KC_NUMLOCK, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS, KC_NO, KC_NO,
+ TO(0), KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_PLUS, KC_NO, KC_NO,
+ KC_KP_4, KC_KP_5, KC_KP_6, KC_EQUAL, KC_NO, KC_NO,
+ KC_NO, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_ENTER, KC_NO, KC_NO,
+ KC_KP_0, KC_KP_DOT, KC_NO, KC_NO, KC_NO,
+
+ TO(0), KC_F18, KC_PGUP, KC_PGDOWN, KC_ENTER, KC_BSPACE
+ ),
+ // Function Layer
+ [3] = LAYOUT_ergodox(
+ KC_DLR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_MEDIA_PREV_TRACK,KC_MEDIA_PLAY_PAUSE,KC_MEDIA_NEXT_TRACK,KC_NO, TT(4),
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, KC_AUDIO_MUTE, KC_TRANSPARENT,
+ KC_LSHIFT, LALT(KC_Z), KC_TRANSPARENT, KC_TRANSPARENT, KC_F12, KC_TRANSPARENT, ALL_T(KC_NO),
+ KC_LCTL, KC_LALT, KC_LGUI, KC_CAPSLOCK, LSFT(KC_F12),
+
+ KC_PSCREEN, KC_PGUP, KC_PGDOWN, KC_SPACE, KC_LSHIFT, KC_INSERT,
+
+ KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
+ KC_NO, KC_HOME, KC_TRANSPARENT, KC_PSCREEN, KC_SLCK, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_TRANSPARENT, KC_TRANSPARENT,
+ MEH_T(KC_NO), KC_CALCULATOR, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_RSHIFT,
+ KC_DELETE, KC_INSERT, KC_TRANSPARENT, KC_F19, KC_RCTL,
+
+ TO(2),KC_TRANSPARENT,KC_TRANSPARENT,LALT(KC_F10),KC_ENTER,KC_BSPACE
+ ),
+ // Keypad, Lighting, and Mouse emulation layer
+ ///*
+ [4] = LAYOUT_ergodox(
+ KC_ESCAPE, KC_NO, KC_NO, KC_MS_BTN3, KC_NO, KC_NO, KC_NO,
+ KC_TAB, KC_NO, KC_MS_BTN2, KC_MS_UP, KC_MS_BTN1, KC_MS_WH_UP, TO(0),
+ KC_NO, KC_NO, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_WH_DOWN,
+ KC_LSHIFT, KC_NO, KC_NO, KC_UP, KC_NO, KC_NO, TO(5),
+ KC_LCTL, KC_NO, KC_LEFT, KC_DOWN, KC_RIGHT,
+
+ KC_MS_BTN3, TO(1), KC_HOME, KC_SPACE, KC_LSHIFT, KC_END,
+
+ KC_NO, KC_NUMLOCK, KC_KP_SLASH, KC_KP_ASTERISK, KC_CALCULATOR, KC_NO, RGB_VAI,
+ TO(0), KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_MINUS, KC_NO, RGB_VAD,
+ KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_PLUS, KC_NO, RGB_HUI,
+ KC_NO, KC_KP_1, KC_KP_2, KC_KP_3, KC_EQUAL, RGB_SLD, RGB_HUD,
+ KC_KP_0, KC_KP_DOT, KC_KP_ENTER, RGB_MOD, RGB_TOG,
+
+ KC_F17, KC_F18, KC_PGUP, KC_PGDOWN, KC_ENTER, KC_BSPACE
+ )
+ //*/
+ /*
+ // Keypad, Lighting, and Mouse emulation layer
+ [4] = KEYMAP(
+ KC_ESCAPE, KC_NO, KC_NO, KC_MS_BTN3, KC_NO, KC_NO, KC_NO,
+ KC_TAB, KC_NO, KC_MS_BTN2, KC_MS_UP, KC_MS_BTN1, KC_MS_WH_UP, TO(0),
+ KC_NO, KC_NO, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_WH_DOWN,
+ KC_LSHIFT, KC_NO, KC_NO, KC_UP, KC_NO, KC_NO, TO(5),
+ KC_LCTL, KC_NO, KC_LEFT, KC_DOWN, KC_RIGHT,
+
+ KC_MS_BTN3, TO(1), KC_HOME, KC_SPACE, KC_LSHIFT, KC_END,
+
+ KC_NO, KC_I, KC_NUMLOCK, KC_KP_SLASH, KC_KP_ASTERISK, KC_CALCULATOR, RGB_VAI,
+ TO(0), KC_G, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_MINUS, RGB_VAD,
+ SHFT_COMMA, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_PLUS, RGB_HUI,
+ KC_NO, SHFT_DOT, KC_KP_1, KC_KP_2, KC_KP_3, KC_EQUAL, RGB_HUD,
+ KC_NO, KC_KP_0, KC_KP_DOT, KC_KP_ENTER, RGB_TOG,
+
+ KC_F17, KC_F18, KC_PGUP, KC_PGDOWN, KC_ENTER, KC_BSPACE
+ )
+ */
+
+};
+
+void led_set_keymap(uint8_t usb_led) {
+
+}
+
+void matrix_init_user (void) {
+
+}
+
+
+bool left_shift_down = false;
+bool right_shift_down = false;
+
+bool numlock = false;
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+
+ switch (keycode) {
+ case KC_LSHIFT:
+ if (record->event.pressed)
+ {
+ left_shift_down = true;
+ return true;
+ }
+ else
+ {
+ left_shift_down = false;
+ return true;
+ }
+ break;
+ case KC_RSHIFT:
+
+ if (record->event.pressed)
+ {
+ right_shift_down = true;
+ return true;
+ }
+ else
+ {
+ right_shift_down = false;
+ return true;
+ }
+ break;
+ case KC_NUMLOCK:
+
+ if (record->event.pressed)
+ {
+ numlock = !numlock;
+ }
+ break;
+
+ case DVP_ESC:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ SEND_STRING("~");
+ return false;
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING(SS_DOWN(X_ESCAPE));
+ else
+ SEND_STRING(SS_UP(X_ESCAPE));
+ return false;
+ }
+ break;
+
+ case DVP_AMPR:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ SEND_STRING("%");
+
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("&");
+ }
+ return false;
+
+ break;
+
+ case SHFT_DOT:
+ if(record->event.pressed)
+ SEND_STRING(">");
+ break;
+
+ case SHFT_COMMA:
+ if(record->event.pressed)
+ SEND_STRING("<");
+ break;
+
+ case DVP_LBRACKET:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_7);
+ unregister_code(KC_7);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("[");
+ }
+ return false;
+
+ return false;
+ break;
+
+ case DVP_LCBR:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_5);
+ unregister_code(KC_5);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("{");
+ }
+ return false;
+ break;
+
+ case DVP_RCBR:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_3);
+ unregister_code(KC_3);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("}");
+ }
+ return false;
+ break;
+
+ case DVP_LPRN:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_1);
+ unregister_code(KC_1);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("(");
+ }
+ return false;
+ break;
+
+ case DVP_AT:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_LSHIFT);
+ register_code(KC_6);
+ unregister_code(KC_6);
+ unregister_code(KC_LSHIFT);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("@");
+ }
+ return false;
+ break;
+
+
+ case DVP_EQUAL:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_9);
+ unregister_code(KC_9);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("=");
+ }
+ return false;
+ break;
+
+ case DVP_ASTERISK:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_0);
+ unregister_code(KC_0);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("*");
+ }
+ return false;
+ break;
+
+ case DVP_RPRN:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_2);
+ unregister_code(KC_2);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING(")");
+ }
+ return false;
+ break;
+
+ case DVP_PLUS:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_4);
+ unregister_code(KC_4);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("+");
+ }
+ return false;
+ break;
+
+ case DVP_RBRACKET:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_6);
+ unregister_code(KC_6);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("]");
+ }
+ return false;
+ break;
+
+ case DVP_EXLM:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_8);
+ unregister_code(KC_8);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("!");
+ }
+ return false;
+ break;
+
+ case DVP_HASH:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_GRAVE);
+ unregister_code(KC_GRAVE);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("#");
+ }
+ return false;
+ break;
+
+ // Russian
+ case RU_2:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_GRAVE);
+ unregister_code(KC_GRAVE);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("#");
+ }
+ return false;
+ break;
+case RU_3:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_GRAVE);
+ unregister_code(KC_GRAVE);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("#");
+ }
+ return false;
+ break;
+case RU_4:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_GRAVE);
+ unregister_code(KC_GRAVE);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("#");
+ }
+ return false;
+ break;
+case RU_6:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_GRAVE);
+ unregister_code(KC_GRAVE);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("#");
+ }
+ return false;
+ break;
+case RU_7:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_GRAVE);
+ unregister_code(KC_GRAVE);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("#");
+ }
+ return false;
+ break;
+
+ case RU_DOT:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_GRAVE);
+ unregister_code(KC_GRAVE);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("#");
+ }
+ return false;
+ break;
+
+
+ case RGB_SLD:
+ if (record->event.pressed) {
+ rgblight_mode(1);
+ }
+ return false;
+ break;
+
+ case RGB_FF0000:
+ if (record->event.pressed) {
+ #ifdef RGBLIGHT_ENABLE
+ rgblight_enable();
+ rgblight_mode(1);
+ rgblight_setrgb(0xff,0x00,0x00);
+ #endif
+ }
+ return false;
+ break;
+
+ case RGB_008000:
+ if (record->event.pressed) {
+ #ifdef RGBLIGHT_ENABLE
+ rgblight_enable();
+ rgblight_mode(1);
+ rgblight_setrgb(0x00,0x80,0x00);
+ #endif
+ }
+ return false;
+ break;
+
+ case RGB_0000FF:
+ if (record->event.pressed) {
+ #ifdef RGBLIGHT_ENABLE
+ rgblight_enable();
+ rgblight_mode(1);
+ rgblight_setrgb(0x00,0x00,0xff);
+ #endif
+ }
+ return false;
+ break;
+
+ case RGB_FFFFFF:
+ if (record->event.pressed) {
+ #ifdef RGBLIGHT_ENABLE
+ rgblight_enable();
+ rgblight_mode(1);
+ rgblight_setrgb(0xff,0xff,0xff);
+ #endif
+ }
+ return false;
+ break;
+
+ case RGB_800080:
+ if (record->event.pressed) {
+ #ifdef RGBLIGHT_ENABLE
+ rgblight_enable();
+ rgblight_mode(1);
+ rgblight_setrgb(0x80,0x00,0x80);
+ #endif
+ }
+ return false;
+ break;
+
+ }
+ return true;
+}
+
+uint32_t layer_state_set_user(uint32_t state) {
+
+ uint8_t layer = biton32(state);
+
+ // ergodox_board_led_off();
+ ergodox_right_led_1_off();
+ ergodox_right_led_2_off();
+ ergodox_right_led_3_off();
+ switch (layer) {
+ case 0:
+ break;
+ case 1:
+ ergodox_right_led_1_on();
+ break;
+ case 2:
+ ergodox_right_led_2_on();
+ break;
+ case 3:
+ ergodox_right_led_3_on();
+ break;
+ case 4:
+ ergodox_right_led_1_on();
+ ergodox_right_led_3_on();
+ break;
+ default:
+ break;
+ }
+ return state;
+
+};
diff --git a/keyboards/ergodox_ez/keymaps/lukaus/readme.md b/keyboards/ergodox_ez/keymaps/lukaus/readme.md
new file mode 100644
index 0000000000..af091bb1b9
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/lukaus/readme.md
@@ -0,0 +1,3 @@
+# Lukaus' keymap
+
+Programmer's Dvorak as default layer with Qwerty gaming layer and two function layers
diff --git a/keyboards/ergodox_ez/keymaps/lukaus/rules.mk b/keyboards/ergodox_ez/keymaps/lukaus/rules.mk
new file mode 100644
index 0000000000..fe05f599b9
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/lukaus/rules.mk
@@ -0,0 +1 @@
+#UNICODE_ENABLE = yes
diff --git a/keyboards/ergodox_ez/keymaps/matrixman/keymap.c b/keyboards/ergodox_ez/keymaps/matrixman/keymap.c
index d40f6475bc..f5d0a0cf79 100644
--- a/keyboards/ergodox_ez/keymaps/matrixman/keymap.c
+++ b/keyboards/ergodox_ez/keymaps/matrixman/keymap.c
@@ -162,11 +162,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
};
-const uint16_t PROGMEM fn_actions[] = {
-// [1] = ACTION_LAYER_TAP_TOGGLE(SYMB), // FN1 - Tap/Toggle Layer 1 (Symbols)
-// [2] = ACTION_LAYER_TAP_TOGGLE(NAV) // FN2 - Tap/Toggle Layer 2 (Nav)
-};
-
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
diff --git a/keyboards/ergodox_ez/keymaps/rgb_layer/config.h b/keyboards/ergodox_ez/keymaps/rgb_layer/config.h
new file mode 100644
index 0000000000..59302b8003
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/rgb_layer/config.h
@@ -0,0 +1,24 @@
+#ifndef KEYMAP_CONFIG_H
+#define KEYMAP_CONFIG_H
+
+
+ #define RGBLIGHT_SLEEP
+
+
+#ifndef QMK_KEYS_PER_SCAN
+#define QMK_KEYS_PER_SCAN 4
+#endif // !QMK_KEYS_PER_SCAN
+
+#define IGNORE_MOD_TAP_INTERRUPT
+#undef PERMISSIVE_HOLD
+#undef PREVENT_STUCK_MODIFIERS
+
+
+#define FORCE_NKRO
+
+#ifndef TAPPING_TOGGLE
+#define TAPPING_TOGGLE 1
+#endif
+
+#endif // !USERSPACE_CONFIG_H
+
diff --git a/keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c b/keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c
new file mode 100644
index 0000000000..384d7d0945
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c
@@ -0,0 +1,271 @@
+#include QMK_KEYBOARD_H
+#include "version.h"
+
+#define BASE 0 // default layer
+#define SYMB 1 // symbols
+#define MDIA 2 // media keys
+
+enum custom_keycodes {
+ PLACEHOLDER = SAFE_RANGE, // can always be here
+ EPRM,
+ VRSN,
+ RGB_SLD,
+ RGB_LYR
+};
+
+typedef union {
+ uint32_t raw;
+ struct {
+ bool rgb_layer_change :1;
+ };
+} user_config_t;
+
+user_config_t user_config;
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Keymap 0: Basic layer
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | = | 1 | 2 | 3 | 4 | 5 | LEFT | | RIGHT| 6 | 7 | 8 | 9 | 0 | - |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | Del | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | \ |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | BkSp | A | S | D | F | G |------| |------| H | J | K | L |; / L2|' / Cmd |
+ * |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------|
+ * | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | App | LGui | | Alt |Ctrl/Esc|
+ * ,------|------|------| |------+--------+------.
+ * | | | Home | | PgUp | | |
+ * | Space|Backsp|------| |------| Tab |Enter |
+ * | |ace | End | | PgDn | | |
+ * `--------------------' `----------------------'
+ */
+// If it accepts an argument (i.e, is a function), it doesn't need KC_.
+// Otherwise, it needs KC_*
+[BASE] = LAYOUT_ergodox( // layer 0 : default
+ // left hand
+ KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT,
+ KC_DELT, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB),
+ KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G,
+ KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO),
+ LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT,
+ ALT_T(KC_APP), KC_LGUI,
+ KC_HOME,
+ KC_SPC,KC_BSPC,KC_END,
+ // right hand
+ KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
+ TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
+ KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),GUI_T(KC_QUOT),
+ MEH_T(KC_NO),KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT,
+ KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, TT(SYMB),
+ KC_LALT, CTL_T(KC_ESC),
+ KC_PGUP,
+ KC_PGDN,KC_TAB, KC_ENT
+ ),
+/* Keymap 1: Symbol Layer
+ *
+ * ,---------------------------------------------------. ,--------------------------------------------------.
+ * |Version | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
+ * |---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------|
+ * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 |
+ * |---------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
+ * |---------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
+ * `---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | EPRM | | | | | | | . | 0 | = | |
+ * `-----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * |Animat| LYR | |Toggle|Solid |
+ * ,------|------|------| |------+------+------.
+ * |Bright|Bright| | | |Hue- |Hue+ |
+ * |ness- |ness+ |------| |------| | |
+ * | | | | | | | |
+ * `--------------------' `--------------------'
+ */
+// SYMBOLS
+[SYMB] = LAYOUT_ergodox(
+ // left hand
+ VRSN, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
+ RESET, KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
+ KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
+ EPRM,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
+ KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
+ RGB_MOD,RGB_LYR,
+ KC_TRNS,
+ RGB_VAD,RGB_VAI,KC_TRNS,
+ // right hand
+ KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
+ KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
+ KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
+ KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
+ KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS,
+ RGB_TOG, RGB_SLD,
+ KC_TRNS,
+ KC_TRNS, RGB_HUD, RGB_HUI
+),
+/* Keymap 2: Media and mouse keys
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | | | | | | | | | | | | | | | |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | | | | MsUp | | | | | | | | | | | |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | | | | | | | | | | | Prev | Next | | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | | | |Brwser|
+ * | | |------| |------| |Back |
+ * | | | | | | | |
+ * `--------------------' `--------------------'
+ */
+// MEDIA AND MOUSE
+[MDIA] = LAYOUT_ergodox(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS,
+ // right hand
+ 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_MPLY,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
+ KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_WBAK
+),
+};
+
+void eeconfig_init_user(void) {
+ rgblight_enable();
+ rgblight_sethsv_cyan();
+ rgblight_mode(1);
+ user_config.rgb_layer_change = true;
+ eeconfig_update_user(user_config.raw);
+}
+
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ // dynamically generate these.
+ case EPRM:
+ if (record->event.pressed) {
+ eeconfig_init();
+ }
+ return false;
+ break;
+ case VRSN:
+ if (record->event.pressed) {
+ SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
+ }
+ return false;
+ break;
+ case RGB_SLD:
+ if (record->event.pressed) {
+ #ifdef RGBLIGHT_ENABLE
+ rgblight_mode(1);
+ #endif
+ }
+ return false;
+ break;
+ case RGB_LYR: // This allows me to use underglow as layer indication, or as normal
+ if (record->event.pressed) {
+ user_config.rgb_layer_change ^= 1; // Toggles the status
+ eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM
+ if (user_config.rgb_layer_change) { // if layer state indication is enabled,
+ layer_state_set(layer_state); // then immediately update the layer color
+ }
+ }
+ return false; break;
+ case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // For any of the RGB codes (see quantum_keycodes.h, L400 for reference)
+ if (record->event.pressed) { //This disables layer indication, as it's assumed that if you're changing this ... you want that disabled
+ if (user_config.rgb_layer_change) { // only if this is enabled
+ user_config.rgb_layer_change = false; // disable it, and
+ eeconfig_update_user(user_config.raw); // write the setings to EEPROM
+ }
+ }
+ return true; break;
+ }
+ return true;
+}
+
+void matrix_init_user(void) {
+ // Call the keymap level matrix init.
+
+ // Read the user config from EEPROM
+ user_config.raw = eeconfig_read_user();
+
+ // Set default layer, if enabled
+ if (user_config.rgb_layer_change) {
+ rgblight_enable_noeeprom();
+ rgblight_sethsv_noeeprom_cyan();
+ rgblight_mode_noeeprom(1);
+ }
+}
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void) {
+
+};
+
+uint32_t layer_state_set_user(uint32_t state) {
+ ergodox_board_led_off();
+ ergodox_right_led_1_off();
+ ergodox_right_led_2_off();
+ ergodox_right_led_3_off();
+ switch (biton32(state)) {
+ case SYMB:
+ ergodox_right_led_1_on();
+ if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_red(); rgblight_mode_noeeprom(1); }
+ break;
+ case MDIA:
+ ergodox_right_led_2_on();
+ if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_green(); rgblight_mode_noeeprom(1); }
+ break;
+ case 3:
+ ergodox_right_led_3_on();
+ if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_blue(); rgblight_mode_noeeprom(1); }
+ break;
+ case 4:
+ ergodox_right_led_1_on();
+ ergodox_right_led_2_on();
+ if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_orange(); rgblight_mode_noeeprom(1); }
+ break;
+ case 5:
+ ergodox_right_led_1_on();
+ ergodox_right_led_3_on();
+ if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_yellow(); rgblight_mode_noeeprom(1); }
+ break;
+ case 6:
+ ergodox_right_led_2_on();
+ ergodox_right_led_3_on();
+ if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_pink(); rgblight_mode_noeeprom(1); }
+ break;
+ case 7:
+ ergodox_right_led_1_on();
+ ergodox_right_led_2_on();
+ ergodox_right_led_3_on();
+ if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_white(); rgblight_mode_noeeprom(1); }
+ break;
+ default: // for any other layers, or the default layer
+ if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_cyan(); rgblight_mode_noeeprom(1); }
+ break;
+ }
+ return state;
+}
+
diff --git a/keyboards/ergodox_ez/keymaps/skug/config.h b/keyboards/ergodox_ez/keymaps/skug/config.h
new file mode 100644
index 0000000000..abf1c635f1
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/skug/config.h
@@ -0,0 +1,8 @@
+#pragma once
+
+#define FORCE_NKRO
+
+#undef LSPO_KEY
+#undef RSPC_KEY
+#define LSPO_KEY KC_8 // Nordic Left SpaceCadet
+#define RSPC_KEY KC_9 // Nordic Right SpaceCadet
diff --git a/keyboards/ergodox_ez/keymaps/skug/keymap.c b/keyboards/ergodox_ez/keymaps/skug/keymap.c
new file mode 100644
index 0000000000..b3696f3a98
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/skug/keymap.c
@@ -0,0 +1,273 @@
+/* Copyright 2018 Andreas Lindhé, Christoffer Holmberg
+ *
+ * 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 QMK_KEYBOARD_H
+#include "version.h"
+#include "keymap_swedish.h"
+
+#define BASE 0 // default layer
+#define SYMB 1 // symbols
+#define MDIA 2 // media keys
+#define ARRW 3 // arrow + soon mouse
+
+enum custom_keycodes {
+ PLACEHOLDER = SAFE_RANGE, // can always be here
+ EPRM,
+ VRSN,
+ RGB_SLD
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Keymap 0: Basic layer
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | ½ | ! | " | # | # | % | Ins | | L1 | & | / | ( | ) | = | ? |
+ * | § | 1 | 2 @ | 3 £ | 4 $ | 5 | | | | 6 | 7 { | 8 [ | 9 ] | 0 } | + \ |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | Tab | Q | W | E | R | T | L2 | | L2 | Y | U | I | O | P | Å |
+ * | | | | | | | | | | | | | | | |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | L4 | A | S | D | F | G |------| |------| H | J | K | L |Ö / L3| Ä/L2 |
+ * | | | | | | | | | | | | | | | |
+ * |--------+------+------+------+------+------| Back | |Forwd |------+------+------+------+------+--------|
+ * | LShift/| Z | X | C | V | B | | | | N | M | ; | : | _ | RShift/|
+ * | ( | | | | | | | | | | | , | . | - | ) |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | '/ | ` |Alt | Left | Right| | Spc | Bksp | AltGr| * | ~/ |
+ * | Ctrl | ' | | | | | | | | | Ctrl |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,---------------.
+ * | <>| | End | | Home | ^ |
+ * ,------|------|------| |------+--------+------.
+ * | Left | Right| PgDn | | PgUp | Up | Down |
+ * |------|------|------| |------|--------|------|
+ * | Ctrl/| Alt/ | | | | Alt/ | Ctrl/|
+ * | Enter| Esc | Lgui | | Lgui | Esc | Enter|
+ * `--------------------' `----------------------'
+ */
+// If it accepts an argument (i.e, is a function), it doesn't need KC_
+// Otherwise, it needs KC_*
+[BASE] = LAYOUT_ergodox_80( // layer 0 : default
+ // left hand
+ NO_HALF, KC_1, KC_2, KC_3, KC_4, KC_5, KC_INS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB),
+ MO(ARRW), KC_A, KC_S, KC_D, KC_F, KC_G,
+ KC_LSPO, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_WBAK,
+ CTL_T(NO_APOS), NO_ACUT, KC_LALT, KC_BSPC, KC_SPC,
+ NO_LESS, KC_END,
+ KC_LEFT, KC_RIGHT, KC_PGDN,
+ CTL_T(KC_ENT), ALT_T(KC_ESC), KC_LGUI,
+
+ // right hand
+ TO(ARRW), KC_6, KC_7, KC_8, KC_9, KC_0, NO_PLUS,
+ TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, NO_AA,
+ KC_H, KC_J, KC_K, KC_L, LT(MDIA, NO_OSLH), LT(SYMB, NO_AE),
+ KC_WFWD, KC_N, KC_M, KC_COMM, KC_DOT, NO_MINS, KC_RSPC,
+ KC_SPC, KC_BSPC, KC_ALGR, NO_ASTR, CTL_T(NO_TILD),
+ KC_HOME, NO_CIRC,
+ KC_PGUP, KC_UP, KC_DOWN,
+ KC_LGUI, ALT_T(KC_ESC), CTL_T(KC_ENT)
+),
+/* Keymap: Symbol Layer
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * |Version | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | - | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | | | | | | . | 0 | = | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | | | | |
+ * |------|------|------| |------|------|------|
+ * | | | | | | | |
+ * `--------------------' `--------------------'
+ */
+// SYMBOLS
+[SYMB] = LAYOUT_ergodox_80(
+ // left hand
+ VRSN, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______,
+ _______,KC_EXLM,NO_AT, NO_LCBR,NO_RCBR,NO_PIPE,_______,
+ _______,KC_HASH,NO_DLR, NO_LPRN,NO_RPRN,NO_GRV,
+ _______,KC_PERC,NO_CIRC,NO_LBRC,NO_RBRC,NO_TILD,_______,
+ EPRM,_______,_______,_______,_______,
+ _______,_______,
+ _______,_______,_______,
+ _______,_______,_______,
+ // right hand
+ _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
+ _______, KC_UP, KC_7, KC_8, KC_9, NO_ASTR, KC_F12,
+ KC_DOWN, KC_4, KC_5, KC_6, NO_PLUS, _______,
+ _______, NO_AMPR, KC_1, KC_2, KC_3, NO_MINS, _______,
+ _______,KC_DOT, KC_0, NO_EQL, _______,
+ _______, _______,
+ _______, _______, _______,
+ _______, _______, _______
+),
+
+/* Keymap: Media and mouse keys
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | | | | | | | | | | | | | | | |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | | | MsUp | | | | | | | | | | | | |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | |MsLeft|MsDown|MsRght| | |------| |------| | | | | | Play |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | | | | | | | | | | | Prev | Next | | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | | | | |
+ * | |------|------| |------|------|------|
+ * | | | | | | |BrBck |
+ * `--------------------' `--------------------'
+ */
+// MEDIA AND MOUSE
+[MDIA] = LAYOUT_ergodox_80(
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, KC_MS_U, _______, _______, _______, _______,
+ _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, KC_BTN1, KC_BTN2,
+ _______, _______,
+ _______, _______, _______,
+ _______, _______, _______,
+ // right hand
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, KC_MPLY,
+ _______, _______, _______, KC_MPRV, KC_MNXT, _______, _______,
+ KC_VOLU, KC_VOLD, KC_MUTE, _______, _______,
+ _______, _______,
+ _______, _______, _______,
+ _______, _______, KC_WBAK
+),
+ // Keymap: Ducky Style arrows
+[ARRW] = LAYOUT_ergodox_80(
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, KC_UP , _______, _______, _______, _______,
+ _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, KC_DEL, _______,
+ _______, _______,
+ _______, _______, _______,
+ _______, _______, _______,
+ // right hand
+ TO(BASE), _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______,
+ _______, _______,
+ _______, _______, _______,
+ _______, _______, _______
+),
+
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+ [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ // MACRODOWN only works in this function
+ switch(id) {
+ case 0:
+ if (record->event.pressed) {
+ SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
+ }
+ break;
+ case 1:
+ if (record->event.pressed) { // For resetting EEPROM
+ eeconfig_init();
+ }
+ break;
+ }
+ return MACRO_NONE;
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ // dynamically generate these.
+ case EPRM:
+ if (record->event.pressed) {
+ eeconfig_init();
+ }
+ return false;
+ break;
+ case VRSN:
+ if (record->event.pressed) {
+ SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
+ }
+ return false;
+ break;
+ case RGB_SLD:
+ if (record->event.pressed) {
+ #ifdef RGBLIGHT_ENABLE
+ rgblight_mode(1);
+ #endif
+ }
+ return false;
+ break;
+ }
+ return true;
+}
+
+// Runs just one time when the keyboard initializes.
+void matrix_init_user(void) {
+
+};
+
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void) {
+
+ uint8_t layer = biton32(layer_state);
+
+ ergodox_board_led_off();
+ ergodox_right_led_1_off();
+ ergodox_right_led_2_off();
+ ergodox_right_led_3_off();
+ switch (layer) {
+ // Binary: lsb at bottom
+ case 1:
+ ergodox_right_led_3_on();
+ break;
+ case 2:
+ ergodox_right_led_2_on();
+ break;
+ case 3:
+ ergodox_board_led_on();
+ default:
+ // none
+ break;
+ }
+};
diff --git a/keyboards/ergodox_ez/keymaps/skug/readme.md b/keyboards/ergodox_ez/keymaps/skug/readme.md
new file mode 100644
index 0000000000..5c155619c0
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/skug/readme.md
@@ -0,0 +1,4 @@
+# Nordic Qwerty layout for ErgoDox EZ, based on Andreas Lindhe's version
+
+*NOTE:* it might still be desirable to set the software layout to sv_SE in your
+OS.
diff --git a/keyboards/ergodox_ez/keymaps/testing/keymap.c b/keyboards/ergodox_ez/keymaps/testing/keymap.c
index df0ed073f2..2fdd122363 100644
--- a/keyboards/ergodox_ez/keymaps/testing/keymap.c
+++ b/keyboards/ergodox_ez/keymaps/testing/keymap.c
@@ -28,10 +28,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
};
-const uint16_t PROGMEM fn_actions[] = {
- [1] = ACTION_LAYER_TAP_TOGGLE(1)
-};
-
// leaving this in place for compatibilty with old keymaps cloned and re-compiled.
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
diff --git a/keyboards/ergodox_ez/keymaps/vim/vim.h b/keyboards/ergodox_ez/keymaps/vim/vim.h
index e9b682fd3f..7565c6e3e6 100644
--- a/keyboards/ergodox_ez/keymaps/vim/vim.h
+++ b/keyboards/ergodox_ez/keymaps/vim/vim.h
@@ -9,7 +9,6 @@
#define PRESS(keycode) register_code16(keycode)
#define RELEASE(keycode) unregister_code16(keycode)
-#define PREVENT_STUCK_MODIFIERS
uint16_t VIM_QUEUE = KC_NO;
diff --git a/keyboards/ergodox_ez/matrix.c b/keyboards/ergodox_ez/matrix.c
index 2e95c83b65..22837d312a 100644
--- a/keyboards/ergodox_ez/matrix.c
+++ b/keyboards/ergodox_ez/matrix.c
@@ -57,6 +57,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* matrix state(1:on, 0:off) */
static matrix_row_t matrix[MATRIX_ROWS];
+/*
+ * matrix state(1:on, 0:off)
+ * contains the raw values without debounce filtering of the last read cycle.
+ */
+static matrix_row_t raw_matrix[MATRIX_ROWS];
// Debouncing: store for each key the number of scans until it's eligible to
// change. When scanning the matrix, ignore any changes in keys that have
@@ -118,6 +123,7 @@ void matrix_init(void)
// initialize matrix state: all keys off
for (uint8_t i=0; i < MATRIX_ROWS; i++) {
matrix[i] = 0;
+ raw_matrix[i] = 0;
for (uint8_t j=0; j < MATRIX_COLS; ++j) {
debounce_matrix[i * MATRIX_COLS + j] = 0;
}
@@ -151,26 +157,30 @@ void matrix_power_up(void) {
// Returns a matrix_row_t whose bits are set if the corresponding key should be
// eligible to change in this scan.
-matrix_row_t debounce_mask(uint8_t row) {
+matrix_row_t debounce_mask(matrix_row_t rawcols, uint8_t row) {
matrix_row_t result = 0;
- for (uint8_t j=0; j < MATRIX_COLS; ++j) {
- if (debounce_matrix[row * MATRIX_COLS + j]) {
- --debounce_matrix[row * MATRIX_COLS + j];
+ matrix_row_t change = rawcols ^ raw_matrix[row];
+ raw_matrix[row] = rawcols;
+ for (uint8_t i = 0; i < MATRIX_COLS; ++i) {
+ if (debounce_matrix[row * MATRIX_COLS + i]) {
+ --debounce_matrix[row * MATRIX_COLS + i];
} else {
- result |= (1 << j);
+ result |= (1 << i);
}
- }
- return result;
-}
-
-// Report changed keys in the given row. Resets the debounce countdowns
-// corresponding to each set bit in 'change' to DEBOUNCE.
-void debounce_report(matrix_row_t change, uint8_t row) {
- for (uint8_t i = 0; i < MATRIX_COLS; ++i) {
if (change & (1 << i)) {
debounce_matrix[row * MATRIX_COLS + i] = DEBOUNCE;
}
}
+ return result;
+}
+
+matrix_row_t debounce_read_cols(uint8_t row) {
+ // Read the row without debouncing filtering and store it for later usage.
+ matrix_row_t cols = read_cols(row);
+ // Get the Debounce mask.
+ matrix_row_t mask = debounce_mask(cols, row);
+ // debounce the row and return the result.
+ return (cols & mask) | (matrix[row] & ~mask);;
}
uint8_t matrix_scan(void)
@@ -214,15 +224,12 @@ uint8_t matrix_scan(void)
select_row(i + MATRIX_ROWS_PER_SIDE);
// we don't need a 30us delay anymore, because selecting a
// left-hand row requires more than 30us for i2c.
- matrix_row_t mask = debounce_mask(i);
- matrix_row_t cols = (read_cols(i) & mask) | (matrix[i] & ~mask);
- debounce_report(cols ^ matrix[i], i);
- matrix[i] = cols;
+
+ // grab cols from left hand
+ matrix[i] = debounce_read_cols(i);
// grab cols from right hand
- mask = debounce_mask(i + MATRIX_ROWS_PER_SIDE);
- cols = (read_cols(i + MATRIX_ROWS_PER_SIDE) & mask) | (matrix[i + MATRIX_ROWS_PER_SIDE] & ~mask);
- debounce_report(cols ^ matrix[i + MATRIX_ROWS_PER_SIDE], i + MATRIX_ROWS_PER_SIDE);
- matrix[i + MATRIX_ROWS_PER_SIDE] = cols;
+ matrix[i + MATRIX_ROWS_PER_SIDE] = debounce_read_cols(i + MATRIX_ROWS_PER_SIDE);
+
unselect_rows();
}
@@ -379,7 +386,7 @@ static void select_row(uint8_t row)
break;
case 11:
DDRD |= (1<<2);
- PORTD &= ~(1<<3);
+ PORTD &= ~(1<<2);
break;
case 12:
DDRD |= (1<<3);
@@ -392,4 +399,3 @@ static void select_row(uint8_t row)
}
}
}
-
diff --git a/keyboards/ergodox_ez/rules.mk b/keyboards/ergodox_ez/rules.mk
index dfbdba10d6..446ba3e21a 100644
--- a/keyboards/ergodox_ez/rules.mk
+++ b/keyboards/ergodox_ez/rules.mk
@@ -15,8 +15,7 @@
#----------------------------------------------------------------------------
# # project specific files
-SRC = matrix.c \
- i2c_master.c
+SRC += matrix.c
# MCU name
MCU = atmega32u4
@@ -83,6 +82,11 @@ SWAP_HANDS_ENABLE= yes # Allow swapping hands of keyboard
SLEEP_LED_ENABLE = no
API_SYSEX_ENABLE = no
RGBLIGHT_ENABLE = yes
-RGB_MATRIX_ENABLE = no // enable later
+RGB_MATRIX_ENABLE = no # enable later
+
+ifeq ($(strip $(RGB_MATRIX_ENABLE)), no)
+ SRC += i2c_master.c
+endif
+
LAYOUTS = ergodox
diff --git a/keyboards/ergodox_ez/util/compile_keymap.py b/keyboards/ergodox_ez/util/compile_keymap.py
index 7076a6ecb2..f427d6fd80 100644
--- a/keyboards/ergodox_ez/util/compile_keymap.py
+++ b/keyboards/ergodox_ez/util/compile_keymap.py
@@ -668,9 +668,6 @@ def iter_keymap_parts(config, keymaps):
yield "};\n\n"
- # no idea what this is for
- yield "const uint16_t PROGMEM fn_actions[] = {};\n"
-
# macros
yield MACROCODE.format(
macro_cases="",