keymap_simon.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624
  1. #include "action_util.h"
  2. #include "action_layer.h"
  3. #define KC_SW0 KC_FN0
  4. #define DEBUG_ACTION
  5. static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  6. /* Keymap 0: Default Layer
  7. *
  8. * ,--------------------------------------------------. ,--------------------------------------------------.
  9. * | ~ | 1 | 2 | 3 | 4 | 5 | \ | | ' | 6 | 7 | 8 | 9 | 0 | = |
  10. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  11. * | Tab | Q | W | E | R | T | ~Fn1 | | ~Fn3 | Y | U | I | O | P | [ |
  12. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  13. * | LShift | A | S | D | F | G |------| |------| H | J | K | L | ; | RShift |
  14. * |--------+------+------+------+------+------| Fn0 | | ~Fn4 |------+------+------+------+------+--------|
  15. * | LCtrl | Z | X | C | V | B | | | | N | M | , | . | / | RCtrl |
  16. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  17. * | ~Fn1 | ~Fn2 | Caps | LAlt | LGui | | Lft | Up | Dn | Rght | ~Fn4 |
  18. * `----------------------------------' `----------------------------------'
  19. * ,-------------. ,-------------.
  20. * | +Fn2 | Home | | PgUp | Del |
  21. * ,------|------|------| |------+------+------.
  22. * | | | End | | PgDn | | |
  23. * | BkSp | ESC |------| |------| Enter| Space|
  24. * | | | Spc | | Ins | | |
  25. * `--------------------' `--------------------'
  26. */
  27. // BASE LAYERS
  28. KEYMAP( // layout: layer 0: customized dvorak with symbol row switched
  29. // left hand
  30. ESC, FN12,FN12,FN12,FN12,FN12,BSLS,
  31. TAB, QUOT,COMM,DOT, P, Y, FN2,
  32. LSFT,A, O, E, U, I,
  33. LCTL,SCLN,Q, J, K, X, DEL,
  34. FN3, FN1, LCTL,LALT,LGUI,
  35. FN5, HOME,
  36. END,
  37. BSPC,LSFT,LGUI,
  38. // right hand
  39. MINS,FN12,FN12,FN12,FN12,FN12,MPLY,
  40. FN3, F, G, C, R, L, MNXT,
  41. D, H, T, N, S, RSFT,
  42. DEL, B, M, W, V, Z, RCTL,
  43. MPRV,MNXT,APP, FN8,FN2,
  44. PGUP,MPLY,
  45. PGDN,
  46. ENT, FN1, SPC
  47. ),
  48. KEYMAP( // layout: layer 1: customized dvorak
  49. // left hand
  50. ESC, 1, 2, 3, 4, 5, BSLS,
  51. TAB, QUOT,COMM,DOT, P, Y, FN2,
  52. LSFT,A, O, E, U, I,
  53. LCTL,SCLN,Q, J, K, X, DEL,
  54. FN3, FN1, LCTL,LALT,LGUI,
  55. FN5, HOME,
  56. END,
  57. BSPC,LSFT,LGUI,
  58. // right hand
  59. MINS,6, 7, 8, 9, 0, EQL,
  60. FN3, F, G, C, R, L, SLSH,
  61. D, H, T, N, S, RSFT,
  62. DEL, B, M, W, V, Z, RCTL,
  63. LEFT,DOWN,UP, RGHT,FN2,
  64. PGUP,MPLY,
  65. PGDN,
  66. ENT, FN1, SPC
  67. ),
  68. KEYMAP( // layer 2 : qwerty
  69. // left hand
  70. TRNS,1, 2, 3, 4, 5, TRNS,
  71. TRNS,Q, W, E, R, T, TRNS,
  72. TRNS,A, S, D, F, G,
  73. TRNS,Z, X, C, V, B, TRNS,
  74. TRNS,TRNS,TRNS,TRNS,TRNS,
  75. TRNS,TRNS,
  76. TRNS,
  77. TRNS,TRNS,TRNS,
  78. // right hand
  79. TRNS,6, 7, 8, 9, 0, MINS,
  80. TRNS,Y, U, I, O, P, RBRC,
  81. H, J, K, L, SCLN,RSFT,
  82. TRNS,N, M, COMM,DOT, SLSH,RSFT,
  83. TRNS,TRNS,TRNS,TRNS,TRNS,
  84. TRNS,TRNS,
  85. TRNS,
  86. TRNS,TRNS,TRNS
  87. ),
  88. KEYMAP( // layer 3 : reserved
  89. // left hand
  90. TRNS,1, 2, 3, 4, 5, TRNS,
  91. TRNS,Q, W, E, R, T, TRNS,
  92. TRNS,A, S, D, F, G,
  93. TRNS,Z, X, C, V, B, TRNS,
  94. TRNS,TRNS,TRNS,TRNS,TRNS,
  95. TRNS,TRNS,
  96. TRNS,
  97. TRNS,TRNS,TRNS,
  98. // right hand
  99. TRNS,6, 7, 8, 9, 0, MINS,
  100. TRNS,Y, U, I, O, P, RBRC,
  101. H, J, K, L, SCLN,QUOT,
  102. TRNS,N, M, COMM,DOT, SLSH,RSFT,
  103. TRNS,TRNS,TRNS,TRNS,TRNS,
  104. RALT,RCTL,
  105. PGUP,
  106. PGDN,ENT, SPC
  107. ),
  108. // PLOVER (SPECIAL CASE)
  109. KEYMAP( // layout: layer 4: Steno for Plover
  110. // left hand
  111. FN5, NO, NO, NO, NO, NO, NO,
  112. NO, 1, 2, 3, 4, 5, NO,
  113. NO, Q, W, E, R, T,
  114. NO, A, S, D, F, G, NO,
  115. NO, NO, NO, NO, NO,
  116. FN5, NO,
  117. NO,
  118. C, V, NO,
  119. // right hand
  120. NO, NO, NO, NO, NO, NO, TRNS,
  121. NO, 6, 7, 8, 9, 0, TRNS,
  122. Y, U, I, O, P, LBRC,
  123. NO, H, J, K, L, SCLN,QUOT,
  124. TRNS,TRNS,NO, NO, NO,
  125. TRNS,TRNS,
  126. TRNS,
  127. NO, N, M
  128. ),
  129. KEYMAP( // layout: layer 5: reserved
  130. // left hand
  131. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  132. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  133. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  134. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  135. TRNS,TRNS,TRNS,TRNS,TRNS,
  136. TRNS,TRNS,
  137. TRNS,
  138. TRNS,TRNS,TRNS,
  139. // right 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. ),
  149. // MODIFIERS THAT MIGHT BE STICKY
  150. KEYMAP( // layout: layer 6: mouse + numpad
  151. // left hand
  152. FN0, NO, NO, NO, NO, PAUS,PSCR,
  153. TRNS,NO, WH_U,MS_U,WH_D,BTN2,TRNS,
  154. TRNS,NO, MS_L,MS_D,MS_R,BTN1,
  155. TRNS,NO, NO, NO, NO, BTN3,TRNS,
  156. TRNS,FN13,TRNS,TRNS,TRNS,
  157. TRNS,TRNS,
  158. TRNS,
  159. TRNS,TRNS,TRNS,
  160. // right hand
  161. SLCK,NLCK,EQL, PSLS,PAST,PMNS,TRNS,
  162. TRNS,NO, P7, P8, P9, PMNS,BSPC,
  163. NO, P4, P5, P6, PPLS,PENT,
  164. TRNS,NO, P1, P2, P3, PPLS,PENT,
  165. P0, PDOT,PDOT,PENT,PENT,
  166. TRNS,TRNS,
  167. TRNS,
  168. ENT, TRNS,BSPC
  169. ),
  170. KEYMAP( // layout: layer 7: F-keys + cursor
  171. // left hand
  172. FN0, F1, F2, F3, F4, F5, F6,
  173. FN4, NO, PGUP,UP, PGDN,NO, TRNS,
  174. TRNS,HOME,LEFT,DOWN,RGHT,END,
  175. TRNS,NO, NO, END, HOME,NO, TRNS,
  176. TRNS,TRNS,TRNS,FN10,FN11,
  177. TRNS,TRNS,
  178. TRNS,
  179. LCTL,LSFT,TRNS,
  180. // right hand
  181. F7, F8, F9, F10, F11, F12, MINS,
  182. TRNS,NO, PGUP,UP, PGDN, NO, FN4,
  183. HOME,LEFT,DOWN,RGHT,END, TRNS,
  184. TRNS,NO, NO, NO, NO, NO, TRNS,
  185. RGUI,RALT,TRNS,TRNS,TRNS,
  186. TRNS,TRNS,
  187. TRNS, TRNS,RSFT,RCTL
  188. ),
  189. KEYMAP( // layout: layer 8: "BlueShift"
  190. // left hand
  191. FN0, F1, F2, F3, F4, F5, F6,
  192. TRNS,GRV, FN12,FN12,PSCR,BSLS,TRNS, // the FN12 entries are for inverted brace/bracket keys
  193. TRNS,APP, TAB, EQL, TRNS,INS,
  194. TRNS,TRNS,FN8, TRNS,CAPS,TRNS,TRNS, // quit (alt+f4)
  195. FN13,TRNS,TRNS,TRNS,TRNS,
  196. TRNS,TRNS,
  197. TRNS,
  198. ESC, TRNS,TRNS,
  199. // right hand
  200. F7, F8, F9, F10, F11, F12, MINS,
  201. TRNS,PGUP,HOME,UP, END, SLSH,RBRC,
  202. PGDN,LEFT,DOWN,RGHT,MINS,TRNS,
  203. TRNS,TRNS,NO, UP, NO, TRNS,TRNS,
  204. LEFT,DOWN,RGHT,TRNS,TRNS,
  205. TRNS,TRNS,
  206. TRNS,
  207. TRNS,TRNS,TRNS
  208. ),
  209. KEYMAP( // layout: layer 9: reserved
  210. // left hand
  211. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  212. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  213. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  214. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  215. TRNS,TRNS,TRNS,TRNS,TRNS,
  216. TRNS,TRNS,
  217. TRNS,
  218. TRNS,TRNS,TRNS,
  219. // right hand
  220. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  221. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  222. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  223. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  224. TRNS,TRNS,TRNS,TRNS,TRNS,
  225. TRNS,TRNS,
  226. TRNS,
  227. TRNS,TRNS,TRNS
  228. ),
  229. KEYMAP( // layout: layer 10: reserved
  230. // left hand
  231. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  232. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  233. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  234. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  235. TRNS,TRNS,TRNS,TRNS,TRNS,
  236. TRNS,TRNS,
  237. TRNS,
  238. TRNS,TRNS,TRNS,
  239. // right hand
  240. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  241. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  242. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  243. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  244. TRNS,TRNS,TRNS,TRNS,TRNS,
  245. TRNS,TRNS,
  246. TRNS,
  247. TRNS,TRNS,TRNS
  248. ),
  249. // MODIFIERS THAT WON'T BE STICKY
  250. KEYMAP( // layout: layer 11: Special function-driven commands (any-key)
  251. // left hand
  252. FN8, FN8, FN8, FN8, FN8, FN8, FN8,
  253. FN8, FN8, FN8, FN8, FN8, FN8, FN8,
  254. LSFT,FN8, FN8, FN8, FN8, FN8,
  255. FN8, FN8, FN8, FN8, FN8, FN8, FN8,
  256. FN8, FN8, FN8, FN8, FN8,
  257. FN8, FN8,
  258. FN8,
  259. FN8, FN10,FN8,
  260. // right hand
  261. FN8, FN8, FN8, FN8, FN8, FN8, FN8,
  262. FN8, FN8, FN8, FN8, FN8, FN8, FN8,
  263. FN8, FN8, FN8, FN8, FN8, RSFT,
  264. FN8, FN8, FN8, FN8, FN8, FN8, FN8,
  265. FN8, FN8, FN8, FN8, FN8,
  266. FN8, FN8,
  267. FN8,
  268. FN8, FN8, FN8
  269. ),
  270. KEYMAP( // layout: layer 12: F-keys only
  271. // left hand
  272. FN0, NO, NO, NO, NO, NO, NO,
  273. TRNS,F13, F14, F15, F16, NO, TRNS,
  274. TRNS,F17, F18, F19, F20, NO,
  275. TRNS,F21, F22, F23, F24, NO, TRNS,
  276. FN13,FN13,TRNS,LALT,LGUI,
  277. TRNS,TRNS,
  278. TRNS,
  279. LCTL,LSFT,TRNS,
  280. // right hand
  281. NO, NO, F10, F11, F12, NO, TRNS,
  282. TRNS,NO, F7, F8, F9, NO, TRNS,
  283. NO, F4, F5, F6, NO, TRNS,
  284. TRNS,NO, F1, F2, F3, NO, TRNS,
  285. RGUI,RALT,RCTL,TRNS,TRNS,
  286. TRNS,TRNS,
  287. TRNS,
  288. TRNS,RSFT,RCTL
  289. ),
  290. KEYMAP( // layout: layer 13: reserved
  291. // left hand
  292. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  293. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  294. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  295. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  296. TRNS,TRNS,TRNS,TRNS,TRNS,
  297. TRNS,TRNS,
  298. TRNS,
  299. TRNS,TRNS,TRNS,
  300. // right hand
  301. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  302. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  303. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  304. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  305. TRNS,TRNS,TRNS,TRNS,TRNS,
  306. TRNS,TRNS,
  307. TRNS,
  308. TRNS,TRNS,TRNS
  309. ),
  310. KEYMAP( // layout: layer 14: reserved
  311. // left hand
  312. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  313. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  314. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  315. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  316. TRNS,TRNS,TRNS,TRNS,TRNS,
  317. TRNS,TRNS,
  318. TRNS,
  319. TRNS,TRNS,TRNS,
  320. // right hand
  321. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  322. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  323. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  324. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  325. TRNS,TRNS,TRNS,TRNS,TRNS,
  326. TRNS,TRNS,
  327. TRNS,
  328. TRNS,TRNS,TRNS
  329. ),
  330. // TEMPLATES
  331. /*
  332. KEYMAP( // layout: layer N: transparent on edges, all others are empty
  333. // left hand
  334. TRNS,NO, NO, NO, NO, NO, NO,
  335. TRNS,NO, NO, NO, NO, NO, TRNS,
  336. TRNS,NO, NO, NO, NO, NO,
  337. TRNS,NO, NO, NO, NO, NO, TRNS,
  338. TRNS,TRNS,TRNS,LALT,LGUI,
  339. TRNS,TRNS,
  340. TRNS,
  341. LCTL,LSFT,TRNS,
  342. // right hand
  343. NO, NO, NO, NO, NO, NO, TRNS,
  344. TRNS,NO, NO, NO, NO, NO, TRNS,
  345. NO, NO, NO, NO, NO, TRNS,
  346. TRNS,NO, NO, NO, NO, NO, TRNS,
  347. RGUI,RALT,TRNS,TRNS,TRNS,
  348. TRNS,TRNS,
  349. TRNS,
  350. TRNS,RSFT,RCTL
  351. ),
  352. KEYMAP( // layout: layer N: fully transparent
  353. // left hand
  354. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  355. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  356. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  357. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  358. TRNS,TRNS,TRNS,TRNS,TRNS,
  359. TRNS,TRNS,
  360. TRNS,
  361. TRNS,TRNS,TRNS,
  362. // right hand
  363. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  364. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  365. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  366. TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  367. TRNS,TRNS,TRNS,TRNS,TRNS,
  368. TRNS,TRNS,
  369. TRNS,
  370. TRNS,TRNS,TRNS
  371. ),
  372. */
  373. };
  374. /* id for user defined functions */
  375. enum function_id {
  376. TEENSY_KEY,
  377. ANY_KEY,
  378. PLOVER_SWITCH,
  379. SHIFT_SWITCH,
  380. FKEY_SWITCH,
  381. };
  382. enum macro_id {
  383. MACRO_PASSWORD1,
  384. MACRO_PASSWORD2,
  385. MACRO_PASSWORD3,
  386. };
  387. /*
  388. * Fn action definition
  389. */
  390. static const uint16_t PROGMEM fn_actions[] = {
  391. ACTION_LAYER_SET(0, ON_PRESS), // FN0 - set layer0 only
  392. ACTION_LAYER_TAP_TOGGLE(8), // FN1 - switch to BlueShift
  393. ACTION_LAYER_TAP_TOGGLE(7), // FN2 - movement tap/toggle
  394. ACTION_LAYER_TAP_TOGGLE(6), // FN3 - numpad
  395. ACTION_FUNCTION(TEENSY_KEY), // FN4 - Teensy key
  396. ACTION_FUNCTION(PLOVER_SWITCH), // FN5 - enable Plover
  397. ACTION_FUNCTION(PLOVER_SWITCH), // ** FN6 - suspend Plover (OUT OF USE)
  398. ACTION_LAYER_MOMENTARY(11), // FN7 - Trigger the AnyKey layer
  399. ACTION_FUNCTION(ANY_KEY), // FN8 - AnyKey functional layer
  400. ACTION_MODS_TAP_TOGGLE(MOD_LSFT), // ** FN9 - tap toggle shift (OUT OF USE)
  401. ACTION_MACRO(MACRO_PASSWORD1), // FN10 - password1
  402. ACTION_MACRO(MACRO_PASSWORD2), // FN11 - password2
  403. ACTION_FUNCTION(SHIFT_SWITCH), // FN12 - symbolized number row
  404. ACTION_FUNCTION(FKEY_SWITCH), // FN13 - trigger Fkey layer and get rid of it appropriately
  405. };
  406. void simon_hotkey(keyrecord_t *record, action_t action)
  407. {
  408. keyevent_t event = record->event;
  409. switch (action.kind.id) {
  410. /* Key and Mods */
  411. case ACT_LMODS:
  412. case ACT_RMODS:
  413. {
  414. uint8_t mods = (action.kind.id == ACT_LMODS) ? action.key.mods :
  415. action.key.mods<<4;
  416. if (event.pressed) {
  417. if (mods) {
  418. add_weak_mods(mods);
  419. send_keyboard_report();
  420. }
  421. register_code(action.key.code);
  422. } else {
  423. unregister_code(action.key.code);
  424. if (mods) {
  425. del_weak_mods(mods);
  426. send_keyboard_report();
  427. }
  428. }
  429. }
  430. break;
  431. default:
  432. print("not supported.\n");
  433. break;
  434. }
  435. }
  436. void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
  437. {
  438. keyevent_t event = record->event;
  439. // print("action_function called\n");
  440. // print("id = "); phex(id); print("\n");
  441. // print("opt = "); phex(opt); print("\n");
  442. if (id == TEENSY_KEY) {
  443. clear_keyboard();
  444. print("\n\nJump to bootloader... ");
  445. _delay_ms(250);
  446. bootloader_jump(); // should not return
  447. print("not supported.\n");
  448. }
  449. else if (id == PLOVER_SWITCH) {
  450. if (event.pressed) {
  451. if (layer_state & 1<<4) { // plover is already on
  452. print("switching off plover layout...\n");
  453. 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));
  454. layer_off(4);
  455. } else {
  456. print("switching on plover layout...\n");
  457. 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));
  458. layer_on(4);
  459. }
  460. }
  461. }
  462. else if (id == ANY_KEY) {
  463. uint8_t col = event.key.col;
  464. uint8_t row = event.key.row;
  465. action_t action = { .code = ACTION_NO };
  466. if (col == 3 && row == 2) { // Q
  467. action.code = ACTION_MODS_KEY(MOD_LALT, KC_F4);
  468. }
  469. if (col == 3 && row == 10) { // W
  470. action.code = ACTION_MODS_KEY(MOD_LALT, KC_F4);
  471. }
  472. if (col == 4 && row == 12) { // Alt+tab
  473. action.code = ACTION_MODS_KEY(MOD_LALT, KC_TAB);
  474. }
  475. if (action.code != ACTION_NO) {
  476. simon_hotkey(record, action);
  477. }
  478. else
  479. {
  480. print("col = "); pdec(col); print("\n");
  481. print("row = "); pdec(row); print("\n");
  482. }
  483. }
  484. else if (id == SHIFT_SWITCH) {
  485. uint8_t col = event.key.col;
  486. uint8_t row = event.key.row;
  487. uint8_t savedmods = get_mods();
  488. uint8_t shiftpressed = (savedmods & (MOD_LSFT | MOD_RSFT));
  489. uint8_t othermodspressed = (savedmods & (MOD_LGUI | MOD_RGUI | MOD_LCTL | MOD_RCTL | MOD_LALT | MOD_RALT ));
  490. action_t action = { .code = ACTION_NO };
  491. uint8_t keycode = KC_NO;
  492. if (col == 0) { // Number row
  493. switch (row) {
  494. case 1:
  495. keycode = KC_1;
  496. break;
  497. case 2:
  498. keycode = KC_2;
  499. break;
  500. case 3:
  501. keycode = KC_3;
  502. break;
  503. case 4:
  504. keycode = KC_4;
  505. break;
  506. case 5:
  507. keycode = KC_5;
  508. break;
  509. case 8:
  510. keycode = KC_6;
  511. break;
  512. case 9:
  513. keycode = KC_7;
  514. break;
  515. case 10:
  516. keycode = KC_8;
  517. break;
  518. case 11:
  519. keycode = KC_9;
  520. break;
  521. case 12:
  522. keycode = KC_0;
  523. break;
  524. default:
  525. break;
  526. }
  527. }
  528. if (col == 1) { // next row
  529. switch (row) {
  530. case 2:
  531. keycode = KC_LBRC;
  532. break;
  533. case 3:
  534. keycode = KC_RBRC;
  535. break;
  536. default:
  537. break;
  538. }
  539. }
  540. if (keycode != KC_NO) {
  541. action.code = ACTION_MODS_KEY(MOD_LSFT, keycode);
  542. }
  543. if (action.code != ACTION_NO) {
  544. if (othermodspressed) {
  545. action.key.mods = 0;
  546. }
  547. else if (shiftpressed) {
  548. action.key.mods = 0;
  549. del_mods(MOD_LSFT | MOD_RSFT);
  550. }
  551. simon_hotkey(record, action);
  552. if (shiftpressed) {
  553. set_mods(savedmods);
  554. }
  555. }
  556. }
  557. else if (id == FKEY_SWITCH) {
  558. uint8_t row = event.key.row;
  559. if (event.pressed) {
  560. layer_on(12);
  561. }
  562. else {
  563. if ((row == 0) && (layer_state & 1<<6)) { // left button and from numpad; out-of-order release
  564. layer_off(6);
  565. }
  566. else if ((row == 1) && (layer_state & 1<<8)) { // right button and from BlueShift; out-of-order release
  567. layer_off(8);
  568. }
  569. else {
  570. layer_off(12);
  571. }
  572. }
  573. }
  574. }
  575. /*
  576. * Macro definition
  577. */
  578. const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
  579. {
  580. keyevent_t event = record->event;
  581. if (event.pressed) {
  582. switch (id) {
  583. #include "keymap_simon_passwords.h"
  584. }
  585. }
  586. return MACRO_NONE;
  587. }