]> git.donarmstrong.com Git - tmk_firmware.git/blob - keyboard/ergodox/keymap_cub.h
1ffe2fb2a133e166309f5d405956f5313e40c9e2
[tmk_firmware.git] / keyboard / ergodox / keymap_cub.h
1 static 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,TRNS,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 */
364 enum function_id {
365     TEENSY_KEY,
366     CUSTOM_KEY,
367     L_CTRL_ALT_ENT,
368     R_CTRL_ALT_ENT,
369 };
370
371 enum macro_id {
372     XMONAD_RESET,
373     PASSWORD1,
374     PASSWORD2,
375     PASSWORD3,
376 };
377
378 /*
379  * Fn action definition
380  */
381 static 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
428 static 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
436 static 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
443 static 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
462 void 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"
548 const 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  */
567 action_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