keymap.c 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932
  1. /*
  2. * algernon's ErgoDox EZ layout, please see the README.md file!
  3. */
  4. #include "ergodox_ez.h"
  5. #include "led.h"
  6. #include "debug.h"
  7. #include "action_layer.h"
  8. #include "action_util.h"
  9. #include "mousekey.h"
  10. #include "timer.h"
  11. /* Layers */
  12. #define BASE 0 // default layer
  13. #define APPSEL 1 // application select layer
  14. #define HUN 2 // Hungarian layer
  15. #define EMACS 3 // (Spac)Emacs layer
  16. #define OHLFT 4 // One-handed, left side
  17. #define OHRGT 5 // One-handed, right side
  18. /* Macros */
  19. #define A_GUI 0 // GUI magic
  20. #define A_ESC 44 // OSM-clearing ESC
  21. #define A_MUL 1 // mouse up-left
  22. #define A_MUR 2 // mouse up-right
  23. #define A_MDL 3 // mouse down-left
  24. #define A_MDR 4 // mouse down-right
  25. #define AE_VIS 5 // Visual mode
  26. #define AE_PSTDEL 6 // Paste/Delete
  27. #define AE_CPYC 7 // Copy/Cut
  28. #define AE_EMACS 8 // Emacs copy & paste mode
  29. #define AE_TERM 9 // Terminal copy & paste mode
  30. #define AE_OTHER 10 // Other copy & paste mode
  31. #define AE_INS 11 // Insert mode
  32. #define AE_OVR 12 // Overwrite mode
  33. #define AE_APPND 13 // Append
  34. #define HU_AA 14 // Á
  35. #define HU_OO 15 // Ó
  36. #define HU_EE 16 // É
  37. #define HU_UU 17 // Ú
  38. #define HU_II 18 // Í
  39. #define HU_OE 19 // Ö
  40. #define HU_UE 20 // Ü
  41. #define HU_OEE 21 // Ő
  42. #define HU_UEE 22 // Ű
  43. #define APP_SLK 23 // Slack
  44. #define APP_EMCS 24 // Emacs
  45. #define APP_TERM 25 // Terminal
  46. #define APP_CHRM 26 // Chrome
  47. #define APP_MSIC 27 // Music
  48. #define KF_1 28 // 1, F1
  49. #define KF_2 29 // 2, F2
  50. #define KF_3 30 // ...
  51. #define KF_4 31
  52. #define KF_5 32
  53. #define KF_6 33
  54. #define KF_7 34
  55. #define KF_8 35
  56. #define KF_9 36
  57. #define KF_10 37
  58. #define KF_11 38 // =, F11
  59. #define OH_BSSPC 39
  60. #define OH_ENTSFT 40
  61. #define OH_BASE 41
  62. #define OH_LEFT 42
  63. #define OH_RIGHT 43
  64. /* Fn keys */
  65. #define F_BSE 0
  66. #define F_HUN 1
  67. #define F_GUI 2
  68. #define F_SFT 3
  69. #define F_ALT 4
  70. #define F_CTRL 5
  71. /* States & timers */
  72. uint8_t m_visual_state = 0;
  73. static uint16_t m_cutdel_timer;
  74. static uint16_t m_copypaste_timer;
  75. uint16_t gui_timer = 0;
  76. uint16_t kf_timers[12];
  77. uint16_t oh_base_timer = 0;
  78. uint16_t oh_bsspc_timer = 0;
  79. uint16_t oh_entsft_timer = 0;
  80. #define OH_BLINK_INTERVAL 500
  81. uint8_t oh_left_blink = 0;
  82. uint16_t oh_left_blink_timer = 0;
  83. uint8_t oh_right_blink = 0;
  84. uint16_t oh_right_blink_timer = 0;
  85. enum {
  86. CP_EMACS = 0,
  87. CP_TERM = 1,
  88. CP_OTHER = 2,
  89. };
  90. uint8_t cp_mode = CP_EMACS;
  91. /* The Keymap */
  92. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  93. /* Keymap 0: Base Layer
  94. *
  95. * ,-----------------------------------------------------. ,-----------------------------------------------------.
  96. * | `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Apps | | Apps | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10| = F11 |
  97. * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
  98. * | Tab | ' | , | . | P | Y | [ | | ] | F | G | C | R | L | / |
  99. * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
  100. * | - | A | O | E | U | I |------| |------| D | H | T | N | S | \ |
  101. * |-----------+------+------+------+------+------| ( | | ) |------+------+------+------+------+-----------|
  102. * | Play/Pause| ; | Q | J | K | X | | | | B | M | W | V | Z | Stop |
  103. * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
  104. * | Home | End | Down | Up | : | | - | Left | Right| PgUp | PgDn |
  105. * `-----------------------------------' `-----------------------------------'
  106. * ,-------------. ,-------------.
  107. * | LAlt | GUI | |EMACS | 1HND |
  108. * ,------|------|------| |------+------+------.
  109. * | | | Ctrl | | LEAD | | |
  110. * |Backsp|LShift|------| |------| Enter| Space|
  111. * | | | ESC | | HUN | | |
  112. * `--------------------' `--------------------'
  113. */
  114. [BASE] = KEYMAP(
  115. // left hand
  116. KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),KC_APP
  117. ,KC_TAB ,KC_QUOT ,KC_COMM ,KC_DOT ,KC_P ,KC_Y ,KC_LBRC
  118. ,KC_MINS ,KC_A ,KC_O ,KC_E ,KC_U ,KC_I
  119. ,KC_MPLY ,KC_SCLN ,KC_Q ,KC_J ,KC_K ,KC_X ,KC_LPRN
  120. ,KC_HOME ,KC_END ,KC_DOWN ,KC_UP ,KC_COLN
  121. ,F(F_ALT),F(F_GUI)
  122. ,F(F_CTRL)
  123. ,KC_BSPC,F(F_SFT),M(A_ESC)
  124. // right hand
  125. ,KC_APP ,M(KF_6),M(KF_7),M(KF_8),M(KF_9) ,M(KF_10) ,M(KF_11)
  126. ,KC_RBRC ,KC_F ,KC_G ,KC_C ,KC_R ,KC_L ,KC_SLSH
  127. ,KC_D ,KC_H ,KC_T ,KC_N ,KC_S ,KC_BSLS
  128. ,KC_RPRN ,KC_B ,KC_M ,KC_W ,KC_V ,KC_Z ,KC_MSTP
  129. ,KC_MINS,KC_LEFT,KC_RGHT ,KC_PGUP ,KC_PGDN
  130. ,OSL(EMACS),M(OH_LEFT)
  131. ,KC_LEAD
  132. ,F(F_HUN),KC_ENT ,KC_SPC
  133. ),
  134. /* Keymap 1: Application select layer
  135. *
  136. * ,-----------------------------------------------------. ,-----------------------------------------------------.
  137. * | |Music |Slack |Emacs |Term |Chrome| | | | | | | | | |
  138. * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
  139. * | | | | | | | | | | | | | | | |
  140. * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
  141. * | | | | | | |------| |------| | | | | | |
  142. * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
  143. * | | | | | | | | | | | | | | | |
  144. * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
  145. * | | | | | | | | | | | |
  146. * `----------------------------------' `----------------------------------'
  147. * ,-------------. ,-------------.
  148. * | | | | | |
  149. * ,------|------|------| |------+------+------.
  150. * | | | | | | | |
  151. * | | |------| |------| | |
  152. * | | | | | | | |
  153. * `--------------------' `--------------------'
  154. */
  155. [APPSEL] = KEYMAP(
  156. // left hand
  157. KC_TRNS ,M(APP_MSIC),M(APP_SLK),M(APP_EMCS),M(APP_TERM),M(APP_CHRM),KC_TRNS
  158. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  159. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  160. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  161. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  162. ,KC_TRNS ,KC_TRNS
  163. ,KC_TRNS
  164. ,KC_TRNS ,KC_TRNS ,KC_TRNS
  165. // right hand
  166. ,KC_TRNS ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_TRNS
  167. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  168. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  169. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  170. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  171. ,KC_TRNS ,KC_TRNS
  172. ,KC_TRNS
  173. ,KC_TRNS ,KC_TRNS ,KC_TRNS
  174. ),
  175. /* Keymap 2: Hungarian Layer
  176. *
  177. * ,-----------------------------------------------------. ,-----------------------------------------------------.
  178. * | | | | | | | | | | | | | | | |
  179. * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
  180. * | | | Ő | | Ű | | | | | | | | | | |
  181. * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
  182. * | | Á | Ó | É | Ú | Í |------| |------| | | | | | |
  183. * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
  184. * | | | Ö | | Ü | | | | | | | | | | |
  185. * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
  186. * | | | | | | | | | | | |
  187. * `----------------------------------' `----------------------------------'
  188. * ,-------------. ,-------------.
  189. * | | | | | |
  190. * ,------|------|------| |------+------+------.
  191. * | | | | | | | |
  192. * | | |------| |------| | |
  193. * | | | | | BASE | | |
  194. * `--------------------' `--------------------'
  195. */
  196. [HUN] = KEYMAP(
  197. // left hand
  198. KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_TRNS
  199. ,KC_NO ,KC_NO ,M(HU_OEE),KC_NO ,M(HU_UEE),KC_NO ,KC_NO
  200. ,KC_NO ,M(HU_AA),M(HU_OO) ,M(HU_EE),M(HU_UU) ,M(HU_II)
  201. ,KC_TRNS ,KC_NO ,M(HU_OE) ,KC_NO ,M(HU_UE) ,KC_NO ,KC_NO
  202. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_NO
  203. ,KC_TRNS ,KC_TRNS
  204. ,KC_TRNS
  205. ,KC_TRNS ,KC_TRNS ,KC_TRNS
  206. // right hand
  207. ,KC_TRNS ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  208. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  209. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  210. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  211. ,KC_NO ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  212. ,KC_NO ,KC_NO
  213. ,KC_NO
  214. ,F(F_BSE),KC_TRNS ,KC_TRNS
  215. ),
  216. /* Keymap 3: Spacemacs layer
  217. *
  218. * ,-----------------------------------------------------. ,-----------------------------------------------------.
  219. * | MS Slow | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 |ScrLCK| |ScrLCK| 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10| F11 |
  220. * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
  221. * | MS Normal | | Home | Up | PgUp | |Visual| |Scroll| $ |MsUpL | MsUp |MsUpR | R |PrintScreen|
  222. * |-----------+------+------+------+------+------| Mode | | Up |------+------+------+------+------+-----------|
  223. * | MS Fast |APPEND| Left | Down | Right| INS |------| |------| D |MsLeft| MsDn |MsRght| | |
  224. * |-----------+------+------+------+------+------| Cut | |Scroll|------+------+------+------+------+-----------|
  225. * | Play/Pause| | End | Down | PgDn | X | Copy | | Down | |MsDnL | W |MsDnR | | Stop |
  226. * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
  227. * |EmacsM|TermM |OtherM| | | |Vol Up|Vol Dn| Mute | | |
  228. * `----------------------------------' `----------------------------------'
  229. * ,-------------. ,-------------.
  230. * | Alt | GUI | | BASE | MClk |
  231. * ,------|------|------| |------+------+------.
  232. * |Delete| | Ctrl | | Prev |Left |Right |
  233. * | |LShift|------| |------| Click| Click|
  234. * |Paste | | ESC | | Next | | |
  235. * `--------------------' `--------------------'
  236. */
  237. [EMACS] = KEYMAP(
  238. // left hand
  239. KC_ACL0 ,M(KF_1) ,M(KF_2) ,M(KF_3) ,M(KF_4) ,M(KF_5) ,LGUI(KC_L)
  240. ,KC_ACL1 ,KC_NO ,KC_HOME ,KC_UP ,KC_PGUP ,KC_NO ,M(AE_VIS)
  241. ,KC_ACL2 ,M(AE_APPND) ,KC_LEFT ,KC_DOWN ,KC_RIGHT,M(AE_INS)
  242. ,KC_MPLY ,KC_NO ,KC_END ,KC_DOWN ,KC_PGDN ,KC_X ,M(AE_CPYC)
  243. ,M(AE_EMACS),M(AE_TERM) ,M(AE_OTHER),KC_NO ,KC_NO
  244. ,KC_TRNS ,KC_TRNS
  245. ,KC_TRNS
  246. ,M(AE_PSTDEL),KC_TRNS ,KC_TRNS
  247. // right hand
  248. ,LGUI(KC_L),M(KF_6) ,M(KF_7) ,M(KF_8) ,M(KF_9) ,M(KF_10) ,M(KF_11)
  249. ,KC_WH_U ,KC_DLR ,M(A_MUL),KC_MS_U ,M(A_MUR),M(AE_OVR),KC_PSCR
  250. ,KC_D ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_NO ,KC_NO
  251. ,KC_WH_D ,KC_NO ,M(A_MDL),KC_W ,M(A_MDR),KC_NO ,KC_MSTP
  252. ,KC_VOLU ,KC_VOLD ,KC_MUTE ,KC_NO ,KC_NO
  253. ,KC_TRNS ,KC_MS_BTN3
  254. ,KC_MPRV
  255. ,KC_MNXT ,KC_BTN1 ,KC_BTN2
  256. ),
  257. /* Keymap 5: One-handed, left side
  258. *
  259. * ,-----------------------------------------------------.
  260. * | `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 |A BSE|
  261. * |-----------+------+------+------+------+-------------|
  262. * | Tab | ' | , | . | P | Y | [ |
  263. * |-----------+------+------+------+------+------| |
  264. * | - | A | O | E | U | I |------|
  265. * |-----------+------+------+------+------+------| ( |
  266. * | Play/Pause| ; | Q | J | K | X | |
  267. * `-----------+------+------+------+------+-------------'
  268. * | Home | End | Down | Up | ESC |
  269. * `-----------------------------------'
  270. * ,-------------.
  271. * | LAlt | GUI |
  272. * ,------|------|------|
  273. * |BackSp|LShift| Ctrl |
  274. * | | |------|
  275. * |Space |Enter |OTHER |
  276. * `--------------------'
  277. */
  278. [OHLFT] = KEYMAP(
  279. // left hand
  280. KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3) ,M(KF_4) ,M(KF_5) ,M(OH_BASE)
  281. ,KC_TAB ,KC_QUOT ,KC_COMM ,KC_DOT ,KC_P ,KC_Y ,KC_LBRC
  282. ,KC_MINS ,KC_A ,KC_O ,KC_E ,KC_U ,KC_I
  283. ,KC_MPLY ,KC_SCLN ,KC_Q ,KC_J ,KC_K ,KC_X ,KC_LPRN
  284. ,KC_HOME ,KC_END ,KC_DOWN ,KC_UP ,M(A_ESC)
  285. ,KC_TRNS ,KC_TRNS
  286. ,KC_TRNS
  287. ,M(OH_BSSPC),M(OH_ENTSFT),M(OH_RIGHT)
  288. // right hand
  289. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  290. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  291. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  292. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  293. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  294. ,KC_NO ,KC_NO
  295. ,KC_NO
  296. ,KC_NO ,KC_NO ,KC_NO
  297. ),
  298. /* Keymap 6: One-handed, right side
  299. *
  300. * ,-----------------------------------------------------.
  301. * | = F11 | 0 F10| 9 F9 | 8 F8 | 7 F7 | 6 F6 |A BSE|
  302. * |-----------+------+------+------+------+-------------|
  303. * | / | L | R | C | G | F | ] |
  304. * |-----------+------+------+------+------+------| |
  305. * | \ | S | N | T | H | D |------|
  306. * |-----------+------+------+------+------+------| ) |
  307. * | Stop | Z | V | W | M | B | |
  308. * `-----------+------+------+------+------+-------------'
  309. * | PgDn | PgUp | Right| Left | ESC |
  310. * `-----------------------------------'
  311. * ,-------------.
  312. * | LAlt | GUI |
  313. * ,------|------|------|
  314. * |BackSp|LShift| Ctrl |
  315. * | | |------|
  316. * |Space |Enter |OTHER |
  317. * `--------------------'
  318. */
  319. [OHRGT] = KEYMAP(
  320. // left hand
  321. M(KF_11) ,M(KF_10) ,M(KF_9) ,M(KF_8) ,M(KF_7) ,M(KF_6) ,M(OH_BASE)
  322. ,KC_SLSH ,KC_L ,KC_R ,KC_C ,KC_G ,KC_F ,KC_RBRC
  323. ,KC_BSLS ,KC_S ,KC_N ,KC_T ,KC_H ,KC_D
  324. ,KC_MSTP ,KC_Z ,KC_V ,KC_W ,KC_M ,KC_B ,KC_RPRN
  325. ,KC_PGDN ,KC_PGUP ,KC_RGHT ,KC_LEFT ,M(A_ESC)
  326. ,KC_TRNS ,KC_TRNS
  327. ,KC_TRNS
  328. ,M(OH_BSSPC),M(OH_ENTSFT),M(OH_LEFT)
  329. // right hand
  330. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  331. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  332. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  333. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  334. ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
  335. ,KC_NO ,KC_NO
  336. ,KC_NO
  337. ,KC_NO ,KC_NO ,KC_NO
  338. ),
  339. };
  340. const uint16_t PROGMEM fn_actions[] = {
  341. [F_BSE] = ACTION_LAYER_CLEAR(ON_PRESS)
  342. ,[F_HUN] = ACTION_LAYER_INVERT(HUN, ON_PRESS)
  343. ,[F_GUI] = ACTION_MACRO_TAP(A_GUI)
  344. ,[F_SFT] = ACTION_MODS_ONESHOT (MOD_LSFT)
  345. ,[F_ALT] = ACTION_MODS_ONESHOT (MOD_LALT)
  346. ,[F_CTRL] = ACTION_MODS_ONESHOT (MOD_LCTL)
  347. };
  348. macro_t *ang_do_hun (keyrecord_t *record, uint16_t accent, uint16_t hun_char)
  349. {
  350. uint8_t need_shift = 0;
  351. uint8_t hold_shift = 0;
  352. if (!record->event.pressed)
  353. return MACRO_NONE;
  354. layer_off (HUN);
  355. if (keyboard_report->mods & MOD_BIT (KC_LSFT)) {
  356. hold_shift = 1;
  357. need_shift = 1;
  358. unregister_code (KC_LSFT);
  359. }
  360. if ((get_oneshot_mods () & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out ()) {
  361. need_shift = 1;
  362. hold_shift = 0;
  363. unregister_code (KC_LSFT);
  364. }
  365. clear_oneshot_mods ();
  366. register_code (KC_RALT);
  367. unregister_code (KC_RALT);
  368. if (accent == (KC_DQT)) {
  369. register_code (KC_RSFT);
  370. }
  371. register_code (accent);
  372. unregister_code (accent);
  373. if (need_shift && accent != (KC_DQT)) {
  374. register_code (KC_RSFT);
  375. } else if (accent == (KC_DQT) && !need_shift) {
  376. unregister_code (KC_RSFT);
  377. }
  378. register_code (hun_char);
  379. unregister_code (hun_char);
  380. if (need_shift || accent == (KC_DQT))
  381. unregister_code (KC_RSFT);
  382. if (hold_shift)
  383. register_code (KC_LSFT);
  384. return MACRO_NONE;
  385. }
  386. void ang_handle_kf (keyrecord_t *record, uint8_t id)
  387. {
  388. uint8_t code = id - KF_1;
  389. if (record->event.pressed) {
  390. kf_timers[code] = timer_read ();
  391. } else {
  392. uint8_t kc;
  393. if (timer_elapsed (kf_timers[code]) > TAPPING_TERM) {
  394. // Long press
  395. kc = KC_F1 + code;
  396. } else {
  397. if (id == KF_11)
  398. kc = KC_EQL;
  399. else
  400. kc = KC_1 + code;
  401. }
  402. register_code (kc);
  403. unregister_code (kc);
  404. }
  405. }
  406. const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
  407. {
  408. switch(id) {
  409. case A_ESC:
  410. if (record->event.pressed) {
  411. if ((get_oneshot_mods ()) && !has_oneshot_mods_timed_out ()) {
  412. clear_oneshot_mods ();
  413. } else {
  414. register_code (KC_ESC);
  415. }
  416. } else {
  417. unregister_code (KC_ESC);
  418. }
  419. break;
  420. /* Hungarian layer */
  421. case HU_AA:
  422. return ang_do_hun (record, KC_QUOT, KC_A);
  423. case HU_OO:
  424. return ang_do_hun (record, KC_QUOT, KC_O);
  425. case HU_EE:
  426. return ang_do_hun (record, KC_QUOT, KC_E);
  427. case HU_UU:
  428. return ang_do_hun (record, KC_QUOT, KC_U);
  429. case HU_II:
  430. return ang_do_hun (record, KC_QUOT, KC_I);
  431. case HU_OE:
  432. return ang_do_hun (record, KC_DQT, KC_O);
  433. case HU_UE:
  434. return ang_do_hun (record, KC_DQT, KC_U);
  435. case HU_OEE:
  436. return ang_do_hun (record, KC_EQL, KC_O);
  437. case HU_UEE:
  438. return ang_do_hun (record, KC_EQL, KC_U);
  439. /* Mouse movement */
  440. case A_MUL:
  441. if (record->event.pressed) {
  442. mousekey_on(KC_MS_UP);
  443. mousekey_on(KC_MS_LEFT);
  444. } else {
  445. mousekey_off(KC_MS_UP);
  446. mousekey_off(KC_MS_LEFT);
  447. }
  448. mousekey_send();
  449. break;
  450. case A_MUR:
  451. if (record->event.pressed) {
  452. mousekey_on(KC_MS_UP);
  453. mousekey_on(KC_MS_RIGHT);
  454. } else {
  455. mousekey_off(KC_MS_UP);
  456. mousekey_off(KC_MS_RIGHT);
  457. }
  458. mousekey_send();
  459. break;
  460. case A_MDL:
  461. if (record->event.pressed) {
  462. mousekey_on(KC_MS_DOWN);
  463. mousekey_on(KC_MS_LEFT);
  464. } else {
  465. mousekey_off(KC_MS_DOWN);
  466. mousekey_off(KC_MS_LEFT);
  467. }
  468. mousekey_send();
  469. break;
  470. case A_MDR:
  471. if (record->event.pressed) {
  472. mousekey_on(KC_MS_DOWN);
  473. mousekey_on(KC_MS_RIGHT);
  474. } else {
  475. mousekey_off(KC_MS_DOWN);
  476. mousekey_off(KC_MS_RIGHT);
  477. }
  478. mousekey_send();
  479. break;
  480. /* EMACS layer stuff */
  481. case AE_EMACS:
  482. if (record->event.pressed) {
  483. cp_mode = CP_EMACS;
  484. }
  485. break;
  486. case AE_TERM:
  487. if (record->event.pressed) {
  488. cp_mode = CP_TERM;
  489. }
  490. break;
  491. case AE_OTHER:
  492. if (record->event.pressed) {
  493. cp_mode = CP_OTHER;
  494. }
  495. break;
  496. case AE_VIS:
  497. if (cp_mode == CP_EMACS && record->event.pressed) {
  498. return MACRO(T(V), END);
  499. }
  500. break;
  501. case AE_CPYC:
  502. if (record->event.pressed) {
  503. m_copypaste_timer = timer_read ();
  504. } else {
  505. if (timer_elapsed (m_copypaste_timer) > TAPPING_TERM) {
  506. // Long press: Cut
  507. switch (cp_mode) {
  508. case CP_EMACS:
  509. return MACRO(T(X), END);
  510. break;
  511. case CP_TERM:
  512. return MACRO(D(RCTRL), D(RSFT), T(X), U(RSFT), U(RCTRL), END);
  513. break;
  514. case CP_OTHER:
  515. return MACRO(D(RCTRL), T(X), U(RCTRL), END);
  516. break;
  517. }
  518. } else {
  519. // Short press: Copy
  520. switch (cp_mode) {
  521. case CP_EMACS:
  522. return MACRO(T(Y), END);
  523. break;
  524. case CP_TERM:
  525. return MACRO(D(RCTRL), D(RSFT), T(C), U(RSFT), U(RCTRL), END);
  526. break;
  527. case CP_OTHER:
  528. return MACRO(D(RCTRL), T(C), U(RCTRL), END);
  529. break;
  530. }
  531. }
  532. }
  533. break;
  534. case AE_PSTDEL:
  535. if (record->event.pressed) {
  536. m_cutdel_timer = timer_read ();
  537. } else {
  538. if (timer_elapsed (m_cutdel_timer) > TAPPING_TERM) {
  539. // Long press: Delete
  540. switch (cp_mode) {
  541. case CP_EMACS:
  542. return MACRO(T(D), END);
  543. break;
  544. case CP_TERM:
  545. case CP_OTHER:
  546. return MACRO(T(DEL), END);
  547. break;
  548. }
  549. } else {
  550. // Short press: Paste
  551. switch (cp_mode) {
  552. case CP_EMACS:
  553. if (keyboard_report->mods & MOD_BIT(KC_RSFT)) {
  554. unregister_code (KC_RSFT);
  555. return MACRO(U(RSFT), T(RBRC), T(P), D(RSFT), END);
  556. }
  557. else
  558. return MACRO(T(P), END);
  559. break;
  560. case CP_TERM:
  561. return MACRO(D(RCTRL), D(RSFT), T(V), U(RSFT), U(RCTRL), END);
  562. break;
  563. case CP_OTHER:
  564. return MACRO(D(RCTRL), T(V), U(RCTRL), END);
  565. break;
  566. }
  567. }
  568. }
  569. break;
  570. case AE_INS:
  571. if (record->event.pressed) {
  572. return MACRO(T(I), END);
  573. } else {
  574. layer_clear();
  575. }
  576. break;
  577. case AE_OVR:
  578. if (record->event.pressed) {
  579. return MACRO(T(R), END);
  580. } else {
  581. layer_clear();
  582. }
  583. break;
  584. case AE_APPND:
  585. if (record->event.pressed) {
  586. return MACRO(T(A), END);
  587. } else {
  588. layer_clear();
  589. }
  590. break;
  591. /* GUI & AppSel */
  592. case A_GUI:
  593. if (record->event.pressed) {
  594. register_code (KC_LGUI);
  595. if (record->tap.count && !record->tap.interrupted) {
  596. if (record->tap.count >= 2) {
  597. register_code (KC_W);
  598. layer_on (APPSEL);
  599. set_oneshot_layer (APPSEL, ONESHOT_START);
  600. }
  601. } else {
  602. record->tap.count = 0;
  603. }
  604. gui_timer = 0;
  605. } else {
  606. if (record->tap.count >= 2)
  607. {
  608. unregister_code (KC_W);
  609. clear_oneshot_layer_state (ONESHOT_PRESSED);
  610. }
  611. gui_timer = timer_read ();
  612. }
  613. break;
  614. case APP_SLK:
  615. if (record->event.pressed)
  616. return MACRO(T(S), T(C), T(U), T(D), T(C), T(L), T(O), T(U), T(D), T(ENT), END);
  617. break;
  618. case APP_EMCS:
  619. if (record->event.pressed)
  620. return MACRO(T(E), T(M), T(A), T(C), T(S), T(ENT), END);
  621. break;
  622. case APP_TERM:
  623. if (record->event.pressed)
  624. return MACRO(T(T), T(E), T(R), T(M), T(ENT), END);
  625. break;
  626. case APP_CHRM:
  627. if (record->event.pressed)
  628. return MACRO(T(C), T(H), T(R), T(O), T(M), T(ENT), END);
  629. break;
  630. case APP_MSIC:
  631. if (record->event.pressed)
  632. return MACRO(T(R), T(H), T(Y), T(T), T(H), T(M), T(B), T(O), T(X), T(ENT), END);
  633. break;
  634. /* Function keys */
  635. case KF_1 ... KF_11:
  636. ang_handle_kf (record, id);
  637. break;
  638. /* 1HAND layout */
  639. case OH_BASE:
  640. if (record->event.pressed) {
  641. oh_base_timer = timer_read ();
  642. } else {
  643. if (timer_elapsed (oh_base_timer) > TAPPING_TERM) {
  644. layer_clear ();
  645. } else {
  646. return MACRO (T(APP), END);
  647. }
  648. }
  649. break;
  650. case OH_BSSPC:
  651. if (record->event.pressed) {
  652. oh_bsspc_timer = timer_read ();
  653. } else {
  654. if (timer_elapsed (oh_bsspc_timer) > TAPPING_TERM) {
  655. return MACRO (T(BSPC), END);
  656. } else {
  657. return MACRO (T(SPC), END);
  658. }
  659. }
  660. break;
  661. case OH_ENTSFT:
  662. if (record->event.pressed) {
  663. oh_entsft_timer = timer_read ();
  664. } else {
  665. if (timer_elapsed (oh_entsft_timer) > TAPPING_TERM) {
  666. if (keyboard_report->mods & MOD_BIT(KC_LSFT))
  667. unregister_code (KC_LSFT);
  668. else
  669. register_code (KC_LSFT);
  670. } else {
  671. return MACRO (T(ENT), END);
  672. }
  673. }
  674. break;
  675. case OH_LEFT:
  676. if (record->event.pressed) {
  677. layer_move (OHLFT);
  678. oh_left_blink = 1;
  679. oh_left_blink_timer = timer_read ();
  680. ergodox_right_led_1_on ();
  681. }
  682. break;
  683. case OH_RIGHT:
  684. if (record->event.pressed) {
  685. layer_move (OHRGT);
  686. oh_right_blink = 1;
  687. oh_right_blink_timer = timer_read ();
  688. ergodox_right_led_3_on ();
  689. }
  690. break;
  691. }
  692. return MACRO_NONE;
  693. };
  694. // Runs just one time when the keyboard initializes.
  695. void matrix_init_user(void) {
  696. ergodox_led_all_set (LED_BRIGHTNESS_LO);
  697. ergodox_led_all_on();
  698. _delay_ms(1000);
  699. ergodox_led_all_off();
  700. };
  701. LEADER_EXTERNS();
  702. void ang_do_unicode (void) {
  703. register_code (KC_RCTL);
  704. register_code (KC_RSFT);
  705. register_code (KC_U);
  706. unregister_code (KC_U);
  707. unregister_code (KC_RSFT);
  708. unregister_code (KC_RCTL);
  709. }
  710. void ang_tap (uint16_t codes[]) {
  711. for (int i = 0; codes[i] != 0; i++) {
  712. register_code (codes[i]);
  713. unregister_code (codes[i]);
  714. }
  715. }
  716. #define TAP_ONCE(code) \
  717. register_code (code); \
  718. unregister_code (code)
  719. // Runs constantly in the background, in a loop.
  720. void matrix_scan_user(void) {
  721. uint8_t layer = biton32(layer_state);
  722. if (gui_timer && timer_elapsed (gui_timer) > TAPPING_TERM)
  723. unregister_code (KC_LGUI);
  724. if (layer != OHLFT)
  725. oh_left_blink = 0;
  726. if (layer != OHRGT)
  727. oh_right_blink = 0;
  728. if (layer == HUN) {
  729. ergodox_right_led_2_on();
  730. ergodox_right_led_3_on();
  731. } else if (layer == EMACS) {
  732. ergodox_right_led_1_on();
  733. ergodox_right_led_2_on();
  734. }
  735. if (layer == OHLFT || layer == OHRGT) {
  736. ergodox_right_led_2_on();
  737. if (oh_left_blink) {
  738. if (timer_elapsed (oh_left_blink_timer) > OH_BLINK_INTERVAL) {
  739. if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) == 0)
  740. ergodox_right_led_1_off ();
  741. }
  742. if (timer_elapsed (oh_left_blink_timer) > OH_BLINK_INTERVAL * 2) {
  743. ergodox_right_led_1_on ();
  744. oh_left_blink_timer = timer_read ();
  745. }
  746. }
  747. if (oh_right_blink) {
  748. if (timer_elapsed (oh_right_blink_timer) > OH_BLINK_INTERVAL) {
  749. if ((keyboard_report->mods & MOD_BIT(KC_LCTRL)) == 0)
  750. ergodox_right_led_3_off ();
  751. }
  752. if (timer_elapsed (oh_right_blink_timer) > OH_BLINK_INTERVAL * 2) {
  753. ergodox_right_led_3_on ();
  754. oh_right_blink_timer = timer_read ();
  755. }
  756. }
  757. }
  758. if (keyboard_report->mods & MOD_BIT(KC_LSFT) ||
  759. ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out())) {
  760. ergodox_right_led_1_set (LED_BRIGHTNESS_HI);
  761. ergodox_right_led_1_on ();
  762. } else {
  763. ergodox_right_led_1_set (LED_BRIGHTNESS_LO);
  764. if (layer != OHLFT && layer != EMACS)
  765. ergodox_right_led_1_off ();
  766. }
  767. if (keyboard_report->mods & MOD_BIT(KC_LALT) ||
  768. ((get_oneshot_mods() & MOD_BIT(KC_LALT)) && !has_oneshot_mods_timed_out())) {
  769. ergodox_right_led_2_set (LED_BRIGHTNESS_HI);
  770. ergodox_right_led_2_on ();
  771. } else {
  772. ergodox_right_led_2_set (LED_BRIGHTNESS_LO);
  773. if (layer != OHRGT && layer != HUN && layer != OHLFT && layer != EMACS)
  774. ergodox_right_led_2_off ();
  775. }
  776. if (keyboard_report->mods & MOD_BIT(KC_LCTRL) ||
  777. ((get_oneshot_mods() & MOD_BIT(KC_LCTRL)) && !has_oneshot_mods_timed_out())) {
  778. ergodox_right_led_3_set (LED_BRIGHTNESS_HI);
  779. ergodox_right_led_3_on ();
  780. } else {
  781. ergodox_right_led_3_set (LED_BRIGHTNESS_LO);
  782. if (layer != OHRGT && layer != HUN)
  783. ergodox_right_led_3_off ();
  784. }
  785. LEADER_DICTIONARY() {
  786. leading = false;
  787. leader_end ();
  788. SEQ_ONE_KEY (KC_U) {
  789. ang_do_unicode ();
  790. }
  791. SEQ_ONE_KEY (KC_L) {
  792. /* λ */
  793. ang_do_unicode ();
  794. uint16_t codes[] = {KC_0, KC_3, KC_B, KC_B, KC_ENT, 0};
  795. ang_tap (codes);
  796. }
  797. SEQ_ONE_KEY (KC_S) {
  798. ang_do_unicode (); TAP_ONCE (KC_A); TAP_ONCE (KC_F); TAP_ONCE (KC_SPC);
  799. TAP_ONCE (KC_BSLS);
  800. register_code (KC_RSFT); TAP_ONCE (KC_MINS); TAP_ONCE (KC_9); unregister_code (KC_RSFT);
  801. ang_do_unicode (); TAP_ONCE (KC_3); TAP_ONCE (KC_0); TAP_ONCE (KC_C); TAP_ONCE (KC_4); TAP_ONCE (KC_SPC);
  802. register_code (KC_RSFT); TAP_ONCE (KC_0); TAP_ONCE (KC_MINS); unregister_code (KC_RSFT);
  803. TAP_ONCE (KC_SLSH);
  804. ang_do_unicode (); TAP_ONCE (KC_A); TAP_ONCE (KC_F); TAP_ONCE (KC_SPC);
  805. }
  806. SEQ_TWO_KEYS (KC_W, KC_M) {
  807. register_code (KC_LALT);
  808. register_code (KC_F2);
  809. unregister_code (KC_F2);
  810. unregister_code (KC_LALT);
  811. _delay_ms (1000);
  812. 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};
  813. ang_tap (codes);
  814. register_code (KC_LGUI);
  815. register_code (KC_UP);
  816. unregister_code (KC_UP);
  817. unregister_code (KC_LGUI);
  818. }
  819. }
  820. }