You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1104 lines
46 KiB

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