keymap.c 41 KB

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