2
0

keymap.c 50 KB

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