keymap.c 50 KB

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