1 static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
3 * Keymap: Default Layer in QWERTY
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 * `--------------------' `--------------------'
26 ****************************************************************************************************
28 * Under XOrg, I use my own mapping from QWERTY to "Workman for Programmers"
29 * See XOrg files in ./addons/ subdirectory.
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 -
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.
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.
42 * For such cases I have Layer1 :)
43 * // hint: switch to Layer1 is only at Layer6
45 ****************************************************************************************************
49 * Keymap: Default Layer in Workman
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 * `--------------------' `--------------------'
70 * Keymap: Default Layer in Workman / with Shift
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 * `--------------------' `--------------------'
93 KEYMAP( // Layer0: default, leftled:none
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,
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,
114 KEYMAP( // Layer1: Workman layout, leftled:all
116 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
117 TRNS,Q, D, R, W, B, TRNS,
119 TRNS,Z, X, M, C, V, TRNS,
120 TRNS,TRNS,TRNS,TRNS,TRNS,
125 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
126 TRNS,J, F, U, P, 4, TRNS,
128 TRNS,K, L, TRNS,TRNS,TRNS,TRNS,
129 TRNS,TRNS,TRNS,TRNS,TRNS,
135 KEYMAP( // Layer2: numpad, leftled:mid/blue
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,TRNS,TRNS,TRNS,
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,
156 KEYMAP( // Layer3: F-keys + PgUp/PgDn on right hand, leftled:bot/green
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,
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,
177 KEYMAP( // Layer4: unconvenient keys on right hand, leftled:top/white
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,
188 /* in Workman right hand will be:
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,
206 KEYMAP( // Layer5: F-keys instead of numbers, leftled:top/white
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,
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,
227 KEYMAP( // Layer6: F-keys + utils(Teensy, Workman-layer switch), leftled:top/white+onboard
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,
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,
252 KEYMAP( // Layer7: F-keys only, leftled:top/white
254 FN0, NO, NO, NO, NO, NO, NO,
255 FN1, F13, F14, F15, F16, NO, FN23,
256 TRNS,F17, F18, F19, F20, NO,
257 TRNS,F21, F22, F23, F24, NO, TRNS,
258 TRNS,TRNS,TRNS,TRNS,TRNS,
263 NO, NO, NO, NO, NO, NO, TRNS,
264 FN23,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,
273 KEYMAP( // Layer8: mouse and navigation, leftled:mid/blue+bot/green
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,
285 TRNS,MPLY,MPRV,MNXT,VOLD,VOLU,MUTE,
286 TRNS,BTN2,WH_L,WH_U,WH_D,WH_R,PGUP,
287 BTN1,MS_L,MS_U,MS_D,MS_R,PGDN,
288 TRNS,BTN3,HOME,END, DEL, INS, NO,
289 TRNS,TRNS,TRNS,TRNS,TRNS,
296 // templates to copy from
298 KEYMAP( // LayerN: transparent on edges + hard-defined thumb keys, all others are empty
300 TRNS,NO, NO, NO, NO, NO, NO,
301 TRNS,NO, NO, NO, NO, NO, TRNS,
302 TRNS,NO, NO, NO, NO, NO,
303 TRNS,NO, NO, NO, NO, NO, TRNS,
304 TRNS,TRNS,TRNS,LALT,LGUI,
309 NO, NO, NO, NO, NO, NO, TRNS,
310 TRNS,NO, NO, NO, NO, NO, TRNS,
311 NO, NO, NO, NO, NO, TRNS,
312 TRNS,NO, NO, NO, NO, NO, TRNS,
313 RGUI,RALT,TRNS,TRNS,TRNS,
318 KEYMAP( // LayerN: fully transparent
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,
329 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
330 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
331 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
332 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
333 TRNS,TRNS,TRNS,TRNS,TRNS,
342 /* id for user defined functions & macros */
358 * Fn action definition
360 static const uint16_t PROGMEM fn_actions[] = {
361 [0] = ACTION_FUNCTION(TEENSY_KEY), // FN0 - Teensy key
363 [1] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // FN1 = Shifted BackSlash // " in Workman
364 [2] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // FN2 = Shifted Minus // \ in Workman
365 [3] = ACTION_MODS_KEY(MOD_LSFT, KC_COMM), // FN3 = Shifted comma // < in Workman
366 [4] = ACTION_MODS_KEY(MOD_LSFT, KC_DOT), // FN4 = Shifted dot // > in Workman
368 [5] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_BSPC), // FN5 = LShift with tap BackSpace
369 [6] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_DEL), // FN6 = LCtrl with tap Delete
370 [7] = ACTION_MODS_TAP_KEY(MOD_LALT, KC_ESC), // FN7 = LAlt with tap Escape
371 [8] = ACTION_MODS_TAP_KEY(MOD_RALT, KC_INS), // FN8 = RAlt with tap Ins
372 [9] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT), // FN9 = RShift with tap Enter
373 [10] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_SPC), // FN10 = RCtrl with tap Space
375 [11] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_TAB), // FN11 = LShift with tap Tab
376 [12] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_GRV), // FN12 = LCtrl with tap Tilda
377 [13] = ACTION_MODS_TAP_KEY(MOD_LALT, KC_SPC), // FN13 = LAlt with tap Space
378 [14] = ACTION_MODS_TAP_KEY(MOD_LGUI, KC_ESC), // FN14 = LGui with tap Escape
379 [15] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_QUOT), // FN15 = RShift with tap quotes
380 [16] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_RBRC), // FN16 = RCtrl with tap ]
382 [17] = ACTION_LAYER_SET(0, ON_BOTH), // FN17 - set Layer0
383 [18] = ACTION_LAYER_SET(1, ON_BOTH), // FN18 - set Layer1, to use Workman layout at firmware level
384 [19] = ACTION_LAYER_SET(2, ON_BOTH), // FN19 - set Layer2, to use with Numpad keys
386 [21] = ACTION_FUNCTION_TAP(L_CTRL_ALT_ENT), // FN21 - momentary Layer5+CTRL+ALT on Enter, to use with F* keys on top row
387 [22] = ACTION_FUNCTION_TAP(R_CTRL_ALT_ENT), // FN22 - momentary Layer6+CTRL+ALT on Enter, to use with F* keys on top row + utils
389 [28] = ACTION_LAYER_TAP_KEY(4, KC_A), // FN28 = momentary Layer4 on A key, to use with unconvenient keys
390 [29] = ACTION_LAYER_TAP_KEY(3, KC_S), // FN29 = momentary Layer3 on S key, to use with F* keys
391 [30] = ACTION_LAYER_TAP_KEY(8, KC_D), // FN30 = momentary Layer8 on D key, to use with mouse and navigation keys
392 [31] = ACTION_LAYER_TAP_KEY(2, KC_F), // FN31 = momentary Layer2 on F key, to use with Numpad keys
394 // i'd like to remove this - will try to get used to live without this and convert them to usual keys
395 [20] = ACTION_LAYER_MOMENTARY(2), // FN20 - momentary Layer2, to use with Numpad keys
397 // [20] = ACTION_FUNCTION_TAP(CUSTOM_KEY), // FN20 - use custom key, with tapping support
399 [23] = ACTION_LAYER_TAP_KEY(7, KC_BSLS), // FN23 - momentary Layer7 on ' , to use with F* keys (F1-F24)
401 [24] = ACTION_LAYER_TAP_KEY(4, KC_Z), // FN24 = momentary Layer4 on Z key, to use with unconvenient keys
402 [25] = ACTION_LAYER_TAP_KEY(3, KC_X), // FN25 = momentary Layer3 on X key, to use with F* keys
403 [26] = ACTION_LAYER_TAP_KEY(8, KC_C), // FN26 = momentary Layer8 on C key, to use with mouse and navigation keys
404 [27] = ACTION_LAYER_TAP_KEY(2, KC_V), // FN27 = momentary Layer2 on V key, to use with Numpad keys
407 static const uint16_t PROGMEM fn_actions_4[] = {
408 [1] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // FN1 = Shifted BackSlash // " in Workman
409 [2] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // FN2 = Shifted Minus // \ in Workman
410 [3] = ACTION_MODS_KEY(MOD_LSFT, KC_COMM), // FN3 = Shifted comma // < in Workman
411 [4] = ACTION_MODS_KEY(MOD_LSFT, KC_DOT), // FN4 = Shifted dot // > in Workman
412 [5] = ACTION_MODS_KEY(MOD_LSFT, KC_SLSH), // FN5 = Shifted slash // ? in Workman
415 static const uint16_t PROGMEM fn_actions_7[] = {
416 [0] = ACTION_MACRO(XMONAD_RESET), // FN0 = xmonad-reanimator
417 [1] = ACTION_MACRO(PASSWORD1), // FN1 = default password
418 [2] = ACTION_MACRO(PASSWORD1), // FN2 = other password
419 [3] = ACTION_MACRO(PASSWORD1), // FN3 = mega password
422 void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
424 // print("action_function called\n");
425 // print("id = "); phex(id); print("\n");
426 // print("opt = "); phex(opt); print("\n");
428 if (id == TEENSY_KEY) {
430 print("\n\nJump to bootloader... ");
432 bootloader_jump(); // should not return
433 print("not supported.\n");
436 if (id == L_CTRL_ALT_ENT || id == R_CTRL_ALT_ENT) {
437 if (record->tap.count == 0 || record->tap.interrupted) {
441 if (id == L_CTRL_ALT_ENT) {
442 weak_mods = MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT);
445 weak_mods = MOD_BIT(KC_RCTL) | MOD_BIT(KC_RALT);
449 if (record->event.pressed) {
451 add_weak_mods(weak_mods);
453 del_weak_mods(weak_mods);
457 if (record->event.pressed) {
459 send_keyboard_report();
462 send_keyboard_report();
469 * just an example of custom key implementation
470 * not really needed with custom keymap_fn_to_action(),
471 * because it will allow you to have 32 FN** keys on EACH layer
475 keyevent_t event = record->event;
477 if (id == CUSTOM_KEY) {
478 uint8_t layer = biton32(layer_state);
479 uint8_t col = event.key.col;
480 uint8_t row = event.key.row;
484 if (layer == XXX && col == XXX && row == XXX) {
496 print("custom key not handled");
497 print(": layer "); pdec(layer);
498 print(", col "); pdec(col);
499 print(", row "); pdec(row);
507 #include "keymap_passwords.h"
508 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
509 if (record->event.pressed) {
511 case XMONAD_RESET: return MACRO_XMONAD_RESET;
512 case PASSWORD1: return MACRO_PASSWORD1;
518 #define FN_ACTIONS_SIZE (sizeof(fn_actions) / sizeof(fn_actions[0]))
519 #define FN_ACTIONS_4_SIZE (sizeof(fn_actions_4) / sizeof(fn_actions_4[0]))
520 #define FN_ACTIONS_7_SIZE (sizeof(fn_actions_7) / sizeof(fn_actions_7[0]))
523 * translates Fn keycode to action
524 * for some layers, use different translation table
526 action_t keymap_fn_to_action(uint8_t keycode)
528 uint8_t layer = biton32(layer_state);
531 action.code = ACTION_NO;
533 if (layer == 4 && FN_INDEX(keycode) < FN_ACTIONS_4_SIZE) {
534 action.code = pgm_read_word(&fn_actions_4[FN_INDEX(keycode)]);
537 if (layer == 7 && FN_INDEX(keycode) < FN_ACTIONS_7_SIZE) {
538 action.code = pgm_read_word(&fn_actions_7[FN_INDEX(keycode)]);
541 // by default, use fn_actions from default layer 0
542 // this is needed to get mapping for same key, that was used switch to some layer,
543 // to have possibility to switch layers back
544 if (action.code == ACTION_NO && FN_INDEX(keycode) < FN_ACTIONS_SIZE) {
545 action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]);