keymap.c 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216
  1. /*
  2. * algernon's ErgoDox EZ layout, please see the readme.md file!
  3. */
  4. #include "ergodox_ez.h"
  5. #include "led.h"
  6. #include "debug.h"
  7. #include "action_layer.h"
  8. #include "action_util.h"
  9. #include "mousekey.h"
  10. #include "timer.h"
  11. #include "keymap_plover.h"
  12. #include "eeconfig.h"
  13. /* Layers */
  14. enum {
  15. BASE = 0,
  16. ADORE,
  17. ARRW,
  18. APPSEL,
  19. HUN,
  20. NMDIA,
  21. OHLFT,
  22. OHRGT,
  23. PLVR,
  24. };
  25. /* Macros */
  26. enum {
  27. NONE = 0,
  28. // Buttons that do extra stuff
  29. A_GUI,
  30. A_PLVR,
  31. A_ESC,
  32. A_MPN,
  33. // Function / number keys
  34. KF_1, // 1, F1
  35. KF_2, // 2, F2
  36. KF_3, // ...
  37. KF_4,
  38. KF_5,
  39. KF_6,
  40. KF_7,
  41. KF_8,
  42. KF_9,
  43. KF_10,
  44. KF_11, // =, F11
  45. // Application select keys
  46. APP_SLK, // Slack
  47. APP_EMCS, // Emacs
  48. APP_TERM, // Terminal
  49. APP_CHRM, // Chrome
  50. APP_MSIC, // Music
  51. // Diagonal mouse movement
  52. A_MUL,
  53. A_MUR,
  54. A_MDL,
  55. A_MDR,
  56. // Hungarian layer keys
  57. HU_AA, // Á
  58. HU_OO, // Ó
  59. HU_EE, // É
  60. HU_UU, // Ú
  61. HU_II, // Í
  62. HU_OE, // Ö
  63. HU_UE, // Ü
  64. HU_OEE, // Ő
  65. HU_UEE, // Ű
  66. // One-handed layout specials
  67. OH_BSSPC,
  68. OH_ENTSFT,
  69. OH_BASE,
  70. OH_LEFT,
  71. OH_RIGHT,
  72. };
  73. /* Fn keys */
  74. enum {
  75. F_BSE = 0,
  76. F_HUN,
  77. F_GUI,
  78. F_SFT,
  79. F_ALT,
  80. F_CTRL
  81. };
  82. /* Custom keycodes */
  83. enum {
  84. CT_CLN = 0,
  85. CT_MNS,
  86. CT_TA,
  87. };
  88. /* States & timers */
  89. uint16_t gui_timer = 0;
  90. uint16_t kf_timers[12];
  91. uint16_t oh_base_timer = 0;
  92. uint16_t oh_bsspc_timer = 0;
  93. uint16_t oh_entsft_timer = 0;
  94. #define OH_BLINK_INTERVAL 500
  95. uint8_t oh_left_blink = 0;
  96. uint16_t oh_left_blink_timer = 0;
  97. uint8_t oh_right_blink = 0;
  98. uint16_t oh_right_blink_timer = 0;
  99. #if KEYLOGGER_ENABLE
  100. bool log_enable = false;
  101. #endif
  102. bool time_travel = false;
  103. /* The Keymap */
  104. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  105. /* Keymap 0: Base Layer
  106. *
  107. * ,-----------------------------------------------------. ,-----------------------------------------------------.
  108. * | `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr | | Apps | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10| F11 |
  109. * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
  110. * | Next/Prev | ' | , | . | P | Y | [ | | ] | F | G | C | R | L | \ |
  111. * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
  112. * | Tab/ARROW | A | O | E | U | I |------| |------| D | H | T | N | S | = / Arrow |
  113. * |-----------+------+------+------+------+------| ( | | ) |------+------+------+------+------+-----------|
  114. * | Play/Pause| / | Q | J | K | X | | | | B | M | W | V | Z | Stop |
  115. * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
  116. * | | | | | : | | - | | | | |
  117. * `-----------------------------------' `-----------------------------------'
  118. * ,-------------. ,-------------.
  119. * | LAlt | GUI | | MDIA | 1HND |
  120. * ,------|------|------| |------+------+------.
  121. * | | | Ctrl | | LEAD | | |
  122. * |Backsp|LShift|------| |------| Enter| Space|
  123. * | | | ESC | | HUN | | |
  124. * `--------------------' `--------------------'
  125. */
  126. [BASE] = KEYMAP(
  127. // left hand
  128. KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR)
  129. ,M(A_MPN) ,KC_QUOT ,KC_COMM ,KC_DOT ,KC_P ,KC_Y ,KC_LBRC
  130. ,TD(CT_TA) ,KC_A ,KC_O ,KC_E ,KC_U ,KC_I
  131. ,KC_MPLY ,KC_SLSH ,KC_Q ,KC_J ,KC_K ,KC_X ,KC_LPRN
  132. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN)
  133. ,F(F_ALT),F(F_GUI)
  134. ,F(F_CTRL)
  135. ,KC_BSPC,F(F_SFT),M(A_ESC)
  136. // right hand
  137. ,KC_APP ,M(KF_6),M(KF_7) ,M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11
  138. ,KC_RBRC ,KC_F ,KC_G ,KC_C ,KC_R ,KC_L ,KC_BSLS
  139. ,KC_D ,KC_H ,KC_T ,KC_N ,KC_S ,KC_EQL
  140. ,KC_RPRN ,KC_B ,KC_M ,KC_W ,KC_V ,KC_Z ,KC_MSTP
  141. ,TD(CT_MNS),KC_NO ,KC_NO ,KC_NO ,KC_NO
  142. ,OSL(NMDIA),M(OH_LEFT)
  143. ,KC_LEAD
  144. ,F(F_HUN) ,KC_ENT ,KC_SPC
  145. ),
  146. /* Keymap 1: Adore layer
  147. *
  148. * ,-----------------------------------------------------. ,-----------------------------------------------------.
  149. * | `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr | | Apps | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10| F11 |
  150. * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
  151. * | Next/Prev | , | . | L | W | M | [ | | ] | F | H | C | P | Y | \ |
  152. * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
  153. * | Tab/Arrow | A | O | E | I | U |------| |------| D | R | T | N | S | = / Arrow |
  154. * |-----------+------+------+------+------+------| ( | | ) |------+------+------+------+------+-----------|
  155. * | Play/Pause| / | Z | ' | K | X | | | | B | G | V | J | Q | Stop |
  156. * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
  157. * | | | | | : | | - | | | | |
  158. * `-----------------------------------' `-----------------------------------'
  159. * ,-------------. ,-------------.
  160. * | LAlt | GUI | | MDIA | 1HND |
  161. * ,------|------|------| |------+------+------.
  162. * | | | Ctrl | | LEAD | | |
  163. * |Backsp|LShift|------| |------| Enter| Space|
  164. * | | | ESC | | HUN | | |
  165. * `--------------------' `--------------------'
  166. */
  167. [ADORE] = KEYMAP(
  168. // left hand
  169. KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR)
  170. ,M(A_MPN) ,KC_COMM ,KC_DOT ,KC_L ,KC_W ,KC_M ,KC_LBRC
  171. ,TD(CT_TA) ,KC_A ,KC_O ,KC_E ,KC_I ,KC_U
  172. ,KC_MPLY ,KC_SLSH ,KC_Z ,KC_QUOT,KC_K ,KC_X ,KC_LPRN
  173. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN)
  174. ,F(F_ALT),F(F_GUI)
  175. ,F(F_CTRL)
  176. ,KC_BSPC,F(F_SFT),M(A_ESC)
  177. // right hand
  178. ,KC_APP ,M(KF_6),M(KF_7) ,M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11
  179. ,KC_RBRC ,KC_F ,KC_H ,KC_C ,KC_P ,KC_Y ,KC_BSLS
  180. ,KC_D ,KC_R ,KC_T ,KC_N ,KC_S ,KC_EQL
  181. ,KC_RPRN ,KC_B ,KC_G ,KC_V ,KC_J ,KC_Q ,KC_MSTP
  182. ,TD(CT_MNS),KC_NO ,KC_NO ,KC_NO ,KC_NO
  183. ,OSL(NMDIA),M(OH_LEFT)
  184. ,KC_LEAD
  185. ,F(F_HUN) ,KC_ENT ,KC_SPC
  186. ),
  187. /* Keymap 2: Arrow layer
  188. *
  189. * ,-----------------------------------------------------. ,-----------------------------------------------------.
  190. * | | | | | | | | | | | | | | | |
  191. * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
  192. * | | | | | | | | | | | Home | Up | End | | |
  193. * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
  194. * | | | | | | |------| |------| | Left | Down | Rght | | |
  195. * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
  196. * | | | | | | | | | | | | | | | |
  197. * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
  198. * | | | | | | | | | | | |
  199. * `----------------------------------' `----------------------------------'
  200. * ,-------------. ,-------------.
  201. * | | | | | |
  202. * ,------|------|------| |------+------+------.
  203. * | | | | | | | |
  204. * | | |------| |------| PgUp | PgDn |
  205. * | | | | | | | |
  206. * `--------------------' `--------------------'
  207. */
  208. [ARRW] = KEYMAP(
  209. // left hand
  210. KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  211. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  212. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  213. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  214. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  215. ,KC_TRNS ,KC_TRNS
  216. ,KC_TRNS
  217. ,KC_TRNS ,KC_TRNS ,KC_TRNS
  218. // right hand
  219. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  220. ,KC_TRNS ,KC_TRNS ,KC_HOME ,KC_UP ,KC_END ,KC_TRNS ,KC_TRNS
  221. ,KC_TRNS ,KC_LEFT ,KC_DOWN ,KC_RGHT ,KC_TRNS ,KC_TRNS
  222. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  223. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  224. ,KC_TRNS ,KC_TRNS
  225. ,KC_TRNS
  226. ,KC_TRNS ,KC_PGUP ,KC_PGDN
  227. ),
  228. /* Keymap 3: Application select layer
  229. *
  230. * ,-----------------------------------------------------. ,-----------------------------------------------------.
  231. * | |Music |Slack |Emacs |Term |Chrome| | | | | | | | | |
  232. * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
  233. * | | | | | | | | | | | | | | | |
  234. * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
  235. * | | | | | | |------| |------| | | | | | |
  236. * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
  237. * | | | | | | | | | | | | | | | |
  238. * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
  239. * | | | | | | | | | | | |
  240. * `----------------------------------' `----------------------------------'
  241. * ,-------------. ,-------------.
  242. * | | | | | |
  243. * ,------|------|------| |------+------+------.
  244. * | | | | | | | |
  245. * | | |------| |------| | |
  246. * | | | | | | | |
  247. * `--------------------' `--------------------'
  248. */
  249. [APPSEL] = KEYMAP(
  250. // left hand
  251. KC_TRNS ,M(APP_MSIC),M(APP_SLK),M(APP_EMCS),M(APP_TERM),M(APP_CHRM),KC_TRNS
  252. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  253. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  254. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  255. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  256. ,KC_TRNS ,KC_TRNS
  257. ,KC_TRNS
  258. ,KC_TRNS ,KC_TRNS ,KC_TRNS
  259. // right hand
  260. ,KC_TRNS ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_TRNS
  261. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  262. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  263. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  264. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  265. ,KC_TRNS ,KC_TRNS
  266. ,KC_TRNS
  267. ,KC_TRNS ,KC_TRNS ,KC_TRNS
  268. ),
  269. /* Keymap 4: Hungarian Layer
  270. *
  271. * ,-----------------------------------------------------. ,-----------------------------------------------------.
  272. * | | | | | | | | | | | | | | | |
  273. * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
  274. * | | | Ő | | Ű | | | | | | | | | | |
  275. * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
  276. * | | Á | Ó | É | Ú | Í |------| |------| | | | | | |
  277. * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
  278. * | | | Ö | | Ü | | | | | | | | | | |
  279. * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
  280. * | | | | | | | | | | | |
  281. * `----------------------------------' `----------------------------------'
  282. * ,-------------. ,-------------.
  283. * | | | | | |
  284. * ,------|------|------| |------+------+------.
  285. * | | | | | | | |
  286. * | | |------| |------| | |
  287. * | | | | | BASE | | |
  288. * `--------------------' `--------------------'
  289. */
  290. [HUN] = KEYMAP(
  291. // left hand
  292. KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  293. ,KC_NO ,KC_NO ,M(HU_OEE),KC_NO ,M(HU_UEE),KC_NO ,KC_NO
  294. ,KC_NO ,M(HU_AA),M(HU_OO) ,M(HU_EE),M(HU_UU) ,M(HU_II)
  295. ,KC_NO ,KC_NO ,M(HU_OE) ,KC_NO ,M(HU_UE) ,KC_NO ,KC_NO
  296. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  297. ,KC_NO ,KC_NO
  298. ,KC_NO
  299. ,KC_NO ,KC_TRNS ,KC_TRNS
  300. // right hand
  301. ,KC_TRNS ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  302. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  303. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  304. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  305. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  306. ,KC_NO ,KC_NO
  307. ,KC_NO
  308. ,F(F_BSE),KC_TRNS ,KC_TRNS
  309. ),
  310. /* Keymap 5: Navigation & Media layer
  311. *
  312. * ,-----------------------------------------------------. ,-----------------------------------------------------.
  313. * | MS Slow | | | | | |ScrLCK| |ScrLCK| | | | | | |
  314. * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
  315. * | MS Normal | | Home | Up | PgUp | | | |Scroll| |MsUpL | MsUp |MsUpR | |PrintScreen|
  316. * |-----------+------+------+------+------+------| | | Up |------+------+------+------+------+-----------|
  317. * | MS Fast | | Left | Down | Right| |------| |------| |MsLeft| MsDn |MsRght| | |
  318. * |-----------+------+------+------+------+------| | |Scroll|------+------+------+------+------+-----------|
  319. * | Play/Pause| | End | Down | PgDn | | | | Down | |MsDnL | MsDn |MsDnR | | Stop |
  320. * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
  321. * | | | | | | | | | | | |
  322. * `----------------------------------' `----------------------------------'
  323. * ,-------------. ,-------------.
  324. * | Mute | VlUp | | BASE | MClk |
  325. * ,------|------|------| |------+------+------.
  326. * | | | VlDn | | Prev |Left |Right |
  327. * | SPC | Enter|------| |------| Click| Click|
  328. * | | | ESC | | Next | | |
  329. * `--------------------' `--------------------'
  330. */
  331. [NMDIA] = KEYMAP(
  332. // left hand
  333. KC_ACL0 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,LGUI(KC_L)
  334. ,KC_ACL1 ,KC_NO ,KC_HOME ,KC_UP ,KC_PGUP ,KC_NO ,KC_NO
  335. ,KC_ACL2 ,KC_NO ,KC_LEFT ,KC_DOWN ,KC_RIGHT,KC_NO
  336. ,KC_MPLY ,KC_NO ,KC_END ,KC_DOWN ,KC_PGDN ,KC_NO ,KC_NO
  337. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  338. ,KC_MUTE ,KC_VOLU
  339. ,KC_VOLD
  340. ,KC_SPC,KC_ENTER,M(A_ESC)
  341. // right hand
  342. ,LGUI(KC_L),KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  343. ,KC_WH_U ,KC_NO ,M(A_MUL),KC_MS_U ,M(A_MUR),KC_NO ,KC_PSCR
  344. ,KC_NO ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_NO ,KC_NO
  345. ,KC_WH_D ,KC_NO ,M(A_MDL),KC_MS_D ,M(A_MDR),KC_NO ,KC_MSTP
  346. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  347. ,KC_TRNS ,KC_MS_BTN3
  348. ,KC_MPRV
  349. ,KC_MNXT ,KC_BTN1 ,KC_BTN2
  350. ),
  351. /* Keymap 6: One-handed, left side
  352. *
  353. * ,-----------------------------------------------------.
  354. * | `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 |A BSE|
  355. * |-----------+------+------+------+------+-------------|
  356. * | Tab | ' | , | . | P | Y | [ |
  357. * |-----------+------+------+------+------+------| |
  358. * | - | A | O | E | U | I |------|
  359. * |-----------+------+------+------+------+------| ( |
  360. * | Play/Pause| ; | Q | J | K | X | |
  361. * `-----------+------+------+------+------+-------------'
  362. * | Home | End | Down | Up | ESC |
  363. * `-----------------------------------'
  364. * ,-------------.
  365. * | LAlt | GUI |
  366. * ,------|------|------|
  367. * |BackSp|LShift| Ctrl |
  368. * | | |------|
  369. * |Space |Enter |OTHER |
  370. * `--------------------'
  371. */
  372. [OHLFT] = KEYMAP(
  373. // left hand
  374. KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3) ,M(KF_4) ,M(KF_5) ,M(OH_BASE)
  375. ,KC_TAB ,KC_QUOT ,KC_COMM ,KC_DOT ,KC_P ,KC_Y ,KC_LBRC
  376. ,KC_MINS ,KC_A ,KC_O ,KC_E ,KC_U ,KC_I
  377. ,KC_MPLY ,KC_SCLN ,KC_Q ,KC_J ,KC_K ,KC_X ,KC_LPRN
  378. ,KC_HOME ,KC_END ,KC_DOWN ,KC_UP ,M(A_ESC)
  379. ,KC_TRNS ,KC_TRNS
  380. ,KC_TRNS
  381. ,M(OH_BSSPC),M(OH_ENTSFT),M(OH_RIGHT)
  382. // right hand
  383. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  384. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  385. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  386. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  387. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  388. ,KC_NO ,KC_NO
  389. ,KC_NO
  390. ,KC_NO ,KC_NO ,KC_NO
  391. ),
  392. /* Keymap 7: One-handed, right side
  393. *
  394. * ,-----------------------------------------------------.
  395. * | = F11 | 0 F10| 9 F9 | 8 F8 | 7 F7 | 6 F6 |A BSE|
  396. * |-----------+------+------+------+------+-------------|
  397. * | / | L | R | C | G | F | ] |
  398. * |-----------+------+------+------+------+------| |
  399. * | \ | S | N | T | H | D |------|
  400. * |-----------+------+------+------+------+------| ) |
  401. * | Stop | Z | V | W | M | B | |
  402. * `-----------+------+------+------+------+-------------'
  403. * | PgDn | PgUp | Right| Left | ESC |
  404. * `-----------------------------------'
  405. * ,-------------.
  406. * | LAlt | GUI |
  407. * ,------|------|------|
  408. * |BackSp|LShift| Ctrl |
  409. * | | |------|
  410. * |Space |Enter |OTHER |
  411. * `--------------------'
  412. */
  413. [OHRGT] = KEYMAP(
  414. // left hand
  415. M(KF_11) ,M(KF_10) ,M(KF_9) ,M(KF_8) ,M(KF_7) ,M(KF_6) ,M(OH_BASE)
  416. ,KC_SLSH ,KC_L ,KC_R ,KC_C ,KC_G ,KC_F ,KC_RBRC
  417. ,KC_BSLS ,KC_S ,KC_N ,KC_T ,KC_H ,KC_D
  418. ,KC_MSTP ,KC_Z ,KC_V ,KC_W ,KC_M ,KC_B ,KC_RPRN
  419. ,KC_PGDN ,KC_PGUP ,KC_RGHT ,KC_LEFT ,M(A_ESC)
  420. ,KC_TRNS ,KC_TRNS
  421. ,KC_TRNS
  422. ,M(OH_BSSPC),M(OH_ENTSFT),M(OH_LEFT)
  423. // right hand
  424. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  425. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  426. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  427. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  428. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  429. ,KC_NO ,KC_NO
  430. ,KC_NO
  431. ,KC_NO ,KC_NO ,KC_NO
  432. ),
  433. /* Keymap 8: Steno for Plover
  434. *
  435. * ,--------------------------------------------------. ,--------------------------------------------------.
  436. * | | | | | | | BASE | | | | | | | | |
  437. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  438. * | | # | # | # | # | # | # | | # | # | # | # | # | # | # |
  439. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  440. * | | | T | P | H | |------| |------| | F | P | L | T | D |
  441. * |--------+ S +------+------+------+ * | * | | * | * +------+------+------+------+--------|
  442. * | | | K | W | R | | | | | | R | B | G | S | Z |
  443. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  444. * | | | | | | | | | | | |
  445. * `----------------------------------' `----------------------------------'
  446. * ,-------------. ,-------------.
  447. * | | | | | |
  448. * ,------|------|------| |------+------+------.
  449. * | | | | | | | |
  450. * | A | O |------| |------| E | U |
  451. * | | | | | | | |
  452. * `--------------------' `--------------------'
  453. */
  454. [PLVR] = KEYMAP(
  455. // left hand
  456. KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, M(A_PLVR),
  457. KC_NO, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM,
  458. KC_NO, PV_LS, PV_LT, PV_LP, PV_LH, PV_STAR,
  459. KC_NO, PV_LS, PV_LK, PV_LW, PV_LR, PV_STAR, PV_STAR,
  460. KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
  461. KC_NO, KC_NO,
  462. KC_NO,
  463. PV_A, PV_O, KC_NO,
  464. // right hand
  465. KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
  466. PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM,
  467. PV_STAR, PV_RF, PV_RP, PV_RL, PV_RT, PV_RD,
  468. PV_STAR, PV_STAR, PV_RR, PV_RB, PV_RG, PV_RS, PV_RZ,
  469. KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
  470. KC_NO, KC_NO,
  471. KC_NO,
  472. KC_NO,PV_E, PV_U
  473. ),
  474. };
  475. const uint16_t PROGMEM fn_actions[] = {
  476. [F_BSE] = ACTION_LAYER_CLEAR(ON_PRESS)
  477. ,[F_HUN] = ACTION_LAYER_INVERT(HUN, ON_PRESS)
  478. ,[F_GUI] = ACTION_MACRO_TAP(A_GUI)
  479. ,[F_SFT] = ACTION_MODS_ONESHOT (MOD_LSFT)
  480. ,[F_ALT] = ACTION_MODS_ONESHOT (MOD_LALT)
  481. ,[F_CTRL] = ACTION_MODS_ONESHOT (MOD_LCTL)
  482. };
  483. void toggle_steno(int pressed)
  484. {
  485. uint8_t layer = biton32(layer_state);
  486. if (pressed) {
  487. if (layer != PLVR) layer_on(PLVR); else layer_off(PLVR);
  488. register_code(PV_LP);
  489. register_code(PV_LH);
  490. register_code(PV_LR);
  491. register_code(PV_O);
  492. register_code(PV_RL);
  493. register_code(PV_RG);
  494. } else {
  495. unregister_code(PV_LP);
  496. unregister_code(PV_LH);
  497. unregister_code(PV_LR);
  498. unregister_code(PV_O);
  499. unregister_code(PV_RL);
  500. unregister_code(PV_RG);
  501. }
  502. }
  503. macro_t *ang_do_hun (keyrecord_t *record, uint16_t accent, uint16_t hun_char)
  504. {
  505. uint8_t need_shift = 0;
  506. uint8_t hold_shift = 0;
  507. if (!record->event.pressed)
  508. return MACRO_NONE;
  509. layer_off (HUN);
  510. if (keyboard_report->mods & MOD_BIT (KC_LSFT)) {
  511. hold_shift = 1;
  512. need_shift = 1;
  513. unregister_code (KC_LSFT);
  514. }
  515. if ((get_oneshot_mods () & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out ()) {
  516. need_shift = 1;
  517. hold_shift = 0;
  518. unregister_code (KC_LSFT);
  519. }
  520. clear_oneshot_mods ();
  521. register_code (KC_RALT);
  522. unregister_code (KC_RALT);
  523. if (accent == (KC_DQT)) {
  524. register_code (KC_RSFT);
  525. }
  526. register_code (accent);
  527. unregister_code (accent);
  528. if (need_shift && accent != (KC_DQT)) {
  529. register_code (KC_RSFT);
  530. } else if (accent == (KC_DQT) && !need_shift) {
  531. unregister_code (KC_RSFT);
  532. }
  533. register_code (hun_char);
  534. unregister_code (hun_char);
  535. if (need_shift || accent == (KC_DQT))
  536. unregister_code (KC_RSFT);
  537. if (hold_shift)
  538. register_code (KC_LSFT);
  539. return MACRO_NONE;
  540. }
  541. void ang_handle_kf (keyrecord_t *record, uint8_t id)
  542. {
  543. uint8_t code = id - KF_1;
  544. if (record->event.pressed) {
  545. kf_timers[code] = timer_read ();
  546. } else {
  547. uint8_t kc;
  548. if (timer_elapsed (kf_timers[code]) > TAPPING_TERM) {
  549. // Long press
  550. kc = KC_F1 + code;
  551. } else {
  552. if (id == KF_11)
  553. kc = KC_EQL;
  554. else
  555. kc = KC_1 + code;
  556. }
  557. register_code (kc);
  558. unregister_code (kc);
  559. }
  560. }
  561. const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
  562. {
  563. switch(id) {
  564. case A_ESC:
  565. if (record->event.pressed) {
  566. if ((get_oneshot_mods ()) && !has_oneshot_mods_timed_out ()) {
  567. clear_oneshot_mods ();
  568. } else {
  569. register_code (KC_ESC);
  570. }
  571. layer_off (HUN);
  572. } else {
  573. unregister_code (KC_ESC);
  574. }
  575. break;
  576. case A_MPN:
  577. if (record->event.pressed) {
  578. if (keyboard_report->mods & MOD_BIT(KC_LSFT) ||
  579. ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out())) {
  580. int oneshot = ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out());
  581. if (oneshot)
  582. clear_oneshot_mods ();
  583. unregister_code (KC_LSFT);
  584. register_code (KC_MPRV);
  585. unregister_code (KC_MPRV);
  586. if (!oneshot)
  587. register_code (KC_LSFT);
  588. } else {
  589. return MACRO (T(MNXT), END);
  590. }
  591. }
  592. break;
  593. /* Hungarian layer */
  594. case HU_AA:
  595. return ang_do_hun (record, KC_QUOT, KC_A);
  596. case HU_OO:
  597. return ang_do_hun (record, KC_QUOT, KC_O);
  598. case HU_EE:
  599. return ang_do_hun (record, KC_QUOT, KC_E);
  600. case HU_UU:
  601. return ang_do_hun (record, KC_QUOT, KC_U);
  602. case HU_II:
  603. return ang_do_hun (record, KC_QUOT, KC_I);
  604. case HU_OE:
  605. return ang_do_hun (record, KC_DQT, KC_O);
  606. case HU_UE:
  607. return ang_do_hun (record, KC_DQT, KC_U);
  608. case HU_OEE:
  609. return ang_do_hun (record, KC_EQL, KC_O);
  610. case HU_UEE:
  611. return ang_do_hun (record, KC_EQL, KC_U);
  612. /* Mouse movement */
  613. case A_MUL:
  614. if (record->event.pressed) {
  615. mousekey_on(KC_MS_UP);
  616. mousekey_on(KC_MS_LEFT);
  617. } else {
  618. mousekey_off(KC_MS_UP);
  619. mousekey_off(KC_MS_LEFT);
  620. }
  621. mousekey_send();
  622. break;
  623. case A_MUR:
  624. if (record->event.pressed) {
  625. mousekey_on(KC_MS_UP);
  626. mousekey_on(KC_MS_RIGHT);
  627. } else {
  628. mousekey_off(KC_MS_UP);
  629. mousekey_off(KC_MS_RIGHT);
  630. }
  631. mousekey_send();
  632. break;
  633. case A_MDL:
  634. if (record->event.pressed) {
  635. mousekey_on(KC_MS_DOWN);
  636. mousekey_on(KC_MS_LEFT);
  637. } else {
  638. mousekey_off(KC_MS_DOWN);
  639. mousekey_off(KC_MS_LEFT);
  640. }
  641. mousekey_send();
  642. break;
  643. case A_MDR:
  644. if (record->event.pressed) {
  645. mousekey_on(KC_MS_DOWN);
  646. mousekey_on(KC_MS_RIGHT);
  647. } else {
  648. mousekey_off(KC_MS_DOWN);
  649. mousekey_off(KC_MS_RIGHT);
  650. }
  651. mousekey_send();
  652. break;
  653. /* Plover base */
  654. case A_PLVR:
  655. toggle_steno(record->event.pressed);
  656. break;
  657. /* GUI & AppSel */
  658. case A_GUI:
  659. if (record->event.pressed) {
  660. register_code (KC_LGUI);
  661. if (record->tap.count && !record->tap.interrupted) {
  662. if (record->tap.count >= 2) {
  663. register_code (KC_W);
  664. layer_on (APPSEL);
  665. set_oneshot_layer (APPSEL, ONESHOT_START);
  666. }
  667. } else {
  668. record->tap.count = 0;
  669. }
  670. gui_timer = 0;
  671. } else {
  672. if (record->tap.count >= 2)
  673. {
  674. unregister_code (KC_W);
  675. clear_oneshot_layer_state (ONESHOT_PRESSED);
  676. }
  677. gui_timer = timer_read ();
  678. }
  679. break;
  680. case APP_SLK:
  681. return MACRODOWN(T(S), T(L), T(A), T(C), T(K), T(ENT), END);
  682. case APP_EMCS:
  683. return MACRODOWN(T(E), T(M), T(A), T(C), T(S), T(ENT), END);
  684. case APP_TERM:
  685. return MACRODOWN(T(T), T(E), T(R), T(M), T(ENT), END);
  686. case APP_CHRM:
  687. return MACRODOWN(T(C), T(H), T(R), T(O), T(M), T(ENT), END);
  688. case APP_MSIC:
  689. return MACRODOWN(T(R), T(H), T(Y), T(T), T(H), T(M), T(B), T(O), T(X), T(ENT), END);
  690. /* Function keys */
  691. case KF_1 ... KF_11:
  692. ang_handle_kf (record, id);
  693. break;
  694. /* 1HAND layout */
  695. case OH_BASE:
  696. if (record->event.pressed) {
  697. oh_base_timer = timer_read ();
  698. } else {
  699. if (timer_elapsed (oh_base_timer) > TAPPING_TERM) {
  700. layer_clear ();
  701. } else {
  702. return MACRO (T(APP), END);
  703. }
  704. }
  705. break;
  706. case OH_BSSPC:
  707. if (record->event.pressed) {
  708. oh_bsspc_timer = timer_read ();
  709. } else {
  710. if (timer_elapsed (oh_bsspc_timer) > TAPPING_TERM) {
  711. return MACRO (T(BSPC), END);
  712. } else {
  713. return MACRO (T(SPC), END);
  714. }
  715. }
  716. break;
  717. case OH_ENTSFT:
  718. if (record->event.pressed) {
  719. oh_entsft_timer = timer_read ();
  720. } else {
  721. if (timer_elapsed (oh_entsft_timer) > TAPPING_TERM) {
  722. if (keyboard_report->mods & MOD_BIT(KC_LSFT))
  723. unregister_code (KC_LSFT);
  724. else
  725. register_code (KC_LSFT);
  726. } else {
  727. return MACRO (T(ENT), END);
  728. }
  729. }
  730. break;
  731. case OH_LEFT:
  732. if (record->event.pressed) {
  733. layer_move (OHLFT);
  734. oh_left_blink = 1;
  735. oh_left_blink_timer = timer_read ();
  736. ergodox_right_led_1_on ();
  737. }
  738. break;
  739. case OH_RIGHT:
  740. if (record->event.pressed) {
  741. layer_move (OHRGT);
  742. oh_right_blink = 1;
  743. oh_right_blink_timer = timer_read ();
  744. ergodox_right_led_3_on ();
  745. }
  746. break;
  747. }
  748. return MACRO_NONE;
  749. };
  750. uint8_t is_adore = 0;
  751. // Runs just one time when the keyboard initializes.
  752. void matrix_init_user(void) {
  753. uint8_t dl;
  754. ergodox_led_all_on();
  755. for (int i = LED_BRIGHTNESS_HI; i > LED_BRIGHTNESS_LO; i--) {
  756. ergodox_led_all_set (i);
  757. _delay_ms (5);
  758. }
  759. _delay_ms(1000);
  760. for (int i = LED_BRIGHTNESS_LO; i > 0; i--) {
  761. ergodox_led_all_set (i);
  762. _delay_ms (10);
  763. }
  764. ergodox_led_all_off();
  765. if (!eeconfig_is_enabled())
  766. eeconfig_init();
  767. dl = eeconfig_read_default_layer ();
  768. if (dl == (1UL << ADORE))
  769. is_adore = 1;
  770. };
  771. LEADER_EXTERNS();
  772. void ang_do_unicode (void) {
  773. register_code (KC_RCTL);
  774. register_code (KC_RSFT);
  775. register_code (KC_U);
  776. unregister_code (KC_U);
  777. unregister_code (KC_RSFT);
  778. unregister_code (KC_RCTL);
  779. _delay_ms (100);
  780. }
  781. void ang_tap (uint16_t codes[]) {
  782. for (int i = 0; codes[i] != 0; i++) {
  783. register_code (codes[i]);
  784. unregister_code (codes[i]);
  785. _delay_ms (50);
  786. }
  787. }
  788. #define TAP_ONCE(code) \
  789. register_code (code); \
  790. unregister_code (code)
  791. void ang_tap_dance_cln_finished (qk_tap_dance_state_t *state, void *user_data) {
  792. if (state->count == 1) {
  793. register_code (KC_RSFT);
  794. register_code (KC_SCLN);
  795. } else if (state->count == 2) {
  796. register_code (KC_SCLN);
  797. }
  798. }
  799. void ang_tap_dance_cln_reset (qk_tap_dance_state_t *state, void *user_data) {
  800. if (state->count == 1) {
  801. unregister_code (KC_SCLN);
  802. unregister_code (KC_RSFT);
  803. } else if (state->count == 2) {
  804. unregister_code (KC_SCLN);
  805. }
  806. }
  807. void ang_tap_dance_mns_finished (qk_tap_dance_state_t *state, void *user_data) {
  808. if (state->count == 1) {
  809. register_code (KC_MINS);
  810. } else if (state->count == 2) {
  811. register_code (KC_RSFT);
  812. register_code (KC_MINS);
  813. }
  814. }
  815. void ang_tap_dance_mns_reset (qk_tap_dance_state_t *state, void *user_data) {
  816. if (state->count == 1) {
  817. unregister_code (KC_MINS);
  818. } else if (state->count == 2) {
  819. unregister_code (KC_RSFT);
  820. unregister_code (KC_MINS);
  821. }
  822. }
  823. typedef struct {
  824. bool layer_toggle;
  825. bool sticky;
  826. bool finished_once;
  827. } td_ta_state_t;
  828. void ang_tap_dance_ta_finished (qk_tap_dance_state_t *state, void *user_data) {
  829. td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
  830. if (td_ta->finished_once) {
  831. return;
  832. }
  833. if (td_ta->sticky) {
  834. td_ta->sticky = false;
  835. td_ta->layer_toggle = false;
  836. layer_off (ARRW);
  837. return;
  838. }
  839. td_ta->finished_once = true;
  840. if (state->count == 1 && !state->pressed) {
  841. register_code (KC_TAB);
  842. td_ta->sticky = false;
  843. td_ta->layer_toggle = false;
  844. } else {
  845. td_ta->layer_toggle = true;
  846. layer_on (ARRW);
  847. td_ta->sticky = (state->count == 2);
  848. }
  849. }
  850. void ang_tap_dance_ta_reset (qk_tap_dance_state_t *state, void *user_data) {
  851. td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
  852. if (!td_ta->layer_toggle)
  853. unregister_code (KC_TAB);
  854. if (!td_ta->sticky)
  855. layer_off (ARRW);
  856. td_ta->finished_once = false;
  857. }
  858. const qk_tap_dance_action_t tap_dance_actions[] = {
  859. [CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, ang_tap_dance_cln_finished, ang_tap_dance_cln_reset)
  860. ,[CT_MNS] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, ang_tap_dance_mns_finished, ang_tap_dance_mns_reset)
  861. ,[CT_TA] = {
  862. .fn = { NULL, ang_tap_dance_ta_finished, ang_tap_dance_ta_reset },
  863. .user_data = (void *)&((td_ta_state_t) { false, false, false })
  864. }
  865. };
  866. // Runs constantly in the background, in a loop.
  867. void matrix_scan_user(void) {
  868. uint8_t layer = biton32(layer_state);
  869. if (gui_timer && timer_elapsed (gui_timer) > TAPPING_TERM)
  870. unregister_code (KC_LGUI);
  871. if (layer != OHLFT)
  872. oh_left_blink = 0;
  873. if (layer != OHRGT)
  874. oh_right_blink = 0;
  875. if (layer == HUN) {
  876. ergodox_right_led_2_on();
  877. ergodox_right_led_3_on();
  878. } else if (layer == NMDIA) {
  879. ergodox_right_led_1_on();
  880. ergodox_right_led_2_on();
  881. } else if (layer == PLVR) {
  882. ergodox_right_led_1_on ();
  883. ergodox_right_led_2_on ();
  884. ergodox_right_led_3_on ();
  885. } else if (layer == ADORE) {
  886. ergodox_right_led_1_on ();
  887. ergodox_right_led_2_on ();
  888. ergodox_right_led_3_on ();
  889. ergodox_right_led_2_set (LED_BRIGHTNESS_HI);
  890. }
  891. if (layer == OHLFT || layer == OHRGT) {
  892. ergodox_right_led_2_on();
  893. if (oh_left_blink) {
  894. if (timer_elapsed (oh_left_blink_timer) > OH_BLINK_INTERVAL) {
  895. if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) == 0)
  896. ergodox_right_led_1_off ();
  897. }
  898. if (timer_elapsed (oh_left_blink_timer) > OH_BLINK_INTERVAL * 2) {
  899. ergodox_right_led_1_on ();
  900. oh_left_blink_timer = timer_read ();
  901. }
  902. }
  903. if (oh_right_blink) {
  904. if (timer_elapsed (oh_right_blink_timer) > OH_BLINK_INTERVAL) {
  905. if ((keyboard_report->mods & MOD_BIT(KC_LCTRL)) == 0)
  906. ergodox_right_led_3_off ();
  907. }
  908. if (timer_elapsed (oh_right_blink_timer) > OH_BLINK_INTERVAL * 2) {
  909. ergodox_right_led_3_on ();
  910. oh_right_blink_timer = timer_read ();
  911. }
  912. }
  913. }
  914. if (keyboard_report->mods & MOD_BIT(KC_LSFT) ||
  915. ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out())) {
  916. ergodox_right_led_1_set (LED_BRIGHTNESS_HI);
  917. ergodox_right_led_1_on ();
  918. } else {
  919. ergodox_right_led_1_set (LED_BRIGHTNESS_LO);
  920. if (layer != OHLFT && layer != NMDIA && layer != PLVR && layer != ADORE)
  921. ergodox_right_led_1_off ();
  922. }
  923. if (keyboard_report->mods & MOD_BIT(KC_LALT) ||
  924. ((get_oneshot_mods() & MOD_BIT(KC_LALT)) && !has_oneshot_mods_timed_out())) {
  925. ergodox_right_led_2_set (LED_BRIGHTNESS_HI);
  926. ergodox_right_led_2_on ();
  927. } else {
  928. ergodox_right_led_2_set (LED_BRIGHTNESS_LO);
  929. if (layer != OHRGT && layer != HUN && layer != OHLFT && layer != NMDIA && layer != PLVR && layer != ADORE)
  930. ergodox_right_led_2_off ();
  931. }
  932. if (keyboard_report->mods & MOD_BIT(KC_LCTRL) ||
  933. ((get_oneshot_mods() & MOD_BIT(KC_LCTRL)) && !has_oneshot_mods_timed_out())) {
  934. ergodox_right_led_3_set (LED_BRIGHTNESS_HI);
  935. ergodox_right_led_3_on ();
  936. } else {
  937. ergodox_right_led_3_set (LED_BRIGHTNESS_LO);
  938. if (layer != OHRGT && layer != HUN && layer != PLVR && layer != ADORE)
  939. ergodox_right_led_3_off ();
  940. }
  941. LEADER_DICTIONARY() {
  942. leading = false;
  943. leader_end ();
  944. #if KEYLOGGER_ENABLE
  945. SEQ_ONE_KEY (KC_D) {
  946. ergodox_led_all_on();
  947. _delay_ms(100);
  948. ergodox_led_all_off();
  949. log_enable = !log_enable;
  950. }
  951. #endif
  952. SEQ_ONE_KEY (KC_T) {
  953. time_travel = !time_travel;
  954. }
  955. SEQ_ONE_KEY (KC_U) {
  956. ang_do_unicode ();
  957. }
  958. SEQ_ONE_KEY (KC_V) {
  959. SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ (" QMK_VERSION "/" KEYMAP_VERSION ")");
  960. }
  961. SEQ_ONE_KEY (KC_L) {
  962. /* λ */
  963. ang_do_unicode ();
  964. uint16_t codes[] = {KC_0, KC_3, KC_B, KC_B, KC_ENT, 0};
  965. ang_tap (codes);
  966. }
  967. SEQ_ONE_KEY (KC_Y) {
  968. uint16_t codes[] = {KC_BSLS, KC_O, KC_SLSH, 0};
  969. ang_tap (codes);
  970. }
  971. SEQ_ONE_KEY (KC_S) {
  972. ang_do_unicode (); TAP_ONCE (KC_A); TAP_ONCE (KC_F); TAP_ONCE (KC_SPC);
  973. TAP_ONCE (KC_BSLS);
  974. register_code (KC_RSFT); TAP_ONCE (KC_MINS); TAP_ONCE (KC_9); unregister_code (KC_RSFT);
  975. ang_do_unicode (); TAP_ONCE (KC_3); TAP_ONCE (KC_0); TAP_ONCE (KC_C); TAP_ONCE (KC_4); TAP_ONCE (KC_SPC);
  976. register_code (KC_RSFT); TAP_ONCE (KC_0); TAP_ONCE (KC_MINS); unregister_code (KC_RSFT);
  977. TAP_ONCE (KC_SLSH);
  978. ang_do_unicode (); TAP_ONCE (KC_A); TAP_ONCE (KC_F); TAP_ONCE (KC_SPC);
  979. }
  980. SEQ_TWO_KEYS (KC_W, KC_M) {
  981. register_code (KC_LALT);
  982. register_code (KC_F2);
  983. unregister_code (KC_F2);
  984. unregister_code (KC_LALT);
  985. _delay_ms (1000);
  986. uint16_t codes[] = {KC_M, KC_A, KC_X, KC_MINS, KC_F, KC_O, KC_C, KC_U, KC_S, KC_E, KC_D, KC_ENT, 0};
  987. ang_tap (codes);
  988. register_code (KC_LGUI);
  989. register_code (KC_UP);
  990. unregister_code (KC_UP);
  991. unregister_code (KC_LGUI);
  992. }
  993. SEQ_ONE_KEY (KC_A) {
  994. if (is_adore == 0) {
  995. default_layer_and (0);
  996. default_layer_or ((1UL << ADORE));
  997. eeconfig_update_default_layer ((1UL << ADORE));
  998. is_adore = 1;
  999. ergodox_led_all_off ();
  1000. ergodox_right_led_3_on ();
  1001. _delay_ms (100);
  1002. ergodox_right_led_2_on ();
  1003. _delay_ms (100);
  1004. ergodox_right_led_3_off ();
  1005. ergodox_right_led_1_on ();
  1006. _delay_ms (100);
  1007. ergodox_right_led_2_off ();
  1008. _delay_ms (100);
  1009. ergodox_right_led_1_off ();
  1010. } else {
  1011. is_adore = 0;
  1012. default_layer_and (0);
  1013. default_layer_or (1UL << BASE);
  1014. eeconfig_update_default_layer ((1UL << BASE));
  1015. ergodox_led_all_off ();
  1016. ergodox_right_led_1_on ();
  1017. _delay_ms (100);
  1018. ergodox_right_led_2_on ();
  1019. _delay_ms (100);
  1020. ergodox_right_led_1_off ();
  1021. ergodox_right_led_3_on ();
  1022. _delay_ms (100);
  1023. ergodox_right_led_2_off ();
  1024. _delay_ms (100);
  1025. ergodox_right_led_3_off ();
  1026. }
  1027. }
  1028. }
  1029. }
  1030. static uint16_t last4[4];
  1031. bool process_record_user (uint16_t keycode, keyrecord_t *record) {
  1032. #if KEYLOGGER_ENABLE
  1033. uint8_t layer = biton32(layer_state);
  1034. if (log_enable && layer == BASE) {
  1035. xprintf ("KL: col=%d, row=%d\n", record->event.key.col,
  1036. record->event.key.row);
  1037. }
  1038. #endif
  1039. if (time_travel && !record->event.pressed) {
  1040. uint8_t p;
  1041. // shift cache one to the left
  1042. for (p = 0; p < 3; p++) {
  1043. last4[p] = last4[p + 1];
  1044. }
  1045. last4[3] = keycode;
  1046. if (last4[0] == KC_D && last4[1] == KC_A && last4[2] == KC_T && last4[3] == KC_E) {
  1047. uint16_t codes[] = {KC_E, KC_SPC, KC_MINS, KC_D, KC_SPC, KC_QUOT, 0};
  1048. ang_tap (codes);
  1049. register_code (KC_RSFT);
  1050. register_code (KC_EQL);
  1051. unregister_code (KC_EQL);
  1052. unregister_code (KC_RSFT);
  1053. uint16_t codes2[] = {KC_4, KC_SPC, KC_D, KC_A, KC_Y, KC_S, KC_QUOT, 0};
  1054. ang_tap (codes2);
  1055. return false;
  1056. }
  1057. }
  1058. return true;
  1059. }