keymap_cub.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595
  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. KEYMAP( // Layer0: default, leftled:none
  93. // left hand
  94. GRV, 1, 2, 3, 4, 5, BSLS,
  95. FN2, Q, W, E, R, T, FN23,
  96. FN11,FN28,FN29,FN30,FN31,G,
  97. FN12,FN24,FN25,FN26,FN27,B, HOME,
  98. FN21,FN20,CAPS,FN13,FN14,
  99. FN17,FN19,
  100. NO,
  101. FN5, FN6, FN7,
  102. // right hand
  103. MINS,6, 7, 8, 9, 0, EQL,
  104. FN23,Y, U, I, O, P, LBRC,
  105. H, J, K, L, SCLN,FN15,
  106. END, N, M, COMM,DOT, SLSH,FN16,
  107. LEFT,UP, DOWN,RGHT,FN22,
  108. PGUP,DEL,
  109. PGDN,
  110. FN8, FN9, FN10
  111. ),
  112. KEYMAP( // Layer1: Workman layout, leftled:all
  113. // left hand
  114. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  115. TRNS,Q, D, R, W, B, TRNS,
  116. TRNS,A, S, H, T, G,
  117. TRNS,Z, X, M, C, V, TRNS,
  118. TRNS,TRNS,FN17,TRNS,TRNS,
  119. TRNS,TRNS,
  120. TRNS,
  121. TRNS,TRNS,TRNS,
  122. // right hand
  123. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  124. TRNS,J, F, U, P, 4, TRNS,
  125. Y, N, E, O, I, TRNS,
  126. TRNS,K, L, TRNS,TRNS,TRNS,TRNS,
  127. TRNS,TRNS,TRNS,TRNS,TRNS,
  128. TRNS,TRNS,
  129. TRNS,
  130. TRNS,TRNS,TRNS
  131. ),
  132. KEYMAP( // Layer2: numpad, leftled:mid/blue
  133. // left hand
  134. TRNS,NO, NO, NO, NO, PAUS,PSCR,
  135. TRNS,NO, NO, NO, NO, NO, TRNS,
  136. TRNS,NO, NO, NO, TRNS,NO,
  137. TRNS,NO, NO, NO, TRNS,NO, TRNS,
  138. TRNS,TRNS,FN17,TRNS,TRNS,
  139. TRNS,TRNS,
  140. TRNS,
  141. TRNS,TRNS,TRNS,
  142. // right hand
  143. SLCK,NLCK,PSLS,PAST,PAST,PMNS,BSPC,
  144. TRNS,NO, P7, P8, P9, PMNS,PGUP,
  145. NO, P4, P5, P6, PPLS,PGDN,
  146. TRNS,NO, P1, P2, P3, PPLS,PENT,
  147. P0, PDOT,SLSH,PENT,PENT,
  148. TRNS,TRNS,
  149. TRNS,
  150. TRNS,TRNS,TRNS
  151. ),
  152. KEYMAP( // Layer3: F-keys + PgUp/PgDn on right hand, leftled:bot/green
  153. // left hand
  154. TRNS,NO, NO, NO, NO, NO, NO,
  155. TRNS,NO, NO, NO, NO, NO, TRNS,
  156. TRNS,NO, TRNS,NO, NO, NO,
  157. TRNS,NO, TRNS,NO, NO, NO, TRNS,
  158. TRNS,TRNS,TRNS,LALT,LGUI,
  159. TRNS,TRNS,
  160. TRNS,
  161. LCTL,LSFT,TRNS,
  162. // right hand
  163. NO, NO, NO, NO, NO, NO, TRNS,
  164. TRNS,NO, F1, F2, F3, F4, PGUP,
  165. NO, F5, F6, F7, F8, PGDN,
  166. TRNS,NO, F9, F10, F11, F12, APP,
  167. RGUI,RALT,TRNS,TRNS,TRNS,
  168. TRNS,TRNS,
  169. TRNS,
  170. TRNS,RSFT,RCTL
  171. ),
  172. KEYMAP( // Layer4: unconvenient keys on right hand, leftled:top/white
  173. // left hand
  174. TRNS,NO, NO, NO, NO, NO, NO,
  175. TRNS,NO, NO, NO, NO, NO, TRNS,
  176. TRNS,TRNS,NO, NO, NO, NO,
  177. TRNS,TRNS,NO, NO, NO, NO, TRNS,
  178. TRNS,TRNS,TRNS,LALT,LGUI,
  179. TRNS,TRNS,
  180. TRNS,
  181. TRNS,TRNS,TRNS,
  182. /* in Workman right hand will be:
  183. { } ( ) +
  184. ^ ! ? =
  185. ' ! $ " ; \
  186. # [ < > ] \
  187. */
  188. // right hand
  189. NO, NO, 4, 5, 9, 0, PPLS,
  190. TRNS,MINS,2, FN5, 9, 0, EQL,
  191. BSLS,2, P, FN1, 1, FN2,
  192. TRNS,3, 6, FN3, FN4, 7, FN2,
  193. TRNS,TRNS,TRNS,TRNS,TRNS,
  194. TRNS,TRNS,
  195. TRNS,
  196. TRNS,TRNS,TRNS
  197. ),
  198. KEYMAP( // Layer5: F-keys instead of numbers, leftled:top/white
  199. // left hand
  200. TRNS,F1, F2, F3, F4, F5, F6,
  201. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  202. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  203. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  204. TRNS,TRNS,TRNS,TRNS,TRNS,
  205. TRNS,TRNS,
  206. TRNS,
  207. TRNS,TRNS,TRNS,
  208. // right hand
  209. F7, F8, F9, F10, F11, F12, TRNS,
  210. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  211. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  212. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  213. TRNS,TRNS,TRNS,TRNS,TRNS,
  214. TRNS,TRNS,
  215. TRNS,
  216. TRNS,TRNS,TRNS
  217. ),
  218. KEYMAP( // Layer6: F-keys + utils(Teensy, Workman-layer switch), leftled:top/white+onboard
  219. // left hand
  220. TRNS,F1, F2, F3, F4, F5, F6,
  221. FN0, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  222. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  223. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  224. FN18,TRNS,TRNS,TRNS,TRNS,
  225. TRNS,TRNS,
  226. TRNS,
  227. TRNS,TRNS,TRNS,
  228. // right hand
  229. F7, F8, F9, F10, F11, F12, TRNS,
  230. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,FN0,
  231. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  232. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  233. TRNS,TRNS,TRNS,TRNS,TRNS,
  234. TRNS,TRNS,
  235. TRNS,
  236. TRNS,TRNS,TRNS
  237. ),
  238. //
  239. // rarely used
  240. //
  241. KEYMAP( // Layer7: F-keys only, leftled:top/white
  242. // left hand
  243. FN0, NO, NO, NO, NO, NO, NO,
  244. FN1, F13, F14, F15, F16, NO, TRNS,
  245. TRNS,F17, F18, F19, F20, NO,
  246. TRNS,F21, F22, F23, F24, NO, TRNS,
  247. TRNS,TRNS,TRNS,TRNS,TRNS,
  248. TRNS,TRNS,
  249. TRNS,
  250. TRNS,TRNS,TRNS,
  251. // right hand
  252. NO, NO, NO, NO, NO, NO, TRNS,
  253. TRNS,NO, F1, F2, F3, F4, TRNS,
  254. NO, F5, F6, F7, F8, TRNS,
  255. TRNS,NO, F9, F10, F11, F12, TRNS,
  256. TRNS,TRNS,TRNS,TRNS,TRNS,
  257. TRNS,TRNS,
  258. TRNS,
  259. SLEP,TRNS,TRNS
  260. ),
  261. KEYMAP( // Layer8: mouse and navigation, leftled:mid/blue+bot/green
  262. // left hand
  263. TRNS,NO, NO, NO, NO, NO, NO,
  264. TRNS,NO, NO, NO, ACL0,NO, TRNS,
  265. TRNS,NO, NO, TRNS,ACL1,NO,
  266. TRNS,NO, NO, TRNS,ACL2,NO, TRNS,
  267. TRNS,TRNS,TRNS,TRNS,TRNS,
  268. TRNS,TRNS,
  269. TRNS,
  270. TRNS,TRNS,TRNS,
  271. // right hand
  272. F16, MPLY,MPRV,MNXT,VOLD,VOLU,MUTE,
  273. F14, BTN2,WH_L,WH_U,WH_D,WH_R,PGUP,
  274. BTN1,MS_L,MS_U,MS_D,MS_R,PGDN,
  275. F15, BTN3,HOME,END, DEL, INS, NO,
  276. TRNS,TRNS,TRNS,TRNS,TRNS,
  277. TRNS,TRNS,
  278. TRNS,
  279. TRNS,TRNS,TRNS
  280. ),
  281. KEYMAP( // Layer9: application-specific shortcuts (mostly browser), leftled:top/white+bot/green
  282. // left hand
  283. TRNS,NO, NO, NO, NO, NO, NO,
  284. TRNS,NO, NO, NO, NO, NO, TRNS,
  285. TRNS,NO, NO, NO, NO, NO,
  286. TRNS,NO, NO, NO, TRNS,NO, TRNS,
  287. TRNS,TRNS,TRNS,TRNS,TRNS,
  288. TRNS,TRNS,
  289. TRNS,
  290. TRNS,TRNS,TRNS,
  291. // right hand
  292. NO, NO, NO, NO, NO, NO, TRNS,
  293. TRNS,NO, FN12,FN13,FN14,FN15,FN10,
  294. FN1, FN2, FN3, FN4, FN5, FN11,
  295. TRNS,TRNS,FN6, FN7, FN8, FN9, FN0,
  296. TRNS,TRNS,TRNS,TRNS,TRNS,
  297. TRNS,TRNS,
  298. TRNS,
  299. TRNS,TRNS,TRNS
  300. ),
  301. /*
  302. // templates to copy from
  303. KEYMAP( // LayerN: transparent on edges + hard-defined thumb keys, all others are empty
  304. // left hand
  305. TRNS,NO, NO, NO, NO, NO, NO,
  306. TRNS,NO, NO, NO, NO, NO, TRNS,
  307. TRNS,NO, NO, NO, NO, NO,
  308. TRNS,NO, NO, NO, NO, NO, TRNS,
  309. TRNS,TRNS,TRNS,LALT,LGUI,
  310. TRNS,TRNS,
  311. TRNS,
  312. LCTL,LSFT,TRNS,
  313. // right hand
  314. NO, NO, NO, NO, NO, NO, TRNS,
  315. TRNS,NO, NO, NO, NO, NO, TRNS,
  316. NO, NO, NO, NO, NO, TRNS,
  317. TRNS,NO, NO, NO, NO, NO, TRNS,
  318. RGUI,RALT,TRNS,TRNS,TRNS,
  319. TRNS,TRNS,
  320. TRNS,
  321. TRNS,RSFT,RCTL
  322. ),
  323. KEYMAP( // LayerN: fully transparent
  324. // left hand
  325. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  326. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  327. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  328. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  329. TRNS,TRNS,TRNS,TRNS,TRNS,
  330. TRNS,TRNS,
  331. TRNS,
  332. TRNS,TRNS,TRNS,
  333. // right hand
  334. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  335. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  336. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  337. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  338. TRNS,TRNS,TRNS,TRNS,TRNS,
  339. TRNS,TRNS,
  340. TRNS,
  341. TRNS,TRNS,TRNS
  342. ),
  343. */
  344. };
  345. /* id for user defined functions & macros */
  346. enum function_id {
  347. TEENSY_KEY,
  348. CUSTOM_KEY,
  349. L_CTRL_ALT_ENT,
  350. R_CTRL_ALT_ENT,
  351. };
  352. enum macro_id {
  353. XMONAD_RESET,
  354. PASSWORD1,
  355. PASSWORD2,
  356. PASSWORD3,
  357. };
  358. /*
  359. * Fn action definition
  360. */
  361. static const uint16_t PROGMEM fn_actions[] = {
  362. [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
  367. [5] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_BSPC), // FN5 = LShift with tap BackSpace
  368. [6] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_DEL), // FN6 = LCtrl with tap Delete
  369. [7] = ACTION_MODS_TAP_KEY(MOD_LALT, KC_ESC), // FN7 = LAlt with tap Escape
  370. [8] = ACTION_MODS_TAP_KEY(MOD_RALT, KC_INS), // FN8 = RAlt with tap Ins
  371. [9] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT), // FN9 = RShift with tap Enter
  372. [10] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_SPC), // FN10 = RCtrl with tap Space
  373. [11] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_TAB), // FN11 = LShift with tap Tab
  374. [12] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_GRV), // FN12 = LCtrl with tap Tilda
  375. [13] = ACTION_MODS_TAP_KEY(MOD_LALT, KC_SPC), // FN13 = LAlt with tap Space
  376. [14] = ACTION_MODS_TAP_KEY(MOD_LGUI, KC_ESC), // FN14 = LGui with tap Escape
  377. [15] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_QUOT), // FN15 = RShift with tap quotes
  378. [16] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_RBRC), // FN16 = RCtrl with tap ]
  379. [17] = ACTION_LAYER_SET(0, ON_BOTH), // FN17 - set Layer0
  380. [18] = ACTION_LAYER_SET(1, ON_BOTH), // FN18 - set Layer1, to use Workman layout at firmware level
  381. [19] = ACTION_LAYER_SET(2, ON_BOTH), // FN19 - set Layer2, to use with Numpad keys
  382. [21] = ACTION_FUNCTION_TAP(L_CTRL_ALT_ENT), // FN21 - momentary Layer5+CTRL+ALT on Enter, to use with F* keys on top row
  383. [22] = ACTION_FUNCTION_TAP(R_CTRL_ALT_ENT), // FN22 - momentary Layer6+CTRL+ALT on Enter, to use with F* keys on top row + utils
  384. [28] = ACTION_LAYER_TAP_KEY(4, KC_A), // FN28 = momentary Layer4 on A key, to use with unconvenient keys
  385. [29] = ACTION_LAYER_TAP_KEY(3, KC_S), // FN29 = momentary Layer3 on S key, to use with F* keys
  386. [30] = ACTION_LAYER_TAP_KEY(8, KC_D), // FN30 = momentary Layer8 on D key, to use with mouse and navigation keys
  387. [31] = ACTION_LAYER_TAP_KEY(2, KC_F), // FN31 = momentary Layer2 on F key, to use with Numpad keys
  388. // i'd like to remove this - will try to get used to live without this and convert them to usual keys
  389. [20] = ACTION_LAYER_MOMENTARY(2), // FN20 - momentary Layer2, to use with Numpad keys
  390. // or
  391. // [20] = ACTION_FUNCTION_TAP(CUSTOM_KEY), // FN20 - use custom key, with tapping support
  392. [23] = ACTION_LAYER_TAP_KEY(7, KC_BSLS), // FN23 - momentary Layer7 on ' , to use with F* keys (F1-F24)
  393. [24] = ACTION_LAYER_TAP_KEY(4, KC_Z), // FN24 = momentary Layer4 on Z key, to use with unconvenient keys
  394. [25] = ACTION_LAYER_TAP_KEY(3, KC_X), // FN25 = momentary Layer3 on X key, to use with F* keys
  395. [26] = ACTION_LAYER_TAP_KEY(8, KC_C), // FN26 = momentary Layer8 on C key, to use with mouse and navigation keys
  396. [27] = ACTION_LAYER_TAP_KEY(9, KC_V), // FN27 = momentary Layer9 on V key, to use with application-specific shortcuts
  397. };
  398. static const uint16_t PROGMEM fn_actions_4[] = {
  399. [1] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // FN1 = Shifted BackSlash // " in Workman
  400. [2] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // FN2 = Shifted Minus // \ in Workman
  401. [3] = ACTION_MODS_KEY(MOD_LSFT, KC_COMM), // FN3 = Shifted comma // < in Workman
  402. [4] = ACTION_MODS_KEY(MOD_LSFT, KC_DOT), // FN4 = Shifted dot // > in Workman
  403. [5] = ACTION_MODS_KEY(MOD_LSFT, KC_SLSH), // FN5 = Shifted slash // ? in Workman
  404. };
  405. static const uint16_t PROGMEM fn_actions_7[] = {
  406. [0] = ACTION_MACRO(XMONAD_RESET), // FN0 = xmonad-reanimator
  407. [1] = ACTION_MACRO(PASSWORD1), // FN1 = default password
  408. [2] = ACTION_MACRO(PASSWORD1), // FN2 = other password
  409. [3] = ACTION_MACRO(PASSWORD1), // FN3 = mega password
  410. };
  411. static const uint16_t PROGMEM fn_actions_9[] = {
  412. [0] = ACTION_MODS_KEY(MOD_LCTL, KC_P0), // FN0 = Ctrl+0
  413. [1] = ACTION_MODS_KEY(MOD_LALT, KC_P1), // FN1 = Alt+1
  414. [2] = ACTION_MODS_KEY(MOD_LALT, KC_P2), // FN2 = Alt+2
  415. [3] = ACTION_MODS_KEY(MOD_LALT, KC_P3), // FN3 = Alt+3
  416. [4] = ACTION_MODS_KEY(MOD_LALT, KC_P4), // FN4 = Alt+4
  417. [5] = ACTION_MODS_KEY(MOD_LALT, KC_P5), // FN5 = Alt+5
  418. [6] = ACTION_MODS_KEY(MOD_LALT, KC_P6), // FN6 = Alt+6
  419. [7] = ACTION_MODS_KEY(MOD_LALT, KC_P7), // FN7 = Alt+7
  420. [8] = ACTION_MODS_KEY(MOD_LALT, KC_P8), // FN8 = Alt+8
  421. [9] = ACTION_MODS_KEY(MOD_LALT, KC_P9), // FN9 = Alt+9
  422. [10] = ACTION_MODS_KEY(MOD_LCTL|MOD_LSFT, KC_TAB), // FN10 = Ctrl+Shift+Tab
  423. [11] = ACTION_MODS_KEY(MOD_LCTL, KC_TAB), // FN11 = Ctrl+Tab
  424. [12] = ACTION_MODS_KEY(MOD_LCTL|MOD_LSFT, KC_PGUP), // FN12 = Ctrl+Shift+PgUp
  425. [13] = ACTION_MODS_KEY(MOD_LCTL|MOD_LSFT, KC_PGDN), // FN13 = Ctrl+Shift+PgDn
  426. [14] = ACTION_MODS_KEY(MOD_LCTL, KC_PMNS), // FN14 = Ctrl+Pad Minus
  427. [15] = ACTION_MODS_KEY(MOD_LCTL, KC_PPLS), // FN15 = Ctrl+Pad Plus
  428. };
  429. void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
  430. {
  431. // print("action_function called\n");
  432. // print("id = "); phex(id); print("\n");
  433. // print("opt = "); phex(opt); print("\n");
  434. if (id == TEENSY_KEY) {
  435. clear_keyboard();
  436. print("\n\nJump to bootloader... ");
  437. _delay_ms(50);
  438. bootloader_jump(); // should not return
  439. print("not supported.\n");
  440. }
  441. if (id == L_CTRL_ALT_ENT || id == R_CTRL_ALT_ENT) {
  442. if (record->tap.count == 0 || record->tap.interrupted) {
  443. uint8_t weak_mods;
  444. uint8_t layer;
  445. if (id == L_CTRL_ALT_ENT) {
  446. weak_mods = MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT);
  447. layer = 5;
  448. } else {
  449. weak_mods = MOD_BIT(KC_RCTL) | MOD_BIT(KC_RALT);
  450. layer = 6;
  451. }
  452. if (record->event.pressed) {
  453. layer_on(layer);
  454. add_weak_mods(weak_mods);
  455. } else {
  456. del_weak_mods(weak_mods);
  457. layer_off(layer);
  458. }
  459. } else {
  460. if (record->event.pressed) {
  461. add_key(KC_ENT);
  462. send_keyboard_report();
  463. } else {
  464. del_key(KC_ENT);
  465. send_keyboard_report();
  466. }
  467. }
  468. }
  469. /*
  470. * just an example of custom key implementation
  471. * not really needed with custom keymap_fn_to_action(),
  472. * because it will allow you to have 32 FN** keys on EACH layer
  473. */
  474. /*
  475. keyevent_t event = record->event;
  476. if (id == CUSTOM_KEY) {
  477. uint8_t layer = biton32(layer_state);
  478. uint8_t col = event.key.col;
  479. uint8_t row = event.key.row;
  480. uint8_t handled = 0;
  481. if (event.pressed) {
  482. if (layer == XXX && col == XXX && row == XXX) {
  483. action_macro_play(
  484. MACRO(
  485. ...........
  486. END)
  487. );
  488. handled++;
  489. }
  490. }
  491. }
  492. if (!handled) {
  493. print("custom key not handled");
  494. print(": layer "); pdec(layer);
  495. print(", col "); pdec(col);
  496. print(", row "); pdec(row);
  497. print("\n");
  498. }
  499. }
  500. */
  501. }
  502. #include "keymap_passwords.h"
  503. const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
  504. if (record->event.pressed) {
  505. switch (id) {
  506. case XMONAD_RESET: return MACRO_XMONAD_RESET;
  507. case PASSWORD1: return MACRO_PASSWORD1;
  508. }
  509. }
  510. return MACRO_NONE;
  511. }
  512. #define FN_ACTIONS_SIZE (sizeof(fn_actions) / sizeof(fn_actions[0]))
  513. #define FN_ACTIONS_4_SIZE (sizeof(fn_actions_4) / sizeof(fn_actions_4[0]))
  514. #define FN_ACTIONS_7_SIZE (sizeof(fn_actions_7) / sizeof(fn_actions_7[0]))
  515. #define FN_ACTIONS_9_SIZE (sizeof(fn_actions_9) / sizeof(fn_actions_9[0]))
  516. /*
  517. * translates Fn keycode to action
  518. * for some layers, use different translation table
  519. */
  520. action_t keymap_fn_to_action(uint8_t keycode)
  521. {
  522. uint8_t layer = biton32(layer_state);
  523. action_t action;
  524. action.code = ACTION_NO;
  525. if (layer == 4 && FN_INDEX(keycode) < FN_ACTIONS_4_SIZE) {
  526. action.code = pgm_read_word(&fn_actions_4[FN_INDEX(keycode)]);
  527. }
  528. if (layer == 7 && FN_INDEX(keycode) < FN_ACTIONS_7_SIZE) {
  529. action.code = pgm_read_word(&fn_actions_7[FN_INDEX(keycode)]);
  530. }
  531. if (layer == 9 && FN_INDEX(keycode) < FN_ACTIONS_9_SIZE) {
  532. action.code = pgm_read_word(&fn_actions_9[FN_INDEX(keycode)]);
  533. }
  534. // by default, use fn_actions from default layer 0
  535. // this is needed to get mapping for same key, that was used switch to some layer,
  536. // to have possibility to switch layers back
  537. if (action.code == ACTION_NO && FN_INDEX(keycode) < FN_ACTIONS_SIZE) {
  538. action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]);
  539. }
  540. return action;
  541. }