aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Humbert <jack.humb@gmail.com>2015-10-26 16:57:45 -0400
committerJack Humbert <jack.humb@gmail.com>2015-10-26 16:57:45 -0400
commit402122744c26704f378cda828d30bf11e8d6dabf (patch)
treec9834b5739f5534cf345e1467d2a34ae9f716e73
parent35a81f5b8b081e1607a7c04489b01f551c3213cc (diff)
downloadqmk_firmware-402122744c26704f378cda828d30bf11e8d6dabf.tar.gz
qmk_firmware-402122744c26704f378cda828d30bf11e8d6dabf.zip
ez with leds
-rw-r--r--keyboard/ergodox/ergodox.c2
-rw-r--r--keyboard/ergodox/keymaps/keymap_cub.c595
-rw-r--r--keyboard/ergodox/keymaps/keymap_default.c54
-rw-r--r--keyboard/ergodox/keymaps/keymap_ergodox_ez.c210
-rw-r--r--keyboard/ergodox/keymaps/keymap_passwords_example.h23
-rw-r--r--keyboard/ergodox/keymaps/keymap_simon.c624
-rw-r--r--keyboard/ergodox/keymaps/keymap_simon_passwords.example.h2
7 files changed, 1510 insertions, 0 deletions
diff --git a/keyboard/ergodox/ergodox.c b/keyboard/ergodox/ergodox.c
index 38e9b3a8a..950e6a66c 100644
--- a/keyboard/ergodox/ergodox.c
+++ b/keyboard/ergodox/ergodox.c
@@ -8,10 +8,12 @@ bool ergodox_left_led_1 = 0; // left top
8bool ergodox_left_led_2 = 0; // left middle 8bool ergodox_left_led_2 = 0; // left middle
9bool ergodox_left_led_3 = 0; // left bottom 9bool ergodox_left_led_3 = 0; // left bottom
10 10
11__attribute__ ((weak))
11void * matrix_init_user(void) { 12void * matrix_init_user(void) {
12 13
13}; 14};
14 15
16__attribute__ ((weak))
15void * matrix_scan_user(void) { 17void * matrix_scan_user(void) {
16 18
17}; 19};
diff --git a/keyboard/ergodox/keymaps/keymap_cub.c b/keyboard/ergodox/keymaps/keymap_cub.c
new file mode 100644
index 000000000..6e6d0cd8d
--- /dev/null
+++ b/keyboard/ergodox/keymaps/keymap_cub.c
@@ -0,0 +1,595 @@
1static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
2 /*
3 * Keymap: Default Layer in QWERTY
4 *
5 * ,--------------------------------------------------. ,--------------------------------------------------.
6 * | ~ | 1 | 2 | 3 | 4 | 5 | \ | | - | 6 | 7 | 8 | 9 | 0 | = |
7 * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
8 * | Tab | Q | W | E | R | T | ~L5 | | ~L6 | Y | U | I | O | P | [ |
9 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
10 * | Tab/Shf| A | S | D | F | G |------| |------| H | J | K | L | ; | ' |
11 * |--------+------+------+------+------+------| L0 | | ~L7 |------+------+------+------+------+--------|
12 * | LCtrl | Z | X | C | V | B | | | | N | M | , | . | / | ] |
13 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
14 * | ~L5 | ~L2 | Caps | LAlt | LGui | | Lft | Up | Dn | Rght | ~L6 |
15 * `----------------------------------' `----------------------------------'
16 * ,-------------. ,-------------.
17 * | +L2 | Home | | PgUp | Del |
18 * ,------|------|------| |------+------+------.
19 * | | | End | | PgDn | | |
20 * | BkSp | ESC |------| |------| Enter| Space|
21 * | | | Spc | | Ins | | |
22 * `--------------------' `--------------------'
23 *
24 *
25 *
26 ****************************************************************************************************
27 *
28 * Under XOrg, I use my own mapping from QWERTY to "Workman for Programmers"
29 * See XOrg files in ./addons/ subdirectory.
30 *
31 * I have to do so, because of two things:
32 * 1) my native language is Russian, and XOrg keymap for it is based on QWERTY layout
33 * 2) I want to have non-standart shifted keys, like $ (as normal) and @ (as shifted), or _ and -
34 *
35 * And even if (2) could be solved using FN* keys (but there is limit in firmware for only 32 such
36 * keys), then (1) can't be solved at firmware level at all.
37 *
38 * So, I have to stick with QWERTY as my main layout + my own XOrg keyboard layout for English.
39 * But sometimes I have to input something when XOrg is not active - for example, in Linux console,
40 * or in firmware console (while debugging firmware), or when keyboard is connected to not my computer.
41 *
42 * For such cases I have Layer1 :)
43 * // hint: switch to Layer1 is only at Layer6
44 *
45 ****************************************************************************************************
46 *
47 *
48 *
49 * Keymap: Default Layer in Workman
50 *
51 * ,--------------------------------------------------. ,--------------------------------------------------.
52 * | ~ | ; | ! | # | { | } | ' | | ^ | [ | ] | * | ( | ) | = |
53 * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
54 * | Tab | Q | D | R | W | B | NO | | ~L7 | J | F | U | P | $ | : |
55 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
56 * | Tab/Shf| A | S | H | T | G |------| |------| Y | N | E | O | I | - |
57 * |--------+------+------+------+------+------| Home | | End |------+------+------+------+------+--------|
58 * | LCtrl | Z | X | M | C | V | | | | K | L | , | . | / | | |
59 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
60 * | ~L5 | ~L2 | Caps | LAlt | LGui | | Lft | Up | Dn | Rght | ~L6 |
61 * `----------------------------------' `----------------------------------'
62 * ,-------------. ,-------------.
63 * | L0 | +L2 | | PgUp | Del |
64 * ,------|------|------| |------+------+------.
65 * | | | NO | | PgDn | | |
66 * | BkSp | ESC |------| |------| Enter| Space|
67 * | | | Spc | | Ins | | |
68 * `--------------------' `--------------------'
69 *
70 * Keymap: Default Layer in Workman / with Shift
71 *
72 * ,--------------------------------------------------. ,--------------------------------------------------.
73 * | ` | 1 | 2 | 3 | 4 | 5 | " | | \ | 6 | 7 | 8 | 9 | 0 | + |
74 * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
75 * | Tab | Q | D | R | W | B | NO | | ~L7 | J | F | U | P | @ | % |
76 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
77 * | Tab/Shf| A | S | H | T | G |------| |------| Y | N | E | O | I | _ |
78 * |--------+------+------+------+------+------| Home | | End |------+------+------+------+------+--------|
79 * | LCtrl | Z | X | M | C | V | | | | K | L | , | . | / | & |
80 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
81 * | ~L5 | ~L2 | Caps | LAlt | LGui | | Lft | Up | Dn | Rght | ~L6 |
82 * `----------------------------------' `----------------------------------'
83 * ,-------------. ,-------------.
84 * | L0 | +L2 | | PgUp | Del |
85 * ,------|------|------| |------+------+------.
86 * | | | NO | | PgDn | | |
87 * | BkSp | ESC |------| |------| Enter| Space|
88 * | | | Spc | | Ins | | |
89 * `--------------------' `--------------------'
90 *
91 */
92
93 KEYMAP( // Layer0: default, leftled:none
94 // left hand
95 GRV, 1, 2, 3, 4, 5, BSLS,
96 FN2, Q, W, E, R, T, FN23,
97 FN11,FN28,FN29,FN30,FN31,G,
98 FN12,FN24,FN25,FN26,FN27,B, HOME,
99 FN21,FN20,CAPS,FN13,FN14,
100 FN17,FN19,
101 NO,
102 FN5, FN6, FN7,
103 // right hand
104 MINS,6, 7, 8, 9, 0, EQL,
105 FN23,Y, U, I, O, P, LBRC,
106 H, J, K, L, SCLN,FN15,
107 END, N, M, COMM,DOT, SLSH,FN16,
108 LEFT,UP, DOWN,RGHT,FN22,
109 PGUP,DEL,
110 PGDN,
111 FN8, FN9, FN10
112 ),
113
114 KEYMAP( // Layer1: Workman layout, leftled:all
115 // left hand
116 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
117 TRNS,Q, D, R, W, B, TRNS,
118 TRNS,A, S, H, T, G,
119 TRNS,Z, X, M, C, V, TRNS,
120 TRNS,TRNS,FN17,TRNS,TRNS,
121 TRNS,TRNS,
122 TRNS,
123 TRNS,TRNS,TRNS,
124 // right hand
125 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
126 TRNS,J, F, U, P, 4, TRNS,
127 Y, N, E, O, I, TRNS,
128 TRNS,K, L, TRNS,TRNS,TRNS,TRNS,
129 TRNS,TRNS,TRNS,TRNS,TRNS,
130 TRNS,TRNS,
131 TRNS,
132 TRNS,TRNS,TRNS
133 ),
134
135 KEYMAP( // Layer2: numpad, leftled:mid/blue
136 // left hand
137 TRNS,NO, NO, NO, NO, PAUS,PSCR,
138 TRNS,NO, NO, NO, NO, NO, TRNS,
139 TRNS,NO, NO, NO, TRNS,NO,
140 TRNS,NO, NO, NO, TRNS,NO, TRNS,
141 TRNS,TRNS,FN17,TRNS,TRNS,
142 TRNS,TRNS,
143 TRNS,
144 TRNS,TRNS,TRNS,
145 // right hand
146 SLCK,NLCK,PSLS,PAST,PAST,PMNS,BSPC,
147 TRNS,NO, P7, P8, P9, PMNS,PGUP,
148 NO, P4, P5, P6, PPLS,PGDN,
149 TRNS,NO, P1, P2, P3, PPLS,PENT,
150 P0, PDOT,SLSH,PENT,PENT,
151 TRNS,TRNS,
152 TRNS,
153 TRNS,TRNS,TRNS
154 ),
155
156 KEYMAP( // Layer3: F-keys + PgUp/PgDn on right hand, leftled:bot/green
157 // left hand
158 TRNS,NO, NO, NO, NO, NO, NO,
159 TRNS,NO, NO, NO, NO, NO, TRNS,
160 TRNS,NO, TRNS,NO, NO, NO,
161 TRNS,NO, TRNS,NO, NO, NO, TRNS,
162 TRNS,TRNS,TRNS,LALT,LGUI,
163 TRNS,TRNS,
164 TRNS,
165 LCTL,LSFT,TRNS,
166 // right hand
167 NO, NO, NO, NO, NO, NO, TRNS,
168 TRNS,NO, F1, F2, F3, F4, PGUP,
169 NO, F5, F6, F7, F8, PGDN,
170 TRNS,NO, F9, F10, F11, F12, APP,
171 RGUI,RALT,TRNS,TRNS,TRNS,
172 TRNS,TRNS,
173 TRNS,
174 TRNS,RSFT,RCTL
175 ),
176
177 KEYMAP( // Layer4: unconvenient keys on right hand, leftled:top/white
178 // left hand
179 TRNS,NO, NO, NO, NO, NO, NO,
180 TRNS,NO, NO, NO, NO, NO, TRNS,
181 TRNS,TRNS,NO, NO, NO, NO,
182 TRNS,TRNS,NO, NO, NO, NO, TRNS,
183 TRNS,TRNS,TRNS,LALT,LGUI,
184 TRNS,TRNS,
185 TRNS,
186 TRNS,TRNS,TRNS,
187
188 /* in Workman right hand will be:
189 { } ( ) +
190 ^ ! ? =
191 ' ! $ " ; \
192 # [ < > ] \
193 */
194
195 // right hand
196 NO, NO, 4, 5, 9, 0, PPLS,
197 TRNS,MINS,2, FN5, 9, 0, EQL,
198 BSLS,2, P, FN1, 1, FN2,
199 TRNS,3, 6, FN3, FN4, 7, FN2,
200 TRNS,TRNS,TRNS,TRNS,TRNS,
201 TRNS,TRNS,
202 TRNS,
203 TRNS,TRNS,TRNS
204 ),
205
206 KEYMAP( // Layer5: F-keys instead of numbers, leftled:top/white
207 // left hand
208 TRNS,F1, F2, F3, F4, F5, F6,
209 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
210 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
211 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
212 TRNS,TRNS,TRNS,TRNS,TRNS,
213 TRNS,TRNS,
214 TRNS,
215 TRNS,TRNS,TRNS,
216 // right hand
217 F7, F8, F9, F10, F11, F12, TRNS,
218 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
219 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
220 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
221 TRNS,TRNS,TRNS,TRNS,TRNS,
222 TRNS,TRNS,
223 TRNS,
224 TRNS,TRNS,TRNS
225 ),
226
227 KEYMAP( // Layer6: F-keys + utils(Teensy, Workman-layer switch), leftled:top/white+onboard
228 // left hand
229 TRNS,F1, F2, F3, F4, F5, F6,
230 FN0, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
231 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
232 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
233 FN18,TRNS,TRNS,TRNS,TRNS,
234 TRNS,TRNS,
235 TRNS,
236 TRNS,TRNS,TRNS,
237 // right hand
238 F7, F8, F9, F10, F11, F12, TRNS,
239 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,FN0,
240 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
241 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
242 TRNS,TRNS,TRNS,TRNS,TRNS,
243 TRNS,TRNS,
244 TRNS,
245 TRNS,TRNS,TRNS
246 ),
247
248 //
249 // rarely used
250 //
251
252 KEYMAP( // Layer7: F-keys only, leftled:top/white
253 // left hand
254 FN0, NO, NO, NO, NO, NO, NO,
255 FN1, F13, F14, F15, F16, NO, TRNS,
256 TRNS,F17, F18, F19, F20, NO,
257 TRNS,F21, F22, F23, F24, NO, TRNS,
258 TRNS,TRNS,TRNS,TRNS,TRNS,
259 TRNS,TRNS,
260 TRNS,
261 TRNS,TRNS,TRNS,
262 // right hand
263 NO, NO, NO, NO, NO, NO, TRNS,
264 TRNS,NO, F1, F2, F3, F4, TRNS,
265 NO, F5, F6, F7, F8, TRNS,
266 TRNS,NO, F9, F10, F11, F12, TRNS,
267 TRNS,TRNS,TRNS,TRNS,TRNS,
268 TRNS,TRNS,
269 TRNS,
270 SLEP,TRNS,TRNS
271 ),
272
273 KEYMAP( // Layer8: mouse and navigation, leftled:mid/blue+bot/green
274 // left hand
275 TRNS,NO, NO, NO, NO, NO, NO,
276 TRNS,NO, NO, NO, ACL0,NO, TRNS,
277 TRNS,NO, NO, TRNS,ACL1,NO,
278 TRNS,NO, NO, TRNS,ACL2,NO, TRNS,
279 TRNS,TRNS,TRNS,TRNS,TRNS,
280 TRNS,TRNS,
281 TRNS,
282 TRNS,TRNS,TRNS,
283
284 // right hand
285 F16, MPLY,MPRV,MNXT,VOLD,VOLU,MUTE,
286 F14, BTN2,WH_L,WH_U,WH_D,WH_R,PGUP,
287 BTN1,MS_L,MS_U,MS_D,MS_R,PGDN,
288 F15, BTN3,HOME,END, DEL, INS, NO,
289 TRNS,TRNS,TRNS,TRNS,TRNS,
290 TRNS,TRNS,
291 TRNS,
292 TRNS,TRNS,TRNS
293 ),
294
295 KEYMAP( // Layer9: application-specific shortcuts (mostly browser), leftled:top/white+bot/green
296 // left hand
297 TRNS,NO, NO, NO, NO, NO, NO,
298 TRNS,NO, NO, NO, NO, NO, TRNS,
299 TRNS,NO, NO, NO, NO, NO,
300 TRNS,NO, NO, NO, TRNS,NO, TRNS,
301 TRNS,TRNS,TRNS,TRNS,TRNS,
302 TRNS,TRNS,
303 TRNS,
304 TRNS,TRNS,TRNS,
305 // right hand
306 NO, NO, NO, NO, NO, NO, TRNS,
307 TRNS,NO, FN12,FN13,FN14,FN15,FN10,
308 FN1, FN2, FN3, FN4, FN5, FN11,
309 TRNS,TRNS,FN6, FN7, FN8, FN9, FN0,
310 TRNS,TRNS,TRNS,TRNS,TRNS,
311 TRNS,TRNS,
312 TRNS,
313 TRNS,TRNS,TRNS
314 ),
315
316/*
317 // templates to copy from
318
319 KEYMAP( // LayerN: transparent on edges + hard-defined thumb keys, all others are empty
320 // left hand
321 TRNS,NO, NO, NO, NO, NO, NO,
322 TRNS,NO, NO, NO, NO, NO, TRNS,
323 TRNS,NO, NO, NO, NO, NO,
324 TRNS,NO, NO, NO, NO, NO, TRNS,
325 TRNS,TRNS,TRNS,LALT,LGUI,
326 TRNS,TRNS,
327 TRNS,
328 LCTL,LSFT,TRNS,
329 // right hand
330 NO, NO, NO, NO, NO, NO, TRNS,
331 TRNS,NO, NO, NO, NO, NO, TRNS,
332 NO, NO, NO, NO, NO, TRNS,
333 TRNS,NO, NO, NO, NO, NO, TRNS,
334 RGUI,RALT,TRNS,TRNS,TRNS,
335 TRNS,TRNS,
336 TRNS,
337 TRNS,RSFT,RCTL
338 ),
339 KEYMAP( // LayerN: fully transparent
340 // left hand
341 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
342 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
343 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
344 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
345 TRNS,TRNS,TRNS,TRNS,TRNS,
346 TRNS,TRNS,
347 TRNS,
348 TRNS,TRNS,TRNS,
349 // right hand
350 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
351 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
352 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
353 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
354 TRNS,TRNS,TRNS,TRNS,TRNS,
355 TRNS,TRNS,
356 TRNS,
357 TRNS,TRNS,TRNS
358 ),
359*/
360
361};
362
363/* id for user defined functions & macros */
364enum function_id {
365 TEENSY_KEY,
366 CUSTOM_KEY,
367 L_CTRL_ALT_ENT,
368 R_CTRL_ALT_ENT,
369};
370
371enum macro_id {
372 XMONAD_RESET,
373 PASSWORD1,
374 PASSWORD2,
375 PASSWORD3,
376};
377
378/*
379 * Fn action definition
380 */
381static const uint16_t PROGMEM fn_actions[] = {
382 [0] = ACTION_FUNCTION(TEENSY_KEY), // FN0 - Teensy key
383
384 [1] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // FN1 = Shifted BackSlash // " in Workman
385 [2] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // FN2 = Shifted Minus // \ in Workman
386 [3] = ACTION_MODS_KEY(MOD_LSFT, KC_COMM), // FN3 = Shifted comma // < in Workman
387 [4] = ACTION_MODS_KEY(MOD_LSFT, KC_DOT), // FN4 = Shifted dot // > in Workman
388
389 [5] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_BSPC), // FN5 = LShift with tap BackSpace
390 [6] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_DEL), // FN6 = LCtrl with tap Delete
391 [7] = ACTION_MODS_TAP_KEY(MOD_LALT, KC_ESC), // FN7 = LAlt with tap Escape
392 [8] = ACTION_MODS_TAP_KEY(MOD_RALT, KC_INS), // FN8 = RAlt with tap Ins
393 [9] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT), // FN9 = RShift with tap Enter
394 [10] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_SPC), // FN10 = RCtrl with tap Space
395
396 [11] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_TAB), // FN11 = LShift with tap Tab
397 [12] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_GRV), // FN12 = LCtrl with tap Tilda
398 [13] = ACTION_MODS_TAP_KEY(MOD_LALT, KC_SPC), // FN13 = LAlt with tap Space
399 [14] = ACTION_MODS_TAP_KEY(MOD_LGUI, KC_ESC), // FN14 = LGui with tap Escape
400 [15] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_QUOT), // FN15 = RShift with tap quotes
401 [16] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_RBRC), // FN16 = RCtrl with tap ]
402
403 [17] = ACTION_LAYER_SET(0, ON_BOTH), // FN17 - set Layer0
404 [18] = ACTION_LAYER_SET(1, ON_BOTH), // FN18 - set Layer1, to use Workman layout at firmware level
405 [19] = ACTION_LAYER_SET(2, ON_BOTH), // FN19 - set Layer2, to use with Numpad keys
406
407 [21] = ACTION_FUNCTION_TAP(L_CTRL_ALT_ENT), // FN21 - momentary Layer5+CTRL+ALT on Enter, to use with F* keys on top row
408 [22] = ACTION_FUNCTION_TAP(R_CTRL_ALT_ENT), // FN22 - momentary Layer6+CTRL+ALT on Enter, to use with F* keys on top row + utils
409
410 [28] = ACTION_LAYER_TAP_KEY(4, KC_A), // FN28 = momentary Layer4 on A key, to use with unconvenient keys
411 [29] = ACTION_LAYER_TAP_KEY(3, KC_S), // FN29 = momentary Layer3 on S key, to use with F* keys
412 [30] = ACTION_LAYER_TAP_KEY(8, KC_D), // FN30 = momentary Layer8 on D key, to use with mouse and navigation keys
413 [31] = ACTION_LAYER_TAP_KEY(2, KC_F), // FN31 = momentary Layer2 on F key, to use with Numpad keys
414
415 // i'd like to remove this - will try to get used to live without this and convert them to usual keys
416 [20] = ACTION_LAYER_MOMENTARY(2), // FN20 - momentary Layer2, to use with Numpad keys
417// or
418// [20] = ACTION_FUNCTION_TAP(CUSTOM_KEY), // FN20 - use custom key, with tapping support
419
420 [23] = ACTION_LAYER_TAP_KEY(7, KC_BSLS), // FN23 - momentary Layer7 on ' , to use with F* keys (F1-F24)
421
422 [24] = ACTION_LAYER_TAP_KEY(4, KC_Z), // FN24 = momentary Layer4 on Z key, to use with unconvenient keys
423 [25] = ACTION_LAYER_TAP_KEY(3, KC_X), // FN25 = momentary Layer3 on X key, to use with F* keys
424 [26] = ACTION_LAYER_TAP_KEY(8, KC_C), // FN26 = momentary Layer8 on C key, to use with mouse and navigation keys
425 [27] = ACTION_LAYER_TAP_KEY(9, KC_V), // FN27 = momentary Layer9 on V key, to use with application-specific shortcuts
426};
427
428static const uint16_t PROGMEM fn_actions_4[] = {
429 [1] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // FN1 = Shifted BackSlash // " in Workman
430 [2] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // FN2 = Shifted Minus // \ in Workman
431 [3] = ACTION_MODS_KEY(MOD_LSFT, KC_COMM), // FN3 = Shifted comma // < in Workman
432 [4] = ACTION_MODS_KEY(MOD_LSFT, KC_DOT), // FN4 = Shifted dot // > in Workman
433 [5] = ACTION_MODS_KEY(MOD_LSFT, KC_SLSH), // FN5 = Shifted slash // ? in Workman
434};
435
436static const uint16_t PROGMEM fn_actions_7[] = {
437 [0] = ACTION_MACRO(XMONAD_RESET), // FN0 = xmonad-reanimator
438 [1] = ACTION_MACRO(PASSWORD1), // FN1 = default password
439 [2] = ACTION_MACRO(PASSWORD1), // FN2 = other password
440 [3] = ACTION_MACRO(PASSWORD1), // FN3 = mega password
441};
442
443static const uint16_t PROGMEM fn_actions_9[] = {
444 [0] = ACTION_MODS_KEY(MOD_LCTL, KC_P0), // FN0 = Ctrl+0
445 [1] = ACTION_MODS_KEY(MOD_LALT, KC_P1), // FN1 = Alt+1
446 [2] = ACTION_MODS_KEY(MOD_LALT, KC_P2), // FN2 = Alt+2
447 [3] = ACTION_MODS_KEY(MOD_LALT, KC_P3), // FN3 = Alt+3
448 [4] = ACTION_MODS_KEY(MOD_LALT, KC_P4), // FN4 = Alt+4
449 [5] = ACTION_MODS_KEY(MOD_LALT, KC_P5), // FN5 = Alt+5
450 [6] = ACTION_MODS_KEY(MOD_LALT, KC_P6), // FN6 = Alt+6
451 [7] = ACTION_MODS_KEY(MOD_LALT, KC_P7), // FN7 = Alt+7
452 [8] = ACTION_MODS_KEY(MOD_LALT, KC_P8), // FN8 = Alt+8
453 [9] = ACTION_MODS_KEY(MOD_LALT, KC_P9), // FN9 = Alt+9
454 [10] = ACTION_MODS_KEY(MOD_LCTL|MOD_LSFT, KC_TAB), // FN10 = Ctrl+Shift+Tab
455 [11] = ACTION_MODS_KEY(MOD_LCTL, KC_TAB), // FN11 = Ctrl+Tab
456 [12] = ACTION_MODS_KEY(MOD_LCTL|MOD_LSFT, KC_PGUP), // FN12 = Ctrl+Shift+PgUp
457 [13] = ACTION_MODS_KEY(MOD_LCTL|MOD_LSFT, KC_PGDN), // FN13 = Ctrl+Shift+PgDn
458 [14] = ACTION_MODS_KEY(MOD_LCTL, KC_PMNS), // FN14 = Ctrl+Pad Minus
459 [15] = ACTION_MODS_KEY(MOD_LCTL, KC_PPLS), // FN15 = Ctrl+Pad Plus
460};
461
462void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
463{
464 // print("action_function called\n");
465 // print("id = "); phex(id); print("\n");
466 // print("opt = "); phex(opt); print("\n");
467
468 if (id == TEENSY_KEY) {
469 clear_keyboard();
470 print("\n\nJump to bootloader... ");
471 _delay_ms(50);
472 bootloader_jump(); // should not return
473 print("not supported.\n");
474 }
475
476 if (id == L_CTRL_ALT_ENT || id == R_CTRL_ALT_ENT) {
477 if (record->tap.count == 0 || record->tap.interrupted) {
478 uint8_t weak_mods;
479 uint8_t layer;
480
481 if (id == L_CTRL_ALT_ENT) {
482 weak_mods = MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT);
483 layer = 5;
484 } else {
485 weak_mods = MOD_BIT(KC_RCTL) | MOD_BIT(KC_RALT);
486 layer = 6;
487 }
488
489 if (record->event.pressed) {
490 layer_on(layer);
491 add_weak_mods(weak_mods);
492 } else {
493 del_weak_mods(weak_mods);
494 layer_off(layer);
495 }
496 } else {
497 if (record->event.pressed) {
498 add_key(KC_ENT);
499 send_keyboard_report();
500 } else {
501 del_key(KC_ENT);
502 send_keyboard_report();
503 }
504 }
505 }
506
507
508/*
509 * just an example of custom key implementation
510 * not really needed with custom keymap_fn_to_action(),
511 * because it will allow you to have 32 FN** keys on EACH layer
512 */
513
514/*
515 keyevent_t event = record->event;
516
517 if (id == CUSTOM_KEY) {
518 uint8_t layer = biton32(layer_state);
519 uint8_t col = event.key.col;
520 uint8_t row = event.key.row;
521 uint8_t handled = 0;
522
523 if (event.pressed) {
524 if (layer == XXX && col == XXX && row == XXX) {
525 action_macro_play(
526 MACRO(
527 ...........
528 END)
529 );
530 handled++;
531 }
532 }
533 }
534
535 if (!handled) {
536 print("custom key not handled");
537 print(": layer "); pdec(layer);
538 print(", col "); pdec(col);
539 print(", row "); pdec(row);
540 print("\n");
541 }
542 }
543*/
544
545}
546
547#include "keymap_passwords.h"
548const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
549 if (record->event.pressed) {
550 switch (id) {
551 case XMONAD_RESET: return MACRO_XMONAD_RESET;
552 case PASSWORD1: return MACRO_PASSWORD1;
553 }
554 }
555 return MACRO_NONE;
556}
557
558#define FN_ACTIONS_SIZE (sizeof(fn_actions) / sizeof(fn_actions[0]))
559#define FN_ACTIONS_4_SIZE (sizeof(fn_actions_4) / sizeof(fn_actions_4[0]))
560#define FN_ACTIONS_7_SIZE (sizeof(fn_actions_7) / sizeof(fn_actions_7[0]))
561#define FN_ACTIONS_9_SIZE (sizeof(fn_actions_9) / sizeof(fn_actions_9[0]))
562
563/*
564 * translates Fn keycode to action
565 * for some layers, use different translation table
566 */
567action_t keymap_fn_to_action(uint8_t keycode)
568{
569 uint8_t layer = biton32(layer_state);
570
571 action_t action;
572 action.code = ACTION_NO;
573
574 if (layer == 4 && FN_INDEX(keycode) < FN_ACTIONS_4_SIZE) {
575 action.code = pgm_read_word(&fn_actions_4[FN_INDEX(keycode)]);
576 }
577
578 if (layer == 7 && FN_INDEX(keycode) < FN_ACTIONS_7_SIZE) {
579 action.code = pgm_read_word(&fn_actions_7[FN_INDEX(keycode)]);
580 }
581
582 if (layer == 9 && FN_INDEX(keycode) < FN_ACTIONS_9_SIZE) {
583 action.code = pgm_read_word(&fn_actions_9[FN_INDEX(keycode)]);
584 }
585
586 // by default, use fn_actions from default layer 0
587 // this is needed to get mapping for same key, that was used switch to some layer,
588 // to have possibility to switch layers back
589 if (action.code == ACTION_NO && FN_INDEX(keycode) < FN_ACTIONS_SIZE) {
590 action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]);
591 }
592
593 return action;
594}
595
diff --git a/keyboard/ergodox/keymaps/keymap_default.c b/keyboard/ergodox/keymaps/keymap_default.c
index 7b54b481a..51ef6b410 100644
--- a/keyboard/ergodox/keymaps/keymap_default.c
+++ b/keyboard/ergodox/keymaps/keymap_default.c
@@ -1,5 +1,6 @@
1#include "ergodox.h" 1#include "ergodox.h"
2#include "debug.h" 2#include "debug.h"
3#include "action_layer.h"
3 4
4#define DEFAULT_LAYER 0 5#define DEFAULT_LAYER 0
5#define COLEMAK_LAYER 1 6#define COLEMAK_LAYER 1
@@ -74,3 +75,56 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
74 } 75 }
75 return MACRO_NONE; 76 return MACRO_NONE;
76}; 77};
78
79
80void * matrix_init_user(void) {
81
82};
83
84void * matrix_scan_user(void) {
85 uint8_t layer = biton32(layer_state);
86
87 ergodox_board_led_off();
88 ergodox_left_led_1_off();
89 ergodox_left_led_2_off();
90 ergodox_left_led_3_off();
91 switch (layer) {
92 case 1:
93 // all
94 ergodox_left_led_1_on();
95 ergodox_left_led_2_on();
96 ergodox_left_led_3_on();
97 break;
98 case 2:
99 // blue
100 ergodox_left_led_2_on();
101 break;
102 case 8:
103 // blue and green
104 ergodox_left_led_2_on();
105 // break missed intentionally
106 case 3:
107 // green
108 ergodox_left_led_3_on();
109 break;
110 case 6:
111 ergodox_board_led_on();
112 // break missed intentionally
113 case 4:
114 case 5:
115 case 7:
116 // white
117 ergodox_left_led_1_on();
118 break;
119 case 9:
120 // white+green
121 ergodox_left_led_1_on();
122 ergodox_left_led_3_on();
123 break;
124 default:
125 // none
126 break;
127 }
128
129 mcp23018_status = ergodox_left_leds_update();
130};
diff --git a/keyboard/ergodox/keymaps/keymap_ergodox_ez.c b/keyboard/ergodox/keymaps/keymap_ergodox_ez.c
new file mode 100644
index 000000000..84a17abdd
--- /dev/null
+++ b/keyboard/ergodox/keymaps/keymap_ergodox_ez.c
@@ -0,0 +1,210 @@
1#include "action_util.h"
2#include "action_layer.h"
3#define KC_SW0 KC_FN0
4#define DEBUG_ACTION
5
6static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
7
8 /* Keymap 0: Basic layer
9 *
10 * ,--------------------------------------------------. ,--------------------------------------------------.
11 * | = | 1 | 2 | 3 | 4 | 5 | LEFT | | RIGHT| 6 | 7 | 8 | 9 | 0 | - |
12 * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
13 * | Del | Q | W | E | R | T | Up | | Up | Y | U | I | O | P | \ |
14 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
15 * | BkSp | A | S | D | F | G |------| |------| H | J | K | L |; / L2| ' |
16 * |--------+------+------+------+------+------| L1 | | L1 |------+------+------+------+------+--------|
17 * | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift |
18 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
19 * |Grv/L1| ~L1 | TAB | Left | Right| | Up | Down | [ | ] | ~L1 |
20 * `----------------------------------' `----------------------------------'
21 * ,-------------. ,-------------.
22 * | Rclk | LGui | | Alt |Ctrl/Esc|
23 * ,------|------|------| |------+--------+------.
24 * | | | Home | | PgUp | | |
25 * | Space| Enter|------| |------| Tab |Enter |
26 * | | | End | | PgDn | | |
27 * `--------------------' `----------------------'
28 */
29
30
31 // Basic layer
32
33 KEYMAP(
34 EQL, 1, 2, 3, 4, 5, LEFT,
35 DEL, Q, W, E, R, T, UP,
36 BSPC, A, S, D, F, G,
37 LSFT, FN29, X, C, V, B, FN1,
38 FN30, FN4, TAB, LEFT, RIGHT,
39
40 BTN2,LGUI,
41 HOME,
42 SPC, ENT, END,
43 //RIGHT
44 RIGHT,6, 7, 8, 9, 0, MINS,
45 UP, Y, U, I, O, P, BSLS,
46 H, J, K, L, FN31, QUOT,
47 FN1, N, M, COMM, DOT, FN28, RSFT,
48 UP, DOWN, LBRC, RBRC, FN4,
49 LALT, FN27,
50 PGUP,
51 PGDN, TAB, ENT
52 ),
53
54 /* Keymap 1: Symbol Layer
55 *
56 * ,--------------------------------------------------. ,--------------------------------------------------.
57 * | Flash | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
58 * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
59 * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 |
60 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
61 * | : | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
62 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
63 * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
64 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
65 * | | | | | | | | . | 0 | = | |
66 * `----------------------------------' `----------------------------------'
67 * ,-------------. ,-------------.
68 * | | | | | |
69 * ,------|------|------| |------+------+------.
70 * | | | | | | | |
71 * | | |------| |------| | |
72 * | | | | | | | |
73 * `--------------------' `--------------------'
74 */
75 // SYMBOLS
76 KEYMAP(
77 FN0, F1, F2, F3, F4, F5, TRNS,
78 TRNS, FN7, FN8, FN23, FN24, FN18, TRNS,
79 FN22, FN9, FN10, FN15, FN16, GRV,
80 TRNS, FN11, FN12, LBRC, RBRC, FN17, TRNS,
81 TRNS, TRNS, TRNS, TRNS, TRNS,
82
83 TRNS, TRNS,
84 TRNS,
85 TRNS, TRNS, TRNS,
86 // right hand
87 TRNS, F6, F7, F8, F9, F10, F11,
88 TRNS, UP, 7, 8, 9, FN14, F12,
89 DOWN, 4, 5, 6, FN26, TRNS,
90 TRNS, FN13, 1, 2, 3, BSLS, TRNS,
91 TRNS,DOT, 0, EQL, TRNS,
92 TRNS, TRNS,
93 TRNS,
94 TRNS, TRNS, TRNS
95 ),
96 /* Keymap 2: Media and mouse keys
97 *
98 * ,--------------------------------------------------. ,--------------------------------------------------.
99 * | | | | | | | | | | | | | | | |
100 * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
101 * | | | MsUp | | | | | | | | | | | | |
102 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
103 * | |MsLeft|MsDown|MsRght| | |------| |------| | | | Play | | |
104 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
105 * | | | | | | | | | | | | Prev | Next | | |
106 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
107 * | | | | Lclk | Rclk | |VolUp |VolDn | | | |
108 * `----------------------------------' `----------------------------------'
109 * ,-------------. ,-------------.
110 * | | | | | |
111 * ,------|------|------| |------+------+------.
112 * | | | | | | | |
113 * | | |------| |------| | |
114 * | | | | | | | |
115 * `--------------------' `--------------------'
116 */
117 // MEDIA AND MOUSE
118 KEYMAP(
119 TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
120 TRNS, TRNS, MS_U, TRNS, TRNS, TRNS, TRNS,
121 TRNS, MS_L, MS_D, MS_R, TRNS, TRNS,
122 TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
123 TRNS, TRNS, TRNS, BTN3, BTN2,
124
125 TRNS, TRNS,
126 TRNS,
127 TRNS, TRNS, TRNS,
128 // right hand
129 TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
130 TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
131 TRNS, TRNS, TRNS, MPLY, TRNS, TRNS,
132 TRNS, TRNS, TRNS, MPRV, MNXT, TRNS, TRNS,
133 VOLU, VOLD, TRNS, TRNS, TRNS,
134 TRNS, TRNS,
135 TRNS,
136 TRNS, TRNS, WBAK
137 ),
138};
139
140/* id for user defined functions */
141enum function_id {
142 TEENSY_KEY,
143};
144
145/*
146 * Fn action definition
147 */
148static const uint16_t PROGMEM fn_actions[] = {
149 [0] = ACTION_FUNCTION(TEENSY_KEY), // FN0 - Teensy key
150 [1] = ACTION_LAYER_INVERT(1, ON_RELEASE), // FN1 - Toggle 1
151 [2] = ACTION_LAYER_TOGGLE(2), // FN2 - Toggle 2
152 [3] = ACTION_LAYER_TOGGLE(3), // FN3 - Toggle 3
153 [4] = ACTION_LAYER_TAP_TOGGLE(1), // FN4 - Momentary Layer 1
154 [5] = ACTION_LAYER_MOMENTARY(2), // FN5 - Momentary L2
155
156 // SYMBOLS
157 ACTION_MODS_KEY(MOD_LSFT, KC_QUOT), // FN6 - "
158 ACTION_MODS_KEY(MOD_LSFT, KC_1), // FN7 - !
159 ACTION_MODS_KEY(MOD_LSFT, KC_2), // FN8 - @
160 ACTION_MODS_KEY(MOD_LSFT, KC_3), // FN9 - #
161 ACTION_MODS_KEY(MOD_LSFT, KC_4), // FN10 - $
162 ACTION_MODS_KEY(MOD_LSFT, KC_5), // FN11 - %
163 ACTION_MODS_KEY(MOD_LSFT, KC_6), // FN12 - ^
164 ACTION_MODS_KEY(MOD_LSFT, KC_7), // FN13 - &
165 ACTION_MODS_KEY(MOD_LSFT, KC_8), // FN14 - *
166 ACTION_MODS_KEY(MOD_LSFT, KC_9), // FN15 - (
167 ACTION_MODS_KEY(MOD_LSFT, KC_0), // FN16 - )
168 ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // FN17 - ~
169 ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // FN18 - |
170 ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // FN19 - _
171 ACTION_MODS_KEY(MOD_LSFT, KC_COMM), // FN20 - <
172 ACTION_MODS_KEY(MOD_LSFT, KC_DOT), // FN21 - >
173 ACTION_MODS_KEY(MOD_LSFT, KC_SCLN), // FN22 - :
174 ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), // FN23 - {
175 ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), // FN24 - }
176 ACTION_MODS_KEY(MOD_LSFT, KC_SLSH), // FN25 - ?
177 ACTION_MODS_KEY(MOD_LSFT, KC_EQL), // FN26 - +
178
179 ACTION_MODS_TAP_KEY(MOD_LCTL, KC_ESC), // FN27 - Control/esc on tap
180 ACTION_MODS_TAP_KEY(MOD_LCTL, KC_SLSH), // FN28 - slash becomes Ctrl when held (right pinky)
181 ACTION_MODS_TAP_KEY(MOD_LCTL, KC_Z), // FN29 - z becomes Ctrl when held (left pinky)
182
183 // Fancy tapping/toggling
184 ACTION_LAYER_TAP_KEY(1, KC_GRV), // FN30 - Layer 1 when holding backtick key
185 ACTION_LAYER_TAP_KEY(2, KC_SCLN), // FN31 - Layer 2 when holding semicolon key
186
187
188};
189
190void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
191{
192 print("action_function called\n");
193 print("id = "); phex(id); print("\n");
194 print("opt = "); phex(opt); print("\n");
195 if (id == TEENSY_KEY) {
196 clear_keyboard();
197 print("\n\nJump to bootloader... ");
198 _delay_ms(250);
199 bootloader_jump(); // should not return
200 print("not supported.\n");
201 }
202}
203
204void * matrix_init_user(void) {
205
206};
207
208void * matrix_scan_user(void) {
209
210};
diff --git a/keyboard/ergodox/keymaps/keymap_passwords_example.h b/keyboard/ergodox/keymaps/keymap_passwords_example.h
new file mode 100644
index 000000000..ed53b99d8
--- /dev/null
+++ b/keyboard/ergodox/keymaps/keymap_passwords_example.h
@@ -0,0 +1,23 @@
1#define MACRO_XMONAD_RESET MACRO( \
2 I(15), \
3 D(LCTL), D(LALT), T(F2), W(255), U(LALT), U(LCTL), W(255), \
4 T(X), T(M), T(O), T(N), T(UP), T(ENT), W(255), \
5 D(LCTL), D(LALT), T(F5), W(255), U(LALT), U(LCTL), W(255), \
6 END) \
7
8#define MACRO_PASSWORD1 MACRO( \
9 I(15), \
10 T(E), T(X), T(A), T(M), T(P), T(L), T(E), \
11 END) \
12
13#define MACRO_PASSWORD2 MACRO( \
14 I(15), \
15 T(E), T(X), T(A), T(M), T(P), T(L), T(E), \
16 END) \
17
18#define MACRO_PASSWORD2 MACRO( \
19 I(15), \
20 T(E), T(X), T(A), T(M), T(P), T(L), T(E), \
21 END) \
22
23
diff --git a/keyboard/ergodox/keymaps/keymap_simon.c b/keyboard/ergodox/keymaps/keymap_simon.c
new file mode 100644
index 000000000..525c2d601
--- /dev/null
+++ b/keyboard/ergodox/keymaps/keymap_simon.c
@@ -0,0 +1,624 @@
1#include "action_util.h"
2#include "action_layer.h"
3#define KC_SW0 KC_FN0
4#define DEBUG_ACTION
5
6static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
7 /* Keymap 0: Default Layer
8 *
9 * ,--------------------------------------------------. ,--------------------------------------------------.
10 * | ~ | 1 | 2 | 3 | 4 | 5 | \ | | ' | 6 | 7 | 8 | 9 | 0 | = |
11 * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
12 * | Tab | Q | W | E | R | T | ~Fn1 | | ~Fn3 | Y | U | I | O | P | [ |
13 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
14 * | LShift | A | S | D | F | G |------| |------| H | J | K | L | ; | RShift |
15 * |--------+------+------+------+------+------| Fn0 | | ~Fn4 |------+------+------+------+------+--------|
16 * | LCtrl | Z | X | C | V | B | | | | N | M | , | . | / | RCtrl |
17 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
18 * | ~Fn1 | ~Fn2 | Caps | LAlt | LGui | | Lft | Up | Dn | Rght | ~Fn4 |
19 * `----------------------------------' `----------------------------------'
20 * ,-------------. ,-------------.
21 * | +Fn2 | Home | | PgUp | Del |
22 * ,------|------|------| |------+------+------.
23 * | | | End | | PgDn | | |
24 * | BkSp | ESC |------| |------| Enter| Space|
25 * | | | Spc | | Ins | | |
26 * `--------------------' `--------------------'
27 */
28
29 // BASE LAYERS
30
31 KEYMAP( // layout: layer 0: customized dvorak with symbol row switched
32 // left hand
33 ESC, FN12,FN12,FN12,FN12,FN12,BSLS,
34 TAB, QUOT,COMM,DOT, P, Y, FN2,
35 LSFT,A, O, E, U, I,
36 LCTL,SCLN,Q, J, K, X, DEL,
37 FN3, FN1, LCTL,LALT,LGUI,
38 FN5, HOME,
39 END,
40 BSPC,LSFT,LGUI,
41 // right hand
42 MINS,FN12,FN12,FN12,FN12,FN12,MPLY,
43 FN3, F, G, C, R, L, MNXT,
44 D, H, T, N, S, RSFT,
45 DEL, B, M, W, V, Z, RCTL,
46 MPRV,MNXT,APP, FN8,FN2,
47 PGUP,MPLY,
48 PGDN,
49 ENT, FN1, SPC
50 ),
51
52 KEYMAP( // layout: layer 1: customized dvorak
53 // left hand
54 ESC, 1, 2, 3, 4, 5, BSLS,
55 TAB, QUOT,COMM,DOT, P, Y, FN2,
56 LSFT,A, O, E, U, I,
57 LCTL,SCLN,Q, J, K, X, DEL,
58 FN3, FN1, LCTL,LALT,LGUI,
59 FN5, HOME,
60 END,
61 BSPC,LSFT,LGUI,
62 // right hand
63 MINS,6, 7, 8, 9, 0, EQL,
64 FN3, F, G, C, R, L, SLSH,
65 D, H, T, N, S, RSFT,
66 DEL, B, M, W, V, Z, RCTL,
67 LEFT,DOWN,UP, RGHT,FN2,
68 PGUP,MPLY,
69 PGDN,
70 ENT, FN1, SPC
71 ),
72
73 KEYMAP( // layer 2 : qwerty
74 // left hand
75 TRNS,1, 2, 3, 4, 5, TRNS,
76 TRNS,Q, W, E, R, T, TRNS,
77 TRNS,A, S, D, F, G,
78 TRNS,Z, X, C, V, B, TRNS,
79 TRNS,TRNS,TRNS,TRNS,TRNS,
80 TRNS,TRNS,
81 TRNS,
82 TRNS,TRNS,TRNS,
83 // right hand
84 TRNS,6, 7, 8, 9, 0, MINS,
85 TRNS,Y, U, I, O, P, RBRC,
86 H, J, K, L, SCLN,RSFT,
87 TRNS,N, M, COMM,DOT, SLSH,RSFT,
88 TRNS,TRNS,TRNS,TRNS,TRNS,
89 TRNS,TRNS,
90 TRNS,
91 TRNS,TRNS,TRNS
92 ),
93
94 KEYMAP( // layer 3 : reserved
95 // left hand
96 TRNS,1, 2, 3, 4, 5, TRNS,
97 TRNS,Q, W, E, R, T, TRNS,
98 TRNS,A, S, D, F, G,
99 TRNS,Z, X, C, V, B, TRNS,
100 TRNS,TRNS,TRNS,TRNS,TRNS,
101 TRNS,TRNS,
102 TRNS,
103 TRNS,TRNS,TRNS,
104 // right hand
105 TRNS,6, 7, 8, 9, 0, MINS,
106 TRNS,Y, U, I, O, P, RBRC,
107 H, J, K, L, SCLN,QUOT,
108 TRNS,N, M, COMM,DOT, SLSH,RSFT,
109 TRNS,TRNS,TRNS,TRNS,TRNS,
110 RALT,RCTL,
111 PGUP,
112 PGDN,ENT, SPC
113 ),
114
115 // PLOVER (SPECIAL CASE)
116
117 KEYMAP( // layout: layer 4: Steno for Plover
118 // left hand
119 FN5, NO, NO, NO, NO, NO, NO,
120 NO, 1, 2, 3, 4, 5, NO,
121 NO, Q, W, E, R, T,
122 NO, A, S, D, F, G, NO,
123 NO, NO, NO, NO, NO,
124 FN5, NO,
125 NO,
126 C, V, NO,
127 // right hand
128 NO, NO, NO, NO, NO, NO, TRNS,
129 NO, 6, 7, 8, 9, 0, TRNS,
130 Y, U, I, O, P, LBRC,
131 NO, H, J, K, L, SCLN,QUOT,
132 TRNS,TRNS,NO, NO, NO,
133 TRNS,TRNS,
134 TRNS,
135 NO, N, M
136 ),
137
138 KEYMAP( // layout: layer 5: reserved
139 // left hand
140 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
141 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
142 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
143 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
144 TRNS,TRNS,TRNS,TRNS,TRNS,
145 TRNS,TRNS,
146 TRNS,
147 TRNS,TRNS,TRNS,
148 // right hand
149 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
150 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
151 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
152 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
153 TRNS,TRNS,TRNS,TRNS,TRNS,
154 TRNS,TRNS,
155 TRNS,
156 TRNS,TRNS,TRNS
157 ),
158
159 // MODIFIERS THAT MIGHT BE STICKY
160
161 KEYMAP( // layout: layer 6: mouse + numpad
162 // left hand
163 FN0, NO, NO, NO, NO, PAUS,PSCR,
164 TRNS,NO, WH_U,MS_U,WH_D,BTN2,TRNS,
165 TRNS,NO, MS_L,MS_D,MS_R,BTN1,
166 TRNS,NO, NO, NO, NO, BTN3,TRNS,
167 TRNS,FN13,TRNS,TRNS,TRNS,
168 TRNS,TRNS,
169 TRNS,
170 TRNS,TRNS,TRNS,
171 // right hand
172 SLCK,NLCK,EQL, PSLS,PAST,PMNS,TRNS,
173 TRNS,NO, P7, P8, P9, PMNS,BSPC,
174 NO, P4, P5, P6, PPLS,PENT,
175 TRNS,NO, P1, P2, P3, PPLS,PENT,
176 P0, PDOT,PDOT,PENT,PENT,
177 TRNS,TRNS,
178 TRNS,
179 ENT, TRNS,BSPC
180 ),
181
182 KEYMAP( // layout: layer 7: F-keys + cursor
183 // left hand
184 FN0, F1, F2, F3, F4, F5, F6,
185 FN4, NO, PGUP,UP, PGDN,NO, TRNS,
186 TRNS,HOME,LEFT,DOWN,RGHT,END,
187 TRNS,NO, NO, END, HOME,NO, TRNS,
188 TRNS,TRNS,TRNS,FN10,FN11,
189 TRNS,TRNS,
190 TRNS,
191 LCTL,LSFT,TRNS,
192 // right hand
193 F7, F8, F9, F10, F11, F12, MINS,
194 TRNS,NO, PGUP,UP, PGDN, NO, FN4,
195 HOME,LEFT,DOWN,RGHT,END, TRNS,
196 TRNS,NO, NO, NO, NO, NO, TRNS,
197 RGUI,RALT,TRNS,TRNS,TRNS,
198 TRNS,TRNS,
199 TRNS, TRNS,RSFT,RCTL
200 ),
201
202 KEYMAP( // layout: layer 8: "BlueShift"
203 // left hand
204 FN0, F1, F2, F3, F4, F5, F6,
205 TRNS,GRV, FN12,FN12,PSCR,BSLS,TRNS, // the FN12 entries are for inverted brace/bracket keys
206 TRNS,APP, TAB, EQL, TRNS,INS,
207 TRNS,TRNS,FN8, TRNS,CAPS,TRNS,TRNS, // quit (alt+f4)
208 FN13,TRNS,TRNS,TRNS,TRNS,
209 TRNS,TRNS,
210 TRNS,
211 ESC, TRNS,TRNS,
212 // right hand
213 F7, F8, F9, F10, F11, F12, MINS,
214 TRNS,PGUP,HOME,UP, END, SLSH,RBRC,
215 PGDN,LEFT,DOWN,RGHT,MINS,TRNS,
216 TRNS,TRNS,NO, UP, NO, TRNS,TRNS,
217 LEFT,DOWN,RGHT,TRNS,TRNS,
218 TRNS,TRNS,
219 TRNS,
220 TRNS,TRNS,TRNS
221 ),
222
223 KEYMAP( // layout: layer 9: reserved
224 // left hand
225 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
226 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
227 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
228 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
229 TRNS,TRNS,TRNS,TRNS,TRNS,
230 TRNS,TRNS,
231 TRNS,
232 TRNS,TRNS,TRNS,
233 // right hand
234 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
235 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
236 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
237 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
238 TRNS,TRNS,TRNS,TRNS,TRNS,
239 TRNS,TRNS,
240 TRNS,
241 TRNS,TRNS,TRNS
242 ),
243
244 KEYMAP( // layout: layer 10: reserved
245 // left hand
246 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
247 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
248 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
249 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
250 TRNS,TRNS,TRNS,TRNS,TRNS,
251 TRNS,TRNS,
252 TRNS,
253 TRNS,TRNS,TRNS,
254 // right hand
255 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
256 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
257 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
258 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
259 TRNS,TRNS,TRNS,TRNS,TRNS,
260 TRNS,TRNS,
261 TRNS,
262 TRNS,TRNS,TRNS
263 ),
264
265 // MODIFIERS THAT WON'T BE STICKY
266
267 KEYMAP( // layout: layer 11: Special function-driven commands (any-key)
268 // left hand
269 FN8, FN8, FN8, FN8, FN8, FN8, FN8,
270 FN8, FN8, FN8, FN8, FN8, FN8, FN8,
271 LSFT,FN8, FN8, FN8, FN8, FN8,
272 FN8, FN8, FN8, FN8, FN8, FN8, FN8,
273 FN8, FN8, FN8, FN8, FN8,
274 FN8, FN8,
275 FN8,
276 FN8, FN10,FN8,
277 // right hand
278 FN8, FN8, FN8, FN8, FN8, FN8, FN8,
279 FN8, FN8, FN8, FN8, FN8, FN8, FN8,
280 FN8, FN8, FN8, FN8, FN8, RSFT,
281 FN8, FN8, FN8, FN8, FN8, FN8, FN8,
282 FN8, FN8, FN8, FN8, FN8,
283 FN8, FN8,
284 FN8,
285 FN8, FN8, FN8
286 ),
287
288 KEYMAP( // layout: layer 12: F-keys only
289 // left hand
290 FN0, NO, NO, NO, NO, NO, NO,
291 TRNS,F13, F14, F15, F16, NO, TRNS,
292 TRNS,F17, F18, F19, F20, NO,
293 TRNS,F21, F22, F23, F24, NO, TRNS,
294 FN13,FN13,TRNS,LALT,LGUI,
295 TRNS,TRNS,
296 TRNS,
297 LCTL,LSFT,TRNS,
298 // right hand
299 NO, NO, F10, F11, F12, NO, TRNS,
300 TRNS,NO, F7, F8, F9, NO, TRNS,
301 NO, F4, F5, F6, NO, TRNS,
302 TRNS,NO, F1, F2, F3, NO, TRNS,
303 RGUI,RALT,RCTL,TRNS,TRNS,
304 TRNS,TRNS,
305 TRNS,
306 TRNS,RSFT,RCTL
307 ),
308
309 KEYMAP( // layout: layer 13: reserved
310 // left hand
311 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
312 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
313 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
314 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
315 TRNS,TRNS,TRNS,TRNS,TRNS,
316 TRNS,TRNS,
317 TRNS,
318 TRNS,TRNS,TRNS,
319 // right hand
320 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
321 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
322 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
323 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
324 TRNS,TRNS,TRNS,TRNS,TRNS,
325 TRNS,TRNS,
326 TRNS,
327 TRNS,TRNS,TRNS
328 ),
329
330 KEYMAP( // layout: layer 14: reserved
331 // left hand
332 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
333 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
334 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
335 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
336 TRNS,TRNS,TRNS,TRNS,TRNS,
337 TRNS,TRNS,
338 TRNS,
339 TRNS,TRNS,TRNS,
340 // right hand
341 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
342 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
343 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
344 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
345 TRNS,TRNS,TRNS,TRNS,TRNS,
346 TRNS,TRNS,
347 TRNS,
348 TRNS,TRNS,TRNS
349 ),
350
351 // TEMPLATES
352
353/*
354 KEYMAP( // layout: layer N: transparent on edges, all others are empty
355 // left hand
356 TRNS,NO, NO, NO, NO, NO, NO,
357 TRNS,NO, NO, NO, NO, NO, TRNS,
358 TRNS,NO, NO, NO, NO, NO,
359 TRNS,NO, NO, NO, NO, NO, TRNS,
360 TRNS,TRNS,TRNS,LALT,LGUI,
361 TRNS,TRNS,
362 TRNS,
363 LCTL,LSFT,TRNS,
364 // right hand
365 NO, NO, NO, NO, NO, NO, TRNS,
366 TRNS,NO, NO, NO, NO, NO, TRNS,
367 NO, NO, NO, NO, NO, TRNS,
368 TRNS,NO, NO, NO, NO, NO, TRNS,
369 RGUI,RALT,TRNS,TRNS,TRNS,
370 TRNS,TRNS,
371 TRNS,
372 TRNS,RSFT,RCTL
373 ),
374 KEYMAP( // layout: layer N: fully transparent
375 // left hand
376 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
377 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
378 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
379 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
380 TRNS,TRNS,TRNS,TRNS,TRNS,
381 TRNS,TRNS,
382 TRNS,
383 TRNS,TRNS,TRNS,
384 // right hand
385 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
386 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
387 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
388 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
389 TRNS,TRNS,TRNS,TRNS,TRNS,
390 TRNS,TRNS,
391 TRNS,
392 TRNS,TRNS,TRNS
393 ),
394*/
395
396};
397
398/* id for user defined functions */
399enum function_id {
400 TEENSY_KEY,
401 ANY_KEY,
402 PLOVER_SWITCH,
403 SHIFT_SWITCH,
404 FKEY_SWITCH,
405};
406
407enum macro_id {
408 MACRO_PASSWORD1,
409 MACRO_PASSWORD2,
410 MACRO_PASSWORD3,
411};
412
413/*
414 * Fn action definition
415 */
416static const uint16_t PROGMEM fn_actions[] = {
417 ACTION_LAYER_SET(0, ON_PRESS), // FN0 - set layer0 only
418 ACTION_LAYER_TAP_TOGGLE(8), // FN1 - switch to BlueShift
419 ACTION_LAYER_TAP_TOGGLE(7), // FN2 - movement tap/toggle
420 ACTION_LAYER_TAP_TOGGLE(6), // FN3 - numpad
421 ACTION_FUNCTION(TEENSY_KEY), // FN4 - Teensy key
422 ACTION_FUNCTION(PLOVER_SWITCH), // FN5 - enable Plover
423 ACTION_FUNCTION(PLOVER_SWITCH), // ** FN6 - suspend Plover (OUT OF USE)
424 ACTION_LAYER_MOMENTARY(11), // FN7 - Trigger the AnyKey layer
425 ACTION_FUNCTION(ANY_KEY), // FN8 - AnyKey functional layer
426 ACTION_MODS_TAP_TOGGLE(MOD_LSFT), // ** FN9 - tap toggle shift (OUT OF USE)
427 ACTION_MACRO(MACRO_PASSWORD1), // FN10 - password1
428 ACTION_MACRO(MACRO_PASSWORD2), // FN11 - password2
429 ACTION_FUNCTION(SHIFT_SWITCH), // FN12 - symbolized number row
430 ACTION_FUNCTION(FKEY_SWITCH), // FN13 - trigger Fkey layer and get rid of it appropriately
431};
432
433void simon_hotkey(keyrecord_t *record, action_t action)
434{
435 keyevent_t event = record->event;
436
437 switch (action.kind.id) {
438 /* Key and Mods */
439 case ACT_LMODS:
440 case ACT_RMODS:
441 {
442 uint8_t mods = (action.kind.id == ACT_LMODS) ? action.key.mods :
443 action.key.mods<<4;
444 if (event.pressed) {
445 if (mods) {
446 add_weak_mods(mods);
447 send_keyboard_report();
448 }
449 register_code(action.key.code);
450 } else {
451 unregister_code(action.key.code);
452 if (mods) {
453 del_weak_mods(mods);
454 send_keyboard_report();
455 }
456 }
457 }
458 break;
459 default:
460 print("not supported.\n");
461 break;
462 }
463}
464
465void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
466{
467 keyevent_t event = record->event;
468
469 // print("action_function called\n");
470 // print("id = "); phex(id); print("\n");
471 // print("opt = "); phex(opt); print("\n");
472 if (id == TEENSY_KEY) {
473 clear_keyboard();
474 print("\n\nJump to bootloader... ");
475 _delay_ms(250);
476 bootloader_jump(); // should not return
477 print("not supported.\n");
478 }
479 else if (id == PLOVER_SWITCH) {
480 if (event.pressed) {
481 if (layer_state & 1<<4) { // plover is already on
482 print("switching off plover layout...\n");
483 action_macro_play(MACRO( D(A), D(W), D(P), D(F), D(SCLN), D(LBRC), D(QUOT), D(D), D(A), D(L), U(W), U(P), U(F), U(SCLN), U(LBRC), U(QUOT), U(D), U(L), END));
484 layer_off(4);
485 } else {
486 print("switching on plover layout...\n");
487 action_macro_play(MACRO(D(LANG5), U(LANG5), D(W), D(P), D(F), D(SCLN), D(LBRC), D(QUOT), D(D), D(A), U(W), U(P), U(F), U(SCLN), U(LBRC), U(QUOT), U(D), END));
488 layer_on(4);
489 }
490 }
491 }
492 else if (id == ANY_KEY) {
493 uint8_t col = event.key.col;
494 uint8_t row = event.key.row;
495
496 action_t action = { .code = ACTION_NO };
497
498 if (col == 3 && row == 2) { // Q
499 action.code = ACTION_MODS_KEY(MOD_LALT, KC_F4);
500 }
501 if (col == 3 && row == 10) { // W
502 action.code = ACTION_MODS_KEY(MOD_LALT, KC_F4);
503 }
504 if (col == 4 && row == 12) { // Alt+tab
505 action.code = ACTION_MODS_KEY(MOD_LALT, KC_TAB);
506 }
507 if (action.code != ACTION_NO) {
508 simon_hotkey(record, action);
509 }
510 else
511 {
512 print("col = "); pdec(col); print("\n");
513 print("row = "); pdec(row); print("\n");
514 }
515 }
516 else if (id == SHIFT_SWITCH) {
517 uint8_t col = event.key.col;
518 uint8_t row = event.key.row;
519 uint8_t savedmods = get_mods();
520 uint8_t shiftpressed = (savedmods & (MOD_LSFT | MOD_RSFT));
521 uint8_t othermodspressed = (savedmods & (MOD_LGUI | MOD_RGUI | MOD_LCTL | MOD_RCTL | MOD_LALT | MOD_RALT ));
522
523 action_t action = { .code = ACTION_NO };
524 uint8_t keycode = KC_NO;
525
526 if (col == 0) { // Number row
527 switch (row) {
528 case 1:
529 keycode = KC_1;
530 break;
531 case 2:
532 keycode = KC_2;
533 break;
534 case 3:
535 keycode = KC_3;
536 break;
537 case 4:
538 keycode = KC_4;
539 break;
540 case 5:
541 keycode = KC_5;
542 break;
543 case 8:
544 keycode = KC_6;
545 break;
546 case 9:
547 keycode = KC_7;
548 break;
549 case 10:
550 keycode = KC_8;
551 break;
552 case 11:
553 keycode = KC_9;
554 break;
555 case 12:
556 keycode = KC_0;
557 break;
558 default:
559 break;
560 }
561 }
562 if (col == 1) { // next row
563 switch (row) {
564 case 2:
565 keycode = KC_LBRC;
566 break;
567 case 3:
568 keycode = KC_RBRC;
569 break;
570 default:
571 break;
572 }
573 }
574 if (keycode != KC_NO) {
575 action.code = ACTION_MODS_KEY(MOD_LSFT, keycode);
576 }
577 if (action.code != ACTION_NO) {
578 if (othermodspressed) {
579 action.key.mods = 0;
580 }
581 else if (shiftpressed) {
582 action.key.mods = 0;
583 del_mods(MOD_LSFT | MOD_RSFT);
584 }
585 simon_hotkey(record, action);
586 if (shiftpressed) {
587 set_mods(savedmods);
588 }
589 }
590 }
591 else if (id == FKEY_SWITCH) {
592 uint8_t row = event.key.row;
593 if (event.pressed) {
594 layer_on(12);
595 }
596 else {
597 if ((row == 0) && (layer_state & 1<<6)) { // left button and from numpad; out-of-order release
598 layer_off(6);
599 }
600 else if ((row == 1) && (layer_state & 1<<8)) { // right button and from BlueShift; out-of-order release
601 layer_off(8);
602 }
603 else {
604 layer_off(12);
605 }
606 }
607 }
608}
609
610/*
611 * Macro definition
612 */
613const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
614{
615 keyevent_t event = record->event;
616
617 if (event.pressed) {
618 switch (id) {
619#include "keymap_simon_passwords.h"
620 }
621 }
622 return MACRO_NONE;
623}
624
diff --git a/keyboard/ergodox/keymaps/keymap_simon_passwords.example.h b/keyboard/ergodox/keymaps/keymap_simon_passwords.example.h
new file mode 100644
index 000000000..ef67d1d2e
--- /dev/null
+++ b/keyboard/ergodox/keymaps/keymap_simon_passwords.example.h
@@ -0,0 +1,2 @@
1case MACRO_PASSWORD1:
2 return MACRO( D(LSFT), D(H), U(H), U(LSFT), D(E), U(E), D(L), U(L), D(L), U(L), D(O), U(O), D(DOT), U(DOT), D(W), U(W), D(O), U(O), D(R), U(R), D(L), U(L), D(D), U(D), D(ENTER), U(ENTER), END); // types "Hello.world{ENTER}"