aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--keyboards/ergodox_ez/keymaps/drashna/config.h2
-rw-r--r--keyboards/ergodox_ez/keymaps/drashna/keymap.c164
-rw-r--r--keyboards/orthodox/keymaps/drashna/config.h2
-rw-r--r--keyboards/orthodox/keymaps/drashna/keymap.c57
-rw-r--r--keyboards/orthodox/keymaps/drashna/rules.mk2
-rw-r--r--users/drashna/drashna.c36
-rw-r--r--users/drashna/drashna.h63
-rw-r--r--users/drashna/readme.md16
8 files changed, 215 insertions, 127 deletions
diff --git a/keyboards/ergodox_ez/keymaps/drashna/config.h b/keyboards/ergodox_ez/keymaps/drashna/config.h
index 2f5422b14..d543379a3 100644
--- a/keyboards/ergodox_ez/keymaps/drashna/config.h
+++ b/keyboards/ergodox_ez/keymaps/drashna/config.h
@@ -15,7 +15,7 @@
15#ifdef TAPPING_TERM 15#ifdef TAPPING_TERM
16#undef TAPPING_TERM 16#undef TAPPING_TERM
17#endif 17#endif
18#define TAPPING_TERM 150 18#define TAPPING_TERM 175
19#undef PERMISSIVE_HOLD 19#undef PERMISSIVE_HOLD
20#define IGNORE_MOD_TAP_INTERRUPT // 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.) 20#define IGNORE_MOD_TAP_INTERRUPT // 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.)
21#define ONESHOT_TAP_TOGGLE 2 21#define ONESHOT_TAP_TOGGLE 2
diff --git a/keyboards/ergodox_ez/keymaps/drashna/keymap.c b/keyboards/ergodox_ez/keymaps/drashna/keymap.c
index 0d0e1fba2..268a1d085 100644
--- a/keyboards/ergodox_ez/keymaps/drashna/keymap.c
+++ b/keyboards/ergodox_ez/keymaps/drashna/keymap.c
@@ -48,26 +48,26 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
48 * | | | End | | PgDn | | | 48 * | | | End | | PgDn | | |
49 * `---------------------' `---------------------' 49 * `---------------------' `---------------------'
50 */ 50 */
51 [_QWERTY] = LAYOUT_ergodox( 51 [_QWERTY] = LAYOUT_ergodox_wrapper(
52 KC_EQUAL, KC_1, KC_2, KC_3, KC_4, KC_5, TG(_MOUS), 52 KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, TG(_MOUS),
53 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(_DIABLO), 53 KC_TAB, _________________QWERTY_L1_________________, TG(_DIABLO),
54 KC_BSPACE, KC_A, KC_S, KC_D, KC_F, KC_G, 54 KC_BSPC, _________________QWERTY_L2_________________,
55 KC_LSFT, LCTL_T(KC_Z),KC_X, KC_C, KC_V, KC_B, TG(_GAMEPAD), 55 KC_LSFT, _________________QWERTY_L3_________________, TG(_GAMEPAD),
56 LT(_SYMB,KC_GRAVE),KC_QUOTE, KC_LGUI, KC_LBRACKET,KC_RBRACKET, 56 LT(_SYMB,KC_GRV), ___________ERGODOX_BOTTOM_LEFT_____________,
57 57
58 ALT_T(KC_APPLICATION), KC_LGUI, 58 ALT_T(KC_APP), KC_LGUI,
59 KC_HOME, 59 KC_HOME,
60 KC_SPACE, KC_BSPACE, KC_END, 60 KC_SPACE,KC_BSPC, KC_END,
61 61
62 TG(_MOUS), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, 62 TG(_MOUS), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
63 TG(_DIABLO), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLASH, 63 TG(_DIABLO), _________________QWERTY_R1_________________, KC_BSLS,
64 KC_H, KC_J, KC_K, KC_L, KC_SCOLON, GUI_T(KC_QUOTE), 64 _________________QWERTY_R2_________________, GUI_T(KC_QUOT),
65 TG(_GAMEPAD), KC_N, KC_M, KC_COMMA, KC_DOT, RCTL_T(KC_SLASH),OSM(MOD_RSFT), 65 TG(_GAMEPAD), _________________QWERTY_R3_________________, KC_RSFT,
66 KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, TT(_SYMB), 66 ___________ERGODOX_BOTTOM_RIGHT____________, TT(_SYMB),
67 KC_RGUI, CTL_T(KC_ESCAPE), 67 KC_RGUI, CTL_T(KC_ESCAPE),
68 KC_PGUP, 68 KC_PGUP,
69 KC_PGDOWN, KC_DELETE, KC_ENTER 69 KC_PGDOWN, KC_DELETE, KC_ENTER
70 ), 70 ),
71/* Keymap 0: Basic layer 71/* Keymap 0: Basic layer
72 * 72 *
73 * ,--------------------------------------------------. ,--------------------------------------------------. 73 * ,--------------------------------------------------. ,--------------------------------------------------.
@@ -91,25 +91,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
91 */ 91 */
92// If it accepts an argument (i.e, is a function), it doesn't need KC_. 92// If it accepts an argument (i.e, is a function), it doesn't need KC_.
93// Otherwise, it needs KC_* 93// Otherwise, it needs KC_*
94[_COLEMAK] = LAYOUT_ergodox( 94[_COLEMAK] = LAYOUT_ergodox_wrapper(
95 // left hand 95 // left hand
96 KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, TG(_MOUS), 96 KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, TG(_MOUS),
97 KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, TG(_DIABLO), 97 KC_TAB, _________________COLEMAK_L1________________, TG(_DIABLO),
98 KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, 98 KC_BSPC, _________________COLEMAK_L2________________,
99 KC_LSFT, LCTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, TG(_GAMEPAD), 99 KC_LSFT, _________________COLEMAK_L3________________, TG(_GAMEPAD),
100 LT(_SYMB,KC_GRV),KC_QUOT, KC_LGUI, KC_LBRACKET,KC_RBRACKET, 100 LT(_SYMB,KC_GRV), ___________ERGODOX_BOTTOM_LEFT_____________,
101 ALT_T(KC_APP), KC_LGUI, 101 ALT_T(KC_APP), KC_LGUI,
102 KC_HOME, 102 KC_HOME,
103 KC_SPC,KC_BSPC,KC_END, 103 KC_SPACE,KC_BSPC, KC_END,
104 // right hand 104 // right hand
105 TG(_MOUS), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, 105 TG(_MOUS), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
106 TG(_DIABLO), KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSLS, 106 TG(_DIABLO), _________________COLEMAK_R1________________, KC_BSLS,
107 KC_H, KC_N, KC_E, KC_I, KC_O, GUI_T(KC_QUOTE), 107 _________________COLEMAK_R2________________, GUI_T(KC_QUOT),
108 TG(_GAMEPAD),KC_K, KC_M, KC_COMM,KC_DOT, RCTL_T(KC_SLASH), OSM(MOD_RSFT), 108 TG(_GAMEPAD), _________________COLEMAK_R3________________, KC_RSFT,
109 KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, TT(_SYMB), 109 ___________ERGODOX_BOTTOM_RIGHT____________, TT(_SYMB),
110 KC_RGUI, CTL_T(KC_ESC), 110 KC_RGUI, CTL_T(KC_ESCAPE),
111 KC_PGUP, 111 KC_PGUP,
112 KC_PGDN,KC_DELETE, KC_ENT 112 KC_PGDOWN, KC_DELETE, KC_ENTER
113 ), 113 ),
114/* Keymap 0: Basic layer 114/* Keymap 0: Basic layer
115 * 115 *
@@ -134,25 +134,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
134 */ 134 */
135// If it accepts an argument (i.e, is a function), it doesn't need KC_. 135// If it accepts an argument (i.e, is a function), it doesn't need KC_.
136// Otherwise, it needs KC_* 136// Otherwise, it needs KC_*
137[_DVORAK] = LAYOUT_ergodox( 137[_DVORAK] = LAYOUT_ergodox_wrapper(
138 // left hand 138 // left hand
139 KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, TG(_MOUS), 139 KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, TG(_MOUS),
140 KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, TG(_DIABLO), 140 KC_TAB, _________________DVORAK_L1_________________, TG(_DIABLO),
141 KC_BSPC, KC_A, KC_O, KC_E, KC_U, KC_I, 141 KC_BSPC, _________________DVORAK_L2_________________,
142 KC_LSFT, LCTL_T(KC_SCLN), KC_Q, KC_J, KC_K, KC_X, TG(_GAMEPAD), 142 KC_LSFT, _________________DVORAK_L3_________________, TG(_GAMEPAD),
143 LT(_SYMB,KC_GRV),KC_QUOT, KC_LGUI, KC_LBRACKET, KC_RBRACKET, 143 LT(_SYMB,KC_GRV), ___________ERGODOX_BOTTOM_LEFT_____________,
144 ALT_T(KC_APP), KC_LEAD, 144 ALT_T(KC_APP), KC_LGUI,
145 KC_HOME, 145 KC_HOME,
146 KC_SPC,KC_BSPC,KC_END, 146 KC_SPACE,KC_BSPC, KC_END,
147 // right hand 147 // right hand
148 TG(_MOUS), KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS, 148 TG(_MOUS), KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS,
149 TG(_DIABLO), KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, 149 TG(_DIABLO), _________________DVORAK_R1_________________, KC_SLSH,
150 KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, 150 _________________DVORAK_R2_________________, GUI_T(KC_MINS),
151 TG(_GAMEPAD),KC_B, KC_M, KC_W, KC_V, RCTL_T(KC_Z), OSM(MOD_RSFT), 151 TG(_GAMEPAD), _________________DVORAK_R3_________________, KC_RSFT,
152 KC_LEFT,KC_DOWN,KC_UP, KC_RIGHT, TT(_SYMB), 152 ___________ERGODOX_BOTTOM_RIGHT____________, TT(_SYMB),
153 KC_LALT, CTL_T(KC_ESC), 153 KC_RGUI, CTL_T(KC_ESCAPE),
154 KC_PGUP, 154 KC_PGUP,
155 KC_PGDN,KC_DELETE, KC_ENT 155 KC_PGDOWN, KC_DELETE, KC_ENTER
156 ), 156 ),
157/* Keymap 0: Basic layer 157/* Keymap 0: Basic layer
158 * 158 *
@@ -177,27 +177,47 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
177 */ 177 */
178// If it accepts an argument (i.e, is a function), it doesn't need KC_. 178// If it accepts an argument (i.e, is a function), it doesn't need KC_.
179// Otherwise, it needs KC_* 179// Otherwise, it needs KC_*
180[_WORKMAN] = LAYOUT_ergodox( 180[_WORKMAN] = LAYOUT_ergodox_wrapper(
181 // left hand 181 // left hand
182 KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, TG(_MOUS), 182 KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, TG(_MOUS),
183 KC_TAB, KC_Q, KC_D, KC_R, KC_W, KC_B, TG(_DIABLO), 183 KC_TAB, _________________WORKMAN_L1________________, TG(_DIABLO),
184 KC_BSPC, KC_A, KC_S, KC_H, KC_T, KC_G, 184 KC_BSPC, _________________WORKMAN_L2________________,
185 KC_LSFT, LCTL_T(KC_Z), KC_X, KC_M, KC_C, KC_V, TG(_GAMEPAD), 185 KC_LSFT, _________________WORKMAN_L3________________, TG(_GAMEPAD),
186 LT(_SYMB,KC_GRV),KC_QUOT, KC_LGUI, KC_LBRACKET,KC_RBRACKET, 186 LT(_SYMB,KC_GRV), ___________ERGODOX_BOTTOM_LEFT_____________,
187 ALT_T(KC_APP), KC_LEAD, 187 ALT_T(KC_APP), KC_LGUI,
188 KC_HOME, 188 KC_HOME,
189 KC_SPC,KC_BSPC,KC_END, 189 KC_SPACE,KC_BSPC, KC_END,
190 // right hand 190 // right hand
191 TG(_MOUS), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, 191 TG(_MOUS), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
192 TG(_DIABLO), KC_J, KC_F, KC_U, KC_P, KC_SCLN, KC_BSLS, 192 TG(_DIABLO), _________________WORKMAN_R1________________, KC_BSLS,
193 KC_Y, KC_N, KC_E, KC_O, KC_I, KC_QUOTE, 193 _________________WORKMAN_R2________________, GUI_T(KC_QUOT),
194 TG(_GAMEPAD),KC_K, KC_L, KC_COMM,KC_DOT, RCTL_T(KC_SLASH), OSM(MOD_RSFT), 194 TG(_GAMEPAD), _________________WORKMAN_R3________________, KC_RSFT,
195 KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, TT(_SYMB), 195 ___________ERGODOX_BOTTOM_RIGHT____________, TT(_SYMB),
196 KC_LALT, CTL_T(KC_ESC), 196 KC_RGUI, CTL_T(KC_ESCAPE),
197 KC_PGUP, 197 KC_PGUP,
198 KC_PGDN,KC_DELETE, KC_ENT 198 KC_PGDOWN, KC_DELETE, KC_ENTER
199 ), 199 ),
200 200
201 [_MODS] = LAYOUT_ergodox(
202 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
203 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
204 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
205 OSM(MOD_LSFT),KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
206 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
207 KC_TRNS, KC_TRNS,
208 KC_TRNS,
209 KC_TRNS, KC_TRNS, KC_TRNS,
210
211 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
212 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
213 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
214 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, OSM(MOD_RSFT),
215 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
216 KC_TRNS, KC_TRNS,
217 KC_TRNS,
218 KC_TRNS, KC_TRNS, KC_TRNS
219 ),
220
201 /* Keymap 3: Symbol Layer 221 /* Keymap 3: Symbol Layer
202* 222*
203* ,--------------------------------------------------. ,--------------------------------------------------. 223* ,--------------------------------------------------. ,--------------------------------------------------.
@@ -220,11 +240,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
220* `--------------------' `--------------------' 240* `--------------------' `--------------------'
221*/ 241*/
222 [_SYMB] = LAYOUT_ergodox( 242 [_SYMB] = LAYOUT_ergodox(
223 EPRM, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_WORKMAN, 243 EPRM, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, TG(_MODS),
224 VRSN, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, KC_DVORAK, 244 VRSN, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, KC_WORKMAN,
225 KC_MAKE, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRAVE, 245 KC_MAKE, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRAVE,
226 KC_RESET, KC_PERC, KC_CIRC, KC_LBRACKET,KC_RBRACKET,KC_TILD, KC_COLEMAK, 246 KC_RESET, KC_PERC, KC_CIRC, KC_LBRACKET,KC_RBRACKET,KC_TILD, KC_COLEMAK,
227 KC_TRNS, KC_AMPR, KC_ASTR, KC_COLN, KC_SCOLON, 247 KC_TRNS, KC_AMPR, KC_ASTR, KC_COLN, KC_SCOLON,
228 RGB_SMOD, KC_RGB_T, 248 RGB_SMOD, KC_RGB_T,
229 RGB_HUI, 249 RGB_HUI,
230 RGB_M_R, RGB_M_SW, RGB_HUD, 250 RGB_M_R, RGB_M_SW, RGB_HUD,
diff --git a/keyboards/orthodox/keymaps/drashna/config.h b/keyboards/orthodox/keymaps/drashna/config.h
index d83b77927..c83380bd0 100644
--- a/keyboards/orthodox/keymaps/drashna/config.h
+++ b/keyboards/orthodox/keymaps/drashna/config.h
@@ -68,7 +68,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
68 68
69#ifdef AUDIO_ENABLE 69#ifdef AUDIO_ENABLE
70#define C6_AUDIO 70#define C6_AUDIO
71#define STARTUP_SONG SONG(ZELDA_TREASURE) 71#define STARTUP_SONG SONG(IMPERIAL_MARCH)
72#endif 72#endif
73 73
74#undef PRODUCT 74#undef PRODUCT
diff --git a/keyboards/orthodox/keymaps/drashna/keymap.c b/keyboards/orthodox/keymaps/drashna/keymap.c
index f74b39ae4..cb76a20bd 100644
--- a/keyboards/orthodox/keymaps/drashna/keymap.c
+++ b/keyboards/orthodox/keymaps/drashna/keymap.c
@@ -31,49 +31,54 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
31// Fillers to make layering more clear 31// Fillers to make layering more clear
32#define _______ KC_TRNS 32#define _______ KC_TRNS
33#define XXXXXXX KC_NO 33#define XXXXXXX KC_NO
34 34#define KC_MSHF OSM(MOD_LSFT)
35 35
36const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 36const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
37 37
38[_QWERTY] = KEYMAP(\ 38[_QWERTY] = KEYMAP_wrapper(\
39 KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ 39 KC_ESC, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, \
40 KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_UP, KC_DOWN, KC_LEFT, KC_RIGHT, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ 40 KC_TAB, _________________QWERTY_L2_________________, KC_UP, KC_DOWN, KC_LEFT, KC_RIGHT, _________________QWERTY_R2_________________, KC_QUOT, \
41 KC_LSFT,CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, LOWER, KC_SPACE, KC_BSPC, KC_DEL, KC_ENT, RAISE, KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLASH), KC_LGUI \ 41 KC_LSFT, _________________QWERTY_L3_________________, LOWER, KC_SPACE,KC_BSPC, KC_DEL, KC_ENT, RAISE, _________________QWERTY_R3_________________, KC_LGUI \
42), 42),
43 43
44[_COLEMAK] = KEYMAP(\ 44[_COLEMAK] = KEYMAP_wrapper(\
45 KC_ESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ 45 KC_ESC, _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, KC_BSPC, \
46 KC_TAB, KC_A, KC_R, KC_S, KC_T, KC_D, KC_UP, KC_DOWN, KC_LEFT, KC_RIGHT, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ 46 KC_TAB, _________________COLEMAK_L2________________, KC_UP, KC_DOWN, KC_LEFT, KC_RIGHT, _________________COLEMAK_R2________________, KC_QUOT, \
47 KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, LOWER, KC_SPACE, KC_BSPC, KC_DEL, KC_ENT, RAISE, KC_K, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLASH), KC_LGUI \ 47 KC_LSFT, _________________COLEMAK_L3________________, LOWER, KC_SPACE,KC_BSPC, KC_DEL, KC_ENT, RAISE, _________________COLEMAK_R3________________, KC_LGUI \
48), 48),
49 49
50[_DVORAK] = KEYMAP(\ 50[_DVORAK] = KEYMAP_wrapper(\
51 KC_ESC, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ 51 KC_ESC, _________________DVORAK_L1_________________, _________________DVORAK_R1_________________, KC_BSPC, \
52 KC_TAB, KC_A, KC_O, KC_E, KC_U, KC_I, KC_UP, KC_DOWN, KC_LEFT, KC_RIGHT, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, \ 52 KC_TAB, _________________DVORAK_L2_________________, KC_UP, KC_DOWN, KC_LEFT, KC_RIGHT, _________________DVORAK_R2_________________, KC_MINS, \
53 KC_LSFT, CTL_T(KC_SCLN), KC_Q, KC_J, KC_K, KC_X, LOWER, KC_SPACE, KC_BSPC, KC_DEL, KC_ENT, RAISE, KC_B, KC_M, KC_W, KC_V, CTL_T(KC_Z), KC_LGUI \ 53 KC_LSFT, _________________DVORAK_L3_________________, LOWER, KC_SPACE,KC_BSPC, KC_DEL, KC_ENT, RAISE, _________________DVORAK_R3_________________, KC_LGUI \
54),
55[_WORKMAN] = KEYMAP_wrapper(\
56 KC_ESC, _________________WORKMAN_L1________________, _________________WORKMAN_R1________________, KC_BSPC, \
57 KC_TAB, _________________WORKMAN_L2________________, KC_UP, KC_DOWN, KC_LEFT, KC_RIGHT, _________________WORKMAN_R2________________, KC_MINS, \
58 KC_LSFT, _________________WORKMAN_L3________________, LOWER, KC_SPACE,KC_BSPC, KC_DEL, KC_ENT, RAISE, _________________WORKMAN_R3________________, KC_LGUI \
54), 59),
55[_WORKMAN] = KEYMAP(\ 60[_MODS] = KEYMAP(\
56 KC_ESC, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ 61 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
57 KC_TAB, KC_A, KC_O, KC_E, KC_U, KC_I, KC_UP, KC_DOWN, KC_LEFT, KC_RIGHT, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, \ 62 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
58 KC_LSFT,CTL_T(KC_SCLN), KC_Q, KC_J, KC_K, KC_X, LOWER, KC_SPACE, KC_BSPC, KC_DEL, KC_ENT, RAISE, KC_B, KC_M, KC_W, KC_V, CTL_T(KC_Z), KC_LGUI \ 63 OSM(MOD_LSFT), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
59), 64),
60 65
61[_LOWER] = KEYMAP(\ 66[_LOWER] = KEYMAP(\
62 KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \ 67 KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \
63 KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, KC_F12, _______, KC_RCTL, XXXXXXX, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ 68 KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, KC_F12, _______, KC_RCTL, XXXXXXX, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \
64 _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______, _______, _______, _______, _______, _______, XXXXXXX, KC_HOME, KC_COMM, KC_DOT, KC_END, _______ \ 69 _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______, _______, _______, _______, _______, _______, XXXXXXX, KC_HOME, KC_COMM, KC_DOT, KC_END, _______ \
65), 70),
66 71
67[_RAISE] = KEYMAP(\ 72[_RAISE] = KEYMAP(\
68 KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ 73 KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \
69 KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, KC_F12, _______, _______, XXXXXXX, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ 74 KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, KC_F12, _______, _______, XXXXXXX, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \
70 _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______, _______, _______, _______, _______, _______, XXXXXXX, KC_PGUP, KC_COMM, KC_DOT, KC_PGDN, _______ \ 75 _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______, _______, _______, _______, _______, _______, XXXXXXX, KC_PGUP, KC_COMM, KC_DOT, KC_PGDN, _______ \
71), 76),
72 77
73[_ADJUST] = KEYMAP(\ 78[_ADJUST] = KEYMAP(\
74 KC_MAKE,KC_RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ 79 KC_MAKE,KC_RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
75 RGB_SMOD,RGB_HUI, KC_FXCL, AUD_ON, AUD_OFF, AG_NORM, _______, _______, _______, _______, AG_SWAP, KC_QWERTY, KC_COLEMAK, KC_DVORAK, KC_WORKMAN, _______, \ 80 RGB_SMOD,RGB_HUI, KC_FXCL, AUD_ON, AUD_OFF, AG_NORM, _______, _______, _______, _______, AG_SWAP, KC_QWERTY, KC_COLEMAK, KC_DVORAK, KC_WORKMAN, TG(_MODS), \
76 KC_RGB_T,RGB_HUD, MU_ON, MU_OFF, MU_TOG, MU_MOD, _______, _______, _______, _______, _______, _______, MAGIC_TOGGLE_NKRO, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT, KC_MPLY \ 81 KC_RGB_T,RGB_HUD, MU_ON, MU_OFF, MU_TOG, MU_MOD, _______, _______, _______, _______, _______, _______, MAGIC_TOGGLE_NKRO, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT, KC_MPLY \
77) 82)
78 83
79 84
diff --git a/keyboards/orthodox/keymaps/drashna/rules.mk b/keyboards/orthodox/keymaps/drashna/rules.mk
index c4cf6629c..222a43640 100644
--- a/keyboards/orthodox/keymaps/drashna/rules.mk
+++ b/keyboards/orthodox/keymaps/drashna/rules.mk
@@ -7,5 +7,3 @@ TAP_DANCE_ENABLE = no
7RGBLIGHT_ENABLE = yes 7RGBLIGHT_ENABLE = yes
8AUDIO_ENABLE = yes 8AUDIO_ENABLE = yes
9NKRO_ENABLE = yes 9NKRO_ENABLE = yes
10FAUXCLICKY_ENABLE = no
11USE_I2C = no
diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c
index a07d74407..6039c7c56 100644
--- a/users/drashna/drashna.c
+++ b/users/drashna/drashna.c
@@ -166,7 +166,7 @@ void matrix_init_user(void) {
166 } 166 }
167#endif 167#endif
168#ifdef AUDIO_ENABLE 168#ifdef AUDIO_ENABLE
169// _delay_ms(21); // gets rid of tick 169// wait_ms(21); // gets rid of tick
170// stop_all_notes(); 170// stop_all_notes();
171// PLAY_SONG(tone_hackstartup); 171// PLAY_SONG(tone_hackstartup);
172#endif 172#endif
@@ -329,7 +329,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
329 if (!record->event.pressed) { 329 if (!record->event.pressed) {
330 register_code(is_overwatch ? KC_BSPC : KC_ENTER); 330 register_code(is_overwatch ? KC_BSPC : KC_ENTER);
331 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER); 331 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER);
332 _delay_ms(50); 332 wait_ms(50);
333 SEND_STRING("Salt, salt, salt..."); 333 SEND_STRING("Salt, salt, salt...");
334 register_code(KC_ENTER); 334 register_code(KC_ENTER);
335 unregister_code(KC_ENTER); 335 unregister_code(KC_ENTER);
@@ -340,7 +340,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
340 if (!record->event.pressed) { 340 if (!record->event.pressed) {
341 register_code(is_overwatch ? KC_BSPC : KC_ENTER); 341 register_code(is_overwatch ? KC_BSPC : KC_ENTER);
342 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER); 342 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER);
343 _delay_ms(50); 343 wait_ms(50);
344 SEND_STRING("Please sir, can I have some more salt?!"); 344 SEND_STRING("Please sir, can I have some more salt?!");
345 register_code(KC_ENTER); 345 register_code(KC_ENTER);
346 unregister_code(KC_ENTER); 346 unregister_code(KC_ENTER);
@@ -351,7 +351,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
351 if (!record->event.pressed) { 351 if (!record->event.pressed) {
352 register_code(is_overwatch ? KC_BSPC : KC_ENTER); 352 register_code(is_overwatch ? KC_BSPC : KC_ENTER);
353 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER); 353 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER);
354 _delay_ms(50); 354 wait_ms(50);
355 SEND_STRING("Your salt only makes me harder, and even more aggressive!"); 355 SEND_STRING("Your salt only makes me harder, and even more aggressive!");
356 register_code(KC_ENTER); 356 register_code(KC_ENTER);
357 unregister_code(KC_ENTER); 357 unregister_code(KC_ENTER);
@@ -362,7 +362,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
362 if (!record->event.pressed) { 362 if (!record->event.pressed) {
363 register_code(is_overwatch ? KC_BSPC : KC_ENTER); 363 register_code(is_overwatch ? KC_BSPC : KC_ENTER);
364 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER); 364 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER);
365 _delay_ms(50); 365 wait_ms(50);
366 SEND_STRING("Good game, everyone!"); 366 SEND_STRING("Good game, everyone!");
367 register_code(KC_ENTER); 367 register_code(KC_ENTER);
368 unregister_code(KC_ENTER); 368 unregister_code(KC_ENTER);
@@ -373,7 +373,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
373 if (!record->event.pressed) { 373 if (!record->event.pressed) {
374 register_code(is_overwatch ? KC_BSPC : KC_ENTER); 374 register_code(is_overwatch ? KC_BSPC : KC_ENTER);
375 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER); 375 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER);
376 _delay_ms(50); 376 wait_ms(50);
377 SEND_STRING("Good luck, have fun!!!"); 377 SEND_STRING("Good luck, have fun!!!");
378 register_code(KC_ENTER); 378 register_code(KC_ENTER);
379 unregister_code(KC_ENTER); 379 unregister_code(KC_ENTER);
@@ -384,7 +384,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
384 if (!record->event.pressed) { 384 if (!record->event.pressed) {
385 register_code(is_overwatch ? KC_BSPC : KC_ENTER); 385 register_code(is_overwatch ? KC_BSPC : KC_ENTER);
386 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER); 386 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER);
387 _delay_ms(50); 387 wait_ms(50);
388 SEND_STRING("Left click to win!"); 388 SEND_STRING("Left click to win!");
389 register_code(KC_ENTER); 389 register_code(KC_ENTER);
390 unregister_code(KC_ENTER); 390 unregister_code(KC_ENTER);
@@ -395,7 +395,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
395 if (!record->event.pressed) { 395 if (!record->event.pressed) {
396 register_code(is_overwatch ? KC_BSPC : KC_ENTER); 396 register_code(is_overwatch ? KC_BSPC : KC_ENTER);
397 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER); 397 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER);
398 _delay_ms(50); 398 wait_ms(50);
399 SEND_STRING("It may be a game, but if you don't want to actually try, please go play AI, so that people that actually want to take the game seriously and \"get good\" have a place to do so without trolls like you throwing games."); 399 SEND_STRING("It may be a game, but if you don't want to actually try, please go play AI, so that people that actually want to take the game seriously and \"get good\" have a place to do so without trolls like you throwing games.");
400 register_code(KC_ENTER); 400 register_code(KC_ENTER);
401 unregister_code(KC_ENTER); 401 unregister_code(KC_ENTER);
@@ -406,7 +406,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
406 if (!record->event.pressed) { 406 if (!record->event.pressed) {
407 register_code(is_overwatch ? KC_BSPC : KC_ENTER); 407 register_code(is_overwatch ? KC_BSPC : KC_ENTER);
408 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER); 408 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER);
409 _delay_ms(50); 409 wait_ms(50);
410 SEND_STRING("That was positively riveting!"); 410 SEND_STRING("That was positively riveting!");
411 register_code(KC_ENTER); 411 register_code(KC_ENTER);
412 unregister_code(KC_ENTER); 412 unregister_code(KC_ENTER);
@@ -417,9 +417,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
417 if (!record->event.pressed) { 417 if (!record->event.pressed) {
418 register_code(is_overwatch ? KC_BSPC : KC_ENTER); 418 register_code(is_overwatch ? KC_BSPC : KC_ENTER);
419 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER); 419 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER);
420 _delay_ms(50); 420 wait_ms(50);
421 SEND_STRING("That aim is absolutely amazing. It's almost like you're a machine!" SS_TAP(X_ENTER)); 421 SEND_STRING("That aim is absolutely amazing. It's almost like you're a machine!" SS_TAP(X_ENTER));
422 _delay_ms(3000); 422 wait_ms(3000);
423 register_code(is_overwatch ? KC_BSPC : KC_ENTER); 423 register_code(is_overwatch ? KC_BSPC : KC_ENTER);
424 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER); 424 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER);
425 SEND_STRING("Wait! That aim is TOO good! You're clearly using an aim hack! CHEATER!" SS_TAP(X_ENTER)); 425 SEND_STRING("Wait! That aim is TOO good! You're clearly using an aim hack! CHEATER!" SS_TAP(X_ENTER));
@@ -430,7 +430,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
430 if (!record->event.pressed) { 430 if (!record->event.pressed) {
431 register_code(is_overwatch ? KC_BSPC : KC_ENTER); 431 register_code(is_overwatch ? KC_BSPC : KC_ENTER);
432 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER); 432 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER);
433 _delay_ms(50); 433 wait_ms(50);
434 SEND_STRING("OMG!!! C9!!!"); 434 SEND_STRING("OMG!!! C9!!!");
435 register_code(KC_ENTER); 435 register_code(KC_ENTER);
436 unregister_code(KC_ENTER); 436 unregister_code(KC_ENTER);
@@ -441,7 +441,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
441 if (!record->event.pressed) { 441 if (!record->event.pressed) {
442 register_code(is_overwatch ? KC_BSPC : KC_ENTER); 442 register_code(is_overwatch ? KC_BSPC : KC_ENTER);
443 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER); 443 unregister_code(is_overwatch ? KC_BSPC : KC_ENTER);
444 _delay_ms(50); 444 wait_ms(50);
445 SEND_STRING("That was a fantastic game, though it was a bit easy. Try harder next time!"); 445 SEND_STRING("That was a fantastic game, though it was a bit easy. Try harder next time!");
446 register_code(KC_ENTER); 446 register_code(KC_ENTER);
447 unregister_code(KC_ENTER); 447 unregister_code(KC_ENTER);
@@ -471,16 +471,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
471//#elif defined(BOOTLOADER_CATERINA) 471//#elif defined(BOOTLOADER_CATERINA)
472// ":avrdude" 472// ":avrdude"
473#endif 473#endif
474#ifdef RGBLIGHT_ENABLE
475 " RGBLIGHT_ENABLE=yes"
476#else
477 " RGBLIGHT_ENABLE=no"
478#endif
479#ifdef AUDIO_ENABLE
480 " AUDIO_ENABLE=yes"
481#else
482 " AUDIO_ENABLE=no"
483#endif
484 SS_TAP(X_ENTER)); 474 SS_TAP(X_ENTER));
485 } 475 }
486 return false; 476 return false;
diff --git a/users/drashna/drashna.h b/users/drashna/drashna.h
index aa9c83086..8354c55c9 100644
--- a/users/drashna/drashna.h
+++ b/users/drashna/drashna.h
@@ -26,8 +26,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
26#define _COLEMAK 1 26#define _COLEMAK 1
27#define _DVORAK 2 27#define _DVORAK 2
28#define _WORKMAN 3 28#define _WORKMAN 3
29#define _NAV 5 29#define _MODS 4
30#define _COVECUBE 6 30//#define _MISC 5
31#define _NAV 6
32#define _COVECUBE 7
31#define _SYMB 8 33#define _SYMB 8
32#define _GAMEPAD 9 34#define _GAMEPAD 9
33#define _DIABLO 10 35#define _DIABLO 10
@@ -142,4 +144,61 @@ enum {
142#define AUD_OFF AU_OFF 144#define AUD_OFF AU_OFF
143#endif 145#endif
144 146
147
148
149// Since our quirky block definitions are basically a list of comma separated
150// arguments, we need a wrapper in order for these definitions to be
151// expanded before being used as arguments to the LAYOUT_xxx macro.
152#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__)
153#define KEYMAP_wrapper(...) KEYMAP(__VA_ARGS__)
154
155// Blocks for each of the four major keyboard layouts
156// Organized so we can quickly adapt and modify all of them
157// at once, rather than for each keyboard, one at a time.
158// And this allows wor much cleaner blocks in the keymaps.
159// For instance Tap/Hold for Control on all of the layouts
160
161#define _________________QWERTY_L1_________________ KC_Q, KC_W, KC_E, KC_R, KC_T
162#define _________________QWERTY_L2_________________ KC_A, KC_S, KC_D, KC_F, KC_G
163#define _________________QWERTY_L3_________________ CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B
164
165#define _________________QWERTY_R1_________________ KC_Y, KC_U, KC_I, KC_O, KC_P
166#define _________________QWERTY_R2_________________ KC_H, KC_J, KC_K, KC_L, KC_SCLN
167#define _________________QWERTY_R3_________________ KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLASH)
168
169
170#define _________________COLEMAK_L1________________ KC_Q, KC_W, KC_F, KC_P, KC_G
171#define _________________COLEMAK_L2________________ KC_A, KC_R, KC_S, KC_T, KC_D
172#define _________________COLEMAK_L3________________ CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B
173
174#define _________________COLEMAK_R1________________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN
175#define _________________COLEMAK_R2________________ KC_H, KC_N, KC_E, KC_I, KC_O
176#define _________________COLEMAK_R3________________ KC_K, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLASH)
177
178
179#define _________________DVORAK_L1_________________ KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y
180#define _________________DVORAK_L2_________________ KC_A, KC_O, KC_E, KC_U, KC_I
181#define _________________DVORAK_L3_________________ CTL_T(KC_SCLN),KC_Q, KC_J, KC_K, KC_X
182
183#define _________________DVORAK_R1_________________ KC_F, KC_G, KC_C, KC_R, KC_L
184#define _________________DVORAK_R2_________________ KC_D, KC_H, KC_T, KC_N, KC_S
185#define _________________DVORAK_R3_________________ KC_B, KC_M, KC_W, KC_V, CTL_T(KC_Z)
186
187
188#define _________________WORKMAN_L1________________ KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y
189#define _________________WORKMAN_L2________________ KC_A, KC_O, KC_E, KC_U, KC_I
190#define _________________WORKMAN_L3________________ CTL_T(KC_SCLN),KC_Q, KC_J, KC_K, KC_X
191
192#define _________________WORKMAN_R1________________ KC_F, KC_G, KC_C, KC_R, KC_L
193#define _________________WORKMAN_R2________________ KC_D, KC_H, KC_T, KC_N, KC_S
194#define _________________WORKMAN_R3________________ KC_B, KC_M, KC_W, KC_V, CTL_T(KC_Z)
195
196
197
198// Since we have 4 default layouts (QWERTY, DVORAK, COLEMAK and WORKMAN),
199// this allows us to quickly modify the bottom row for all of the layouts
200// so we don't have to alter it 4 times and hope that we haven't missed
201// anything
202#define ___________ERGODOX_BOTTOM_LEFT_____________ KC_QUOT, KC_LGUI, KC_LBRC, KC_RBRC
203#define ___________ERGODOX_BOTTOM_RIGHT____________ KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
145#endif 204#endif
diff --git a/users/drashna/readme.md b/users/drashna/readme.md
index e77948ea9..92792fb97 100644
--- a/users/drashna/readme.md
+++ b/users/drashna/readme.md
@@ -20,6 +20,22 @@ This allows for keyboard specific configuration while maintaining the ability to
20My [Ergodox EZ Keymap](https://github.com/qmk/qmk_firmware/blob/master/keyboards/ergodox_ez/keymaps/drashna/keymap.c#L399) is a good example of this, as it uses the LEDs as modifier indicators. 20My [Ergodox EZ Keymap](https://github.com/qmk/qmk_firmware/blob/master/keyboards/ergodox_ez/keymaps/drashna/keymap.c#L399) is a good example of this, as it uses the LEDs as modifier indicators.
21 21
22 22
23Keyboard Layout Templates
24-------------------------
25
26This borrows from @jola5's "Not quite neo" code. This allows me to maintain blocks of keymaps in the userspace, so that I can modify the userspace, and this is reflected in all of the keyboards that use it, at once.
27
28This makes adding tap/hold mods, or other special keycodes or functions to all keyboards super easy, as it's done to all of them at once.
29
30The caveat here is that the keymap needs a processor/wrapper, as it doesn't like the substitutions. However, this is as simple as just pushing it through a define. For instance:
31
32`#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__)`
33
34Once that's been done and you've switched the keymaps to use the "wrapper", it will read the substitution blocks just fine.
35
36Credit goes to @jola5 for first implementing this awesome idea.
37
38
23Custom Keycodes 39Custom Keycodes
24--------------- 40---------------
25 41