keymap.c 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126
  1. /* Copyright 2015-2017 Jack Humbert
  2. * Copyright 2021 Jakob Weickmann
  3. *
  4. This program is free software: you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation, either version 2 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. #include QMK_KEYBOARD_H
  18. #include "muse.h"
  19. enum planck_layers {
  20. _HRWIDECOLEMAK,
  21. _HRWIDECOLEMAK_DE,
  22. _GAMING,
  23. _WIDECOLEMAK,
  24. _LOWER,
  25. _RAISE,
  26. _LOWER_DE,
  27. _RAISE_DE,
  28. _ADJUST,
  29. _NAV,
  30. _VIM,
  31. _NUM,
  32. _MOUSE,
  33. };
  34. enum planck_keycodes { HRWIDECOLEMAK = SAFE_RANGE, GAMING, WIDECOLEMAK, TG_COLEMAK, VIM_O, VIM_V, KC_SVD_BD, KC_SVU_BU, KC_TAB_MPLY, ALT_TAB, CTL_TAB, DE_ae, DE_oe, DE_ue, DE_AE, DE_OE, DE_SZ, DE_EGRAVE, DE_EAIGU, KC_CURRENCY, KC_DE_SWITCH, LANG_SWITCH, DE_SLSH_QUST, DE_QUOT, DE_SCLN, DE_BSLS, M_ESCM, M_RGUI_SCLN, DE_DOT_RAB, DE_COMM_LAB };
  35. // Tap Dance declarations
  36. enum tap_dance_codes {
  37. TD_PRN, // round brackets (parentheses)
  38. TD_PRN_DE, // round brackets (parentheses)
  39. TD_BRC, // square brackets
  40. TD_BRC_DE, // square brackets
  41. TD_CBR, // curly brackets
  42. TD_CBR_DE, // curly brackets
  43. TD_VIM_GG // single tap to scroll down, double tap to scroll up
  44. };
  45. #define LOWER MO(_LOWER)
  46. #define RAISE MO(_RAISE)
  47. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  48. /* _HRWIDECOLEMAK
  49. * ,-----------------------------------------------------------------------------------.
  50. * | G-Q | A-W | S-F | C-P |_Num-B|Vol/B+|_Num-J| C-L | S-U | A-Y | G-/ | ü |
  51. * |------+------+------+------+------+------+------+------+------+------+------+------|
  52. * | A | R | S | T | G | TAB | M | N | E | I | O | ' |
  53. * |------+------+------+------+------+------+------+------+------+------+------+------|
  54. * |_Mo-Z | X | C | D | V |Vol/B-| K | H | , | . |_Mo-/ | \ |
  55. * |------+------+------+------+------+------+------+------+------+------+------+------|
  56. * |C-CAPS| LEAD | BSPC |_L-ESC| LSFT | _Nav-SPC |_R-ENT|S-DEL | RALT |_Mo <-|_Mo ->|
  57. * `-----------------------------------------------------------------------------------'
  58. */
  59. [_HRWIDECOLEMAK] = LAYOUT_planck_grid(
  60. LGUI_T(KC_Q), LALT_T(KC_W), LSFT_T(KC_F), LCTL_T(KC_P), LT(_NUM, KC_B), KC_SVU_BU, LT(_NUM, KC_J), RCTL_T(KC_L), RSFT_T(KC_U), LALT_T(KC_Y), RGUI_T(KC_SCLN), DE_ue,
  61. KC_A, KC_R, KC_S, KC_T, KC_G, KC_TAB, KC_M, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
  62. LT(_MOUSE, KC_Z), KC_X, KC_C, KC_D, KC_V, KC_SVD_BD, KC_K, KC_H, KC_COMM, KC_DOT, LT(_MOUSE, KC_SLSH), KC_BSLS,
  63. LCTL_T(KC_CAPS), QK_LEAD, KC_BSPC, LT(_LOWER, KC_ESC), OSM(MOD_LSFT), LT(_NAV, KC_SPC), LT(_NAV, KC_SPC), LT(_RAISE, KC_ENT), RSFT_T(KC_DEL), KC_RALT, LT(_MOUSE, KC_LEFT), LT(_MOUSE, KC_RIGHT)
  64. ),
  65. /* _HRWIDECOLEMAK_DE
  66. * same as above, when the PC is set to German layout
  67. * ,-----------------------------------------------------------------------------------.
  68. * | G-Q | A-W | S-F | C-P |_Num-B|Vol/B+|_Num-J| C-L | S-U | A-Y | G-/ | ü |
  69. * |------+------+------+------+------+------+------+------+------+------+------+------|
  70. * | A | R | S | T | G | TAB | M | N | E | I | O | ' |
  71. * |------+------+------+------+------+------+------+------+------+------+------+------|
  72. * |_Mo-Z | X | C | D | V |Vol/B-| K | H | , | . |_Mo-/ | \ |
  73. * |------+------+------+------+------+------+------+------+------+------+------+------|
  74. * |C-CAPS| LEAD | BSPC |_L-ESC| LSFT | _Nav-SPC |_R-ENT|S-DEL | RALT |_Mo <-|_Mo ->|
  75. * `-----------------------------------------------------------------------------------'
  76. */
  77. [_HRWIDECOLEMAK_DE] = LAYOUT_planck_grid(
  78. LGUI_T(KC_Q), LALT_T(KC_W), LSFT_T(KC_F), LCTL_T(KC_P), LT(_NUM, KC_B), KC_SVU_BU, LT(_NUM, KC_J), RCTL_T(KC_L), RSFT_T(KC_U), LALT_T(KC_Z), M_RGUI_SCLN, KC_LBRC,
  79. KC_A, KC_R, KC_S, KC_T, KC_G, KC_TAB, KC_M, KC_N, KC_E, KC_I, KC_O, DE_QUOT,
  80. LT(_MOUSE, KC_Y), KC_X, KC_C, KC_D, KC_V, KC_SVD_BD, KC_K, KC_H, DE_COMM_LAB, DE_DOT_RAB, DE_SLSH_QUST, DE_BSLS,
  81. LCTL_T(KC_CAPS), QK_LEAD, KC_BSPC, LT(_LOWER_DE, KC_ESC), OSM(MOD_LSFT), LT(_NAV, KC_SPC), LT(_NAV, KC_SPC), LT(_RAISE_DE, KC_ENT), RSFT_T(KC_DEL), KC_RALT, LT(_MOUSE, KC_LEFT), LT(_MOUSE, KC_RIGHT)
  82. ),
  83. /* _GAMING
  84. * ,-----------------------------------------------------------------------------------.
  85. * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | F5 | F8 | F9 |Vol/B+|
  86. * |------+------+------+------+------+------+------+------+------+------+------+------|
  87. * | TAB | Q | W | E | R | T | Y | U | I | O | P |Vol/B-|
  88. * |------+------+------+------+------+------+------+------+------+------+------+------|
  89. * | LSFT | A | S | D | F | G | H | J | Z | M | ; |_CM-EN|
  90. * |------+------+------+------+------+------+------+------+------+------+------+------|
  91. * | LCTL | C | B | X | LALT | SPACE | ENT | RALT | ____ | ____ | !GAME|
  92. * `-----------------------------------------------------------------------------------'
  93. */
  94. [_GAMING] = LAYOUT_planck_grid(
  95. KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_F5, KC_F8, KC_F9, KC_VOLU,
  96. KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_VOLD,
  97. KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_Z, KC_M, KC_SCLN, TG_COLEMAK,
  98. KC_LCTL, KC_C, KC_B, KC_X, KC_LALT, KC_SPC, KC_SPC, KC_ENT, KC_RALT, KC_TRNS, KC_TRNS, GAMING
  99. ),
  100. /* WIDECOLEMAK
  101. * no mod taps
  102. * ,-----------------------------------------------------------------------------------.
  103. * | Q | W | F | P | B |Vol/B+| J | L | U | Y | / | Ü |
  104. * |------+------+------+------+------+------+------+------+------+------+------+------|
  105. * | A | R | S | T | G | TAB | M | N | E | I | O | ' |
  106. * |------+------+------+------+------+------+------+------+------+------+------+------|
  107. * | Z | X | C | D | V |Vol/B-| K | H | , | . | / |!CM-EN|
  108. * |------+------+------+------+------+------+------+------+------+------+------+------|
  109. * |C-CAPS|G-TAB |MN-ESC|_L-BSP| LSFT | _NAV-SPC |_R-ENT|S-DEL |C-TAB |_Mo <-|_Mo ->|
  110. * `-----------------------------------------------------------------------------------'
  111. */
  112. [_WIDECOLEMAK] = LAYOUT_planck_grid(
  113. KC_Q, KC_W, KC_F, KC_P, KC_B, KC_SVU_BU, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, DE_ue,
  114. KC_A, KC_R, KC_S, KC_T, KC_G, KC_TAB_MPLY, KC_M, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
  115. KC_Z, KC_X, KC_C, KC_D, KC_V, KC_SVD_BD, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, TG_COLEMAK,
  116. LCTL_T(KC_CAPS), LGUI_T(KC_TAB), M_ESCM, LT(_LOWER_DE, KC_BSPC), OSM(MOD_LSFT), LT(_NAV, KC_SPC), LT(_NAV, KC_SPC), LT(_RAISE, KC_ENT), RSFT_T(KC_DEL), KC_LALT, LT(_MOUSE, KC_LEFT), LT(_MOUSE, KC_RIGHT)
  117. ),
  118. /* _LOWER
  119. * ,-----------------------------------------------------------------------------------.
  120. * | ! | @ | # | $ | % | ~ | ^ | & | * | ( | ) | Ö |
  121. * |------+------+------+------+------+------+------+------+------+------+------+------|
  122. * | F1 | F2 | F3 | F4 | F5 | F6 | ß | _ | + | { | } | Ä |
  123. * |------+------+------+------+------+------+------+------+------+------+------+------|
  124. * | F7 | F8 | F9 | F10 | F11 | F12 | MPLY | / | \ | | | € | è |
  125. * |------+------+------+------+------+------+------+------+------+------+------+------|
  126. * |!MOUSE| ____ | ____ | ____ | ____ | ____ | ____ | Vol- | Vol+ | ↓ | ↑ |
  127. * `-----------------------------------------------------------------------------------'
  128. */
  129. [_LOWER] = LAYOUT_planck_grid(
  130. KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_TILD, KC_CIRC, KC_AMPR, KC_ASTR, TD(TD_PRN), KC_RPRN, DE_OE,
  131. KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_SZ, KC_UNDS, KC_PLUS, TD(TD_CBR), KC_RCBR, DE_AE,
  132. KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MPLY, KC_SLSH, KC_NUBS, LSFT(KC_NUBS), KC_CURRENCY, DE_EGRAVE,
  133. TG(_MOUSE), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_DOWN, KC_UP
  134. ),
  135. /* _LOWER_DE
  136. * ,-----------------------------------------------------------------------------------.
  137. * | ! | @ | # | $ | % | ~ | ^ | & | * | ( | ) | Ö |
  138. * |------+------+------+------+------+------+------+------+------+------+------+------|
  139. * | F1 | F2 | F3 | F4 | F5 | F6 | ß | _ | + | { | } | Ä |
  140. * |------+------+------+------+------+------+------+------+------+------+------+------|
  141. * | F7 | F8 | F9 | F10 | F11 | F12 | MPLY | / | \ | | | € | ` |
  142. * |------+------+------+------+------+------+------+------+------+------+------+------|
  143. * |!MOUSE| ____ | ____ | ____ | ____ | ____ | ____ | Vol- | Vol+ | ↓ | ↑ |
  144. * `-----------------------------------------------------------------------------------'
  145. */
  146. [_LOWER_DE] = LAYOUT_planck_grid(
  147. KC_EXLM, RALT(KC_Q), KC_BSLS, KC_DLR, KC_PERC, RALT(KC_RBRC), KC_GRV, KC_CIRC, KC_RCBR, TD(TD_PRN_DE), KC_LPRN, LSFT(KC_SCLN),
  148. KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, LSFT(KC_SLSH), KC_RBRC, TD(TD_CBR_DE), RALT(KC_0), LSFT(KC_QUOT),
  149. KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MPLY, LSFT(KC_7), RALT(KC_MINS), RALT(KC_NUBS), KC_CURRENCY, KC_PLUS,
  150. TG(_MOUSE), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_DOWN, KC_UP
  151. ),
  152. /* _RAISE
  153. * ,-----------------------------------------------------------------------------------.
  154. * | 1 | 2 | 3 | 4 | 5 | ` | 6 | 7 | 8 | 9 | 0 | ö |
  155. * |------+------+------+------+------+------+------+------+------+------+------+------|
  156. * | F1 | F2 | F3 | F4 | F5 | F6 | ß | - | = | [ | ] | ä |
  157. * |------+------+------+------+------+------+------+------+------+------+------+------|
  158. * | F7 | F8 | F9 | F10 | F11 | F12 | MPLY | \ | , | . | / | é |
  159. * |------+------+------+------+------+------+------+------+------+------+------+------|
  160. * |!MOUSE| ____ | ____ | BSPC | ____ | ____ | ____ | |<< | >>| | ↓ | ↑ |
  161. * `-----------------------------------------------------------------------------------'
  162. */
  163. [_RAISE] = LAYOUT_planck_grid(
  164. KC_1, KC_2, KC_3, KC_4, KC_5, KC_GRV, KC_6, KC_7, KC_8, KC_9, KC_0, DE_oe,
  165. KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_SZ, KC_MINS, KC_EQL, TD(TD_BRC), KC_RBRC, DE_ae,
  166. KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MPLY, KC_BSLS, KC_COMM, KC_DOT, KC_SLSH, DE_EAIGU,
  167. TG(_MOUSE), KC_TRNS, KC_BSPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_DOWN, KC_UP
  168. ),
  169. /* _RAISE_DE
  170. * ,-----------------------------------------------------------------------------------.
  171. * | 1 | 2 | 3 | 4 | 5 | ` | 6 | 7 | 8 | 9 | 0 | ö |
  172. * |------+------+------+------+------+------+------+------+------+------+------+------|
  173. * | F1 | F2 | F3 | F4 | F5 | F6 | ß | - | = | [ | ] | ä |
  174. * |------+------+------+------+------+------+------+------+------+------+------+------|
  175. * | F7 | F8 | F9 | F10 | F11 | F12 | MPLY | \ | , | . | / | ´ |
  176. * |------+------+------+------+------+------+------+------+------+------+------+------|
  177. * |!MOUSE| ____ | ____ | BSPC | ____ | ____ | ____ | |<< | >>| | ↓ | ↑ |
  178. * `-----------------------------------------------------------------------------------'
  179. */
  180. [_RAISE_DE] = LAYOUT_planck_grid(
  181. KC_1, KC_2, KC_3, KC_4, KC_5, LSFT(KC_GRV), KC_6, KC_7, KC_8, KC_9, KC_0, KC_SCLN,
  182. KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_SLSH, LSFT(KC_0), TD(TD_BRC_DE), RALT(KC_9), KC_QUOT,
  183. KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MPLY, RALT(KC_MINS), KC_COMM, KC_DOT, DE_SLSH_QUST, KC_EQL,
  184. TG(_MOUSE), KC_TRNS, KC_BSPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_DOWN, KC_UP
  185. ),
  186. /* _ADJUST
  187. * ,-----------------------------------------------------------------------------------.
  188. * | A-SFT| Boot | Debug|RGBTOG|RGBMOD|RGBHUI|RGBHUD|RGBSAI|RGBSAD|RGBVAI|RGBVAD| DE_SW|
  189. * |------+------+------+------+------+------+------+------+------+------+------+------|
  190. * | A-GRV|EEPRST|MUNEXT| AU_ON|AU_OFF|AGNORM|AGSWAP|!HRWCM| !WCM | A-GRV| !LANG| !GAME|
  191. * |------+------+------+------+------+------+------+------+------+------+------+------|
  192. * | ____ |AU_REV|AUNEXT| MU_ON|MU_OFF| MI_ON|MI_OFF| Vol- | MPLY | Vol+ | ____ | ____ |
  193. * |------+------+------+------+------+------+------+------+------+------+------+------|
  194. * | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ |EEPRST|
  195. * `-----------------------------------------------------------------------------------'
  196. */
  197. [_ADJUST] = LAYOUT_planck_grid(
  198. LALT(KC_LSFT), QK_BOOT, DB_TOGG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DE_SWITCH,
  199. LALT(KC_GRV), EE_CLR, MU_NEXT, AU_ON, AU_OFF, AG_NORM, AG_SWAP, HRWIDECOLEMAK, WIDECOLEMAK, LALT(KC_GRV), LANG_SWITCH, GAMING,
  200. KC_TRNS, AU_PREV, AU_NEXT, MU_ON, MU_OFF, MI_ON, MI_OFF, KC_SVD_BD, KC_MPLY, KC_SVU_BU, KC_TRNS, KC_TRNS,
  201. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR
  202. ),
  203. /* _NAV
  204. * ,-----------------------------------------------------------------------------------.
  205. * |A(TAB)| C(->)| !LANG|A(GRV)| C(<-)| >>| | HOME | -> | PGUP | COPY | PASTE| DE_SW|
  206. * |------+------+------+------+------+------+------+------+------+------+------+------|
  207. * |C(TAB)| TAB | ESC | ENT |VIM_GG| MPLY | <- | ↓ | ↑ | -> | END | VIM_O|
  208. * |------+------+------+------+------+------+------+------+------+------+------+------|
  209. * | LSFT | XXXX |S(DEL)| CAPS | VIM_V| MUTE | HOME | PGDN | LSFT | RFST | C(F) | C(F) |
  210. * |------+------+------+------+------+------+------+------+------+------+------+------|
  211. * | XXXX | XXXX | ____ | BSPC | ____ | ____ | ENT | DEL | ____ | ____ | DE_SW|
  212. * `-----------------------------------------------------------------------------------'
  213. */
  214. [_NAV] = LAYOUT_planck_grid(
  215. ALT_TAB, LCTL(KC_RGHT), LANG_SWITCH, LALT(KC_GRV), LCTL(KC_LEFT), KC_MNXT, KC_HOME, KC_RIGHT, KC_PGUP, LCTL(KC_INS), LSFT(KC_INS), KC_DE_SWITCH,
  216. CTL_TAB, KC_TAB, KC_ESC, KC_ENT, TD(TD_VIM_GG), KC_MPLY, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_END, VIM_O,
  217. KC_LSFT, KC_NO, LSFT(KC_DEL), KC_CAPS, VIM_V, KC_MUTE, KC_HOME, KC_PGDN, KC_LSFT, KC_RSFT, LCTL(KC_F), LCTL(KC_F),
  218. KC_NO, KC_NO, KC_TRNS, KC_BSPC, KC_TRNS, LT(_NAV, KC_SPC), LT(_NAV, KC_SPC), KC_ENT, KC_DEL, KC_TRNS, KC_TRNS, KC_DE_SWITCH
  219. ),
  220. /* _VIM
  221. * ,-----------------------------------------------------------------------------------.
  222. * |A(TAB)| C(->)| !LANG|A(GRV)| C(<-)| >>| | HOME | -> | PGUP | COPY | PASTE| DE_SW|
  223. * |------+------+------+------+------+------+------+------+------+------+------+------|
  224. * |C(TAB)| TAB | ESC | ENT |VIM_GG| MPLY | <- | ↓ | ↑ | -> | END | VIM_O|
  225. * |------+------+------+------+------+------+------+------+------+------+------+------|
  226. * | LSFT | XXXX |S(DEL)| CAPS | VIM_V| MUTE | HOME | PGDN | LSFT | RFST | C(F) | C(F) |
  227. * |------+------+------+------+------+------+------+------+------+------+------+------|
  228. * | XXXX | XXXX | !VIM | BSPC | ____ | ____ | ENT | DEL | ____ | ↓ | ↑ |
  229. * `-----------------------------------------------------------------------------------'
  230. */
  231. [_VIM] = LAYOUT_planck_grid(
  232. ALT_TAB, LCTL(KC_RGHT), LANG_SWITCH, LALT(KC_GRV), LCTL(KC_LEFT), KC_MNXT, KC_HOME, KC_RIGHT, KC_PGUP, LCTL(KC_INS), LSFT(KC_INS), KC_DE_SWITCH,
  233. CTL_TAB, KC_TAB, KC_ESC, KC_ENT, TD(TD_VIM_GG), KC_MPLY, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_END, VIM_O,
  234. KC_LSFT, KC_NO, LSFT(KC_DEL), KC_CAPS, VIM_V, KC_MUTE, KC_HOME, KC_PGDN, KC_LSFT, KC_RSFT, LCTL(KC_F), LCTL(KC_F),
  235. KC_NO, KC_NO, TG(_VIM), KC_BSPC, KC_TRNS, LT(_NAV, KC_SPC), LT(_NAV, KC_SPC), KC_ENT, KC_DEL, KC_TRNS, KC_DOWN, KC_UP
  236. ),
  237. /* _NUM
  238. * ,-----------------------------------------------------------------------------------.
  239. * | F1 | F2 | F3 | F4 | |<< |NUMLCK| >>| | 7 | 8 | 9 | - | ____ |
  240. * |------+------+------+------+------+------+------+------+------+------+------+------|
  241. * | F5 | F6 | F7 | F8 | Vol+ | MPLY | * | 4 | 5 | 6 | + | . |
  242. * |------+------+------+------+------+------+------+------+------+------+------+------|
  243. * | F9 | F10 | F11 | F12 | Vol- | MUTE | = | 1 | 2 | 3 | / | , |
  244. * |------+------+------+------+------+------+------+------+------+------+------+------|
  245. * | ____ | ____ | ____ | ____ | ____ | ____ | 0 | . | , | = | ____ |
  246. * `-----------------------------------------------------------------------------------'
  247. */
  248. [_NUM] = LAYOUT_planck_grid(
  249. KC_F1, KC_F2, KC_F3, KC_F4, KC_MPRV, KC_NUM, KC_MNXT, KC_P7, KC_P8, KC_P9, KC_MINS, KC_TRNS,
  250. KC_F5, KC_F6, KC_F7, KC_F8, KC_VOLU, KC_MPLY, KC_ASTR, KC_P4, KC_P5, KC_P6, KC_PLUS, KC_DOT,
  251. KC_F9, KC_F10, KC_F11, KC_F12, KC_VOLD, KC_MUTE, KC_EQL, KC_P1, KC_P2, KC_P3, KC_SLSH, KC_COMM,
  252. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P0, KC_DOT, KC_COMM, KC_EQL, KC_TRNS
  253. ),
  254. /* _MOUSE
  255. * ,-----------------------------------------------------------------------------------.
  256. * | XXXX | XXXX | MBTN4| MBTN5| XXXX | Bri+ | XXXX | MWHL↑|MAUS↑ | MWHL↑| XXXX | XXXX |
  257. * |------+------+------+------+------+------+------+------+------+------+------+------|
  258. * | XXXX | MBTN3| MBTN2| MBTN1| XXXX | MPLY | XXXX |MAUS<-|MAUS↓ |MAUS->| XXXX | XXXX |
  259. * |------+------+------+------+------+------+------+------+------+------+------+------|
  260. * | F9 | XXXX | XXXX | XXXX | XXXX | Bri- | XXXX | MWHL↓| XXXX | XXXX | ____ | XXXX |
  261. * |------+------+------+------+------+------+------+------+------+------+------+------|
  262. * |!MOUSE| XXXX | XXXX | ____ | XXXX | MAUS_ACCEL2 | ____ | XXXX | XXXX | ↓ | ↑ |
  263. * `-----------------------------------------------------------------------------------'
  264. */
  265. [_MOUSE] = LAYOUT_planck_grid(
  266. KC_NO, KC_NO, KC_BTN4, KC_BTN5, KC_NO, KC_BRIU, KC_NO, KC_WH_U, KC_MS_U, KC_WH_U, KC_NO, KC_NO,
  267. KC_NO, KC_BTN3, KC_BTN2, KC_BTN1, KC_NO, KC_MPLY, KC_NO, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, KC_NO,
  268. KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_BRID, KC_NO, KC_WH_D, KC_NO, KC_NO, KC_TRNS, KC_NO,
  269. TG(_MOUSE), KC_NO, KC_NO, KC_TRNS, KC_NO, KC_ACL2, KC_ACL2, KC_TRNS, KC_NO, KC_NO, KC_DOWN, KC_UP
  270. )
  271. };
  272. // define the tap dance functions
  273. void dance_prn(tap_dance_state_t *state, void *user_data) {
  274. if (state->count == 1) {
  275. tap_code16(KC_LPRN);
  276. } else {
  277. tap_code16(KC_LPRN);
  278. tap_code16(KC_RPRN);
  279. tap_code(KC_LEFT);
  280. }
  281. }
  282. void dance_brc(tap_dance_state_t *state, void *user_data) {
  283. if (state->count == 1) {
  284. tap_code(KC_LBRC);
  285. } else {
  286. tap_code(KC_LBRC);
  287. tap_code(KC_RBRC);
  288. tap_code(KC_LEFT);
  289. }
  290. }
  291. void dance_cbr(tap_dance_state_t *state, void *user_data) {
  292. if (state->count == 1) {
  293. tap_code16(KC_LCBR);
  294. } else {
  295. tap_code16(KC_LCBR);
  296. tap_code16(KC_RCBR);
  297. tap_code(KC_LEFT);
  298. }
  299. }
  300. void dance_prn_de(tap_dance_state_t *state, void *user_data) {
  301. if (state->count == 1) {
  302. tap_code16(KC_ASTR);
  303. } else {
  304. tap_code16(KC_ASTR);
  305. tap_code16(KC_LPRN);
  306. tap_code(KC_LEFT);
  307. }
  308. }
  309. void dance_brc_de(tap_dance_state_t *state, void *user_data) {
  310. if (state->count == 1) {
  311. tap_code16(RALT(KC_8));
  312. } else {
  313. tap_code16(RALT(KC_8));
  314. tap_code16(RALT(KC_9));
  315. tap_code(KC_LEFT);
  316. }
  317. }
  318. void dance_cbr_de(tap_dance_state_t *state, void *user_data) {
  319. if (state->count == 1) {
  320. tap_code16(RALT(KC_7));
  321. } else {
  322. tap_code16(RALT(KC_7));
  323. tap_code16(RALT(KC_0));
  324. tap_code(KC_LEFT);
  325. }
  326. }
  327. void vim_gg(tap_dance_state_t *state, void *user_data) {
  328. if (state->count == 1) {
  329. tap_code16(LCTL(KC_END));
  330. } else {
  331. tap_code16(LCTL(KC_HOME));
  332. }
  333. }
  334. tap_dance_action_t tap_dance_actions[] = {
  335. // declare tap dance actions here
  336. [TD_PRN] = ACTION_TAP_DANCE_FN(dance_prn), [TD_BRC] = ACTION_TAP_DANCE_FN(dance_brc), [TD_CBR] = ACTION_TAP_DANCE_FN(dance_cbr), [TD_PRN_DE] = ACTION_TAP_DANCE_FN(dance_prn_de), [TD_BRC_DE] = ACTION_TAP_DANCE_FN(dance_brc_de), [TD_CBR_DE] = ACTION_TAP_DANCE_FN(dance_cbr_de), [TD_VIM_GG] = ACTION_TAP_DANCE_FN(vim_gg)};
  337. float thumb_factor = 0.95;
  338. float index_factor = 1.1;
  339. float middle_factor = 1.2;
  340. float ring_factor = 1.25;
  341. float pinky_factor = 1.15;
  342. float td_factor = 1.4;
  343. // define the per_key_tapping_term
  344. uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
  345. switch (keycode) {
  346. // thumb keys
  347. case RSFT_T(KC_DEL):
  348. return TAPPING_TERM * thumb_factor;
  349. case RCTL_T(KC_TAB):
  350. return TAPPING_TERM * thumb_factor;
  351. case LT(_NAV, KC_LEFT):
  352. return TAPPING_TERM * thumb_factor;
  353. case LT(_NAV, KC_RIGHT):
  354. return TAPPING_TERM * thumb_factor;
  355. case LT(_LOWER, KC_BSPC):
  356. return TAPPING_TERM * thumb_factor;
  357. case LT(_LOWER_DE, KC_BSPC):
  358. return TAPPING_TERM * thumb_factor;
  359. case LT(_RAISE, KC_ENT):
  360. return TAPPING_TERM * thumb_factor;
  361. case LT(_RAISE_DE, KC_ENT):
  362. return TAPPING_TERM * thumb_factor;
  363. case LT(_NAV, KC_SPC):
  364. return TAPPING_TERM * 1.0;
  365. case LALT_T(KC_ESC):
  366. return TAPPING_TERM * thumb_factor;
  367. // index finger keys
  368. case LCTL_T(KC_P):
  369. return TAPPING_TERM * index_factor;
  370. case RCTL_T(KC_L):
  371. return TAPPING_TERM * (index_factor + 0.1);
  372. case LT(_NUM, KC_B):
  373. return TAPPING_TERM * (index_factor + 0.1);
  374. case LT(_NUM, KC_J):
  375. return TAPPING_TERM * index_factor;
  376. // middle finger keys
  377. case LSFT_T(KC_F):
  378. return TAPPING_TERM * middle_factor;
  379. case RSFT_T(KC_U):
  380. return TAPPING_TERM * middle_factor;
  381. // ring finger keys
  382. case LALT_T(KC_W):
  383. return TAPPING_TERM * ring_factor;
  384. case LALT_T(KC_Y):
  385. return TAPPING_TERM * ring_factor;
  386. case LGUI_T(KC_TAB):
  387. return TAPPING_TERM * ring_factor;
  388. // pinky keys
  389. case LGUI_T(KC_Q):
  390. return TAPPING_TERM * pinky_factor;
  391. case RGUI_T(KC_SCLN):
  392. return TAPPING_TERM * pinky_factor;
  393. case RGUI_T(KC_LBRC):
  394. return TAPPING_TERM * pinky_factor;
  395. case LT(_MOUSE, KC_Z):
  396. return TAPPING_TERM * pinky_factor;
  397. case LT(_MOUSE, KC_SLSH):
  398. return TAPPING_TERM * pinky_factor;
  399. case LCTL_T(KC_CAPS):
  400. return TAPPING_TERM * pinky_factor;
  401. // tap-dance actions
  402. case TD(TD_PRN):
  403. return TAPPING_TERM * td_factor;
  404. case TD(TD_BRC):
  405. return TAPPING_TERM * td_factor;
  406. case TD(TD_CBR):
  407. return TAPPING_TERM * td_factor;
  408. case TD(TD_PRN_DE):
  409. return TAPPING_TERM * td_factor;
  410. case TD(TD_BRC_DE):
  411. return TAPPING_TERM * td_factor;
  412. case TD(TD_CBR_DE):
  413. return TAPPING_TERM * td_factor;
  414. case TD(TD_VIM_GG):
  415. return TAPPING_TERM * td_factor;
  416. default:
  417. return TAPPING_TERM;
  418. }
  419. }
  420. // alt tab function setup
  421. bool is_alt_tab_active = false;
  422. bool is_ctl_tab_active = false;
  423. bool de_layout_active = false;
  424. static uint16_t key_timer;
  425. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  426. switch (keycode) {
  427. case WIDECOLEMAK:
  428. if (record->event.pressed) {
  429. set_single_persistent_default_layer(_WIDECOLEMAK);
  430. }
  431. return false;
  432. break;
  433. case HRWIDECOLEMAK:
  434. if (record->event.pressed) {
  435. set_single_persistent_default_layer(_HRWIDECOLEMAK);
  436. }
  437. return false;
  438. break;
  439. case GAMING:
  440. if (record->event.pressed) {
  441. layer_invert(_GAMING);
  442. }
  443. return false;
  444. break;
  445. case TG_COLEMAK:
  446. if (record->event.pressed) {
  447. tap_code(KC_ENT);
  448. layer_invert(_WIDECOLEMAK);
  449. }
  450. return false;
  451. break;
  452. case VIM_O:
  453. if (record->event.pressed) {
  454. tap_code(KC_END);
  455. tap_code(KC_ENT);
  456. }
  457. return false;
  458. break;
  459. case VIM_V:
  460. if (record->event.pressed) {
  461. if (get_mods() & MOD_MASK_SHIFT) {
  462. clear_mods();
  463. } else {
  464. register_mods(MOD_LSFT);
  465. }
  466. }
  467. return false;
  468. break;
  469. case KC_SVU_BU: // increase backlight when pressing shift and vol up
  470. if (record->event.pressed) {
  471. if (get_mods() & MOD_MASK_SHIFT) {
  472. register_code(KC_BRIU);
  473. } else if (get_mods() & MOD_MASK_CTRL) {
  474. register_code(KC_MNXT);
  475. } else {
  476. register_code(KC_VOLU);
  477. }
  478. } else {
  479. unregister_code(KC_BRIU);
  480. unregister_code(KC_MNXT);
  481. unregister_code(KC_VOLU);
  482. }
  483. return false;
  484. case KC_SVD_BD: // decrease backlight when pressing shift and vol up
  485. if (record->event.pressed) {
  486. if (get_mods() & MOD_MASK_SHIFT) {
  487. register_code(KC_BRID);
  488. } else if (get_mods() & MOD_MASK_CTRL) {
  489. register_code(KC_MPRV);
  490. } else {
  491. register_code(KC_VOLD);
  492. }
  493. } else {
  494. unregister_code(KC_BRID);
  495. unregister_code(KC_MPRV);
  496. unregister_code(KC_VOLD);
  497. }
  498. return false;
  499. case KC_TAB_MPLY: // press tab or play/pause when ctrl is pressed
  500. if (record->event.pressed) {
  501. if (get_mods() & MOD_MASK_CTRL) {
  502. register_code(KC_MPLY);
  503. } else {
  504. register_code(KC_TAB);
  505. }
  506. } else {
  507. unregister_code(KC_MPLY);
  508. unregister_code(KC_TAB);
  509. }
  510. return false;
  511. case ALT_TAB:
  512. if (record->event.pressed) {
  513. if (!is_alt_tab_active) {
  514. is_alt_tab_active = true;
  515. add_mods(MOD_BIT(KC_LALT));
  516. }
  517. register_code(KC_TAB);
  518. } else {
  519. unregister_code(KC_TAB);
  520. }
  521. break;
  522. case CTL_TAB:
  523. if (record->event.pressed) {
  524. if (!is_ctl_tab_active) {
  525. is_ctl_tab_active = true;
  526. add_mods(MOD_BIT(KC_LCTL));
  527. }
  528. register_code(KC_TAB);
  529. } else {
  530. unregister_code(KC_TAB);
  531. }
  532. break;
  533. // the next case allows us to use alt_tab without a timer
  534. case LT(_NAV, KC_SPC):
  535. if (record->event.pressed) {
  536. } else {
  537. unregister_mods(MOD_LALT);
  538. unregister_mods(MOD_LCTL);
  539. is_alt_tab_active = false;
  540. is_ctl_tab_active = false;
  541. }
  542. break;
  543. case DE_ae:
  544. if (record->event.pressed) {
  545. uint8_t temp_mods = get_mods();
  546. if ((get_mods() | get_oneshot_mods()) & MOD_MASK_SHIFT) {
  547. clear_oneshot_mods();
  548. clear_mods();
  549. add_mods(MOD_BIT(KC_LALT));
  550. tap_code(KC_P0);
  551. tap_code(KC_P1);
  552. tap_code(KC_P9);
  553. tap_code(KC_P6); // Ä
  554. } else {
  555. clear_mods();
  556. add_mods(MOD_BIT(KC_LALT));
  557. tap_code(KC_P0);
  558. tap_code(KC_P2);
  559. tap_code(KC_P2);
  560. tap_code(KC_P8); // ä
  561. }
  562. unregister_mods(MOD_LALT);
  563. set_mods(temp_mods);
  564. }
  565. return false;
  566. break;
  567. case DE_AE:
  568. if (record->event.pressed) {
  569. uint8_t temp_mods = get_mods() | get_oneshot_mods();
  570. clear_oneshot_mods();
  571. clear_mods();
  572. add_mods(MOD_BIT(KC_LALT));
  573. tap_code(KC_P0);
  574. tap_code(KC_P1);
  575. tap_code(KC_P9);
  576. tap_code(KC_P6); // Ä
  577. unregister_mods(MOD_LALT);
  578. set_mods(temp_mods);
  579. }
  580. return false;
  581. break;
  582. case DE_oe:
  583. if (record->event.pressed) {
  584. uint8_t temp_mods = get_mods();
  585. if ((get_mods() | get_oneshot_mods()) & MOD_MASK_SHIFT) {
  586. clear_oneshot_mods();
  587. clear_mods();
  588. add_mods(MOD_BIT(KC_LALT));
  589. tap_code(KC_P0);
  590. tap_code(KC_P2);
  591. tap_code(KC_P1);
  592. tap_code(KC_P4); // Ö
  593. } else {
  594. clear_mods();
  595. add_mods(MOD_BIT(KC_LALT));
  596. tap_code(KC_P0);
  597. tap_code(KC_P2);
  598. tap_code(KC_P4);
  599. tap_code(KC_P6); // ö
  600. }
  601. unregister_mods(MOD_LALT);
  602. set_mods(temp_mods);
  603. }
  604. return false;
  605. break;
  606. case DE_OE:
  607. if (record->event.pressed) {
  608. uint8_t temp_mods = get_mods() | get_oneshot_mods();
  609. clear_oneshot_mods();
  610. clear_mods();
  611. add_mods(MOD_BIT(KC_LALT));
  612. tap_code(KC_P0);
  613. tap_code(KC_P2);
  614. tap_code(KC_P1);
  615. tap_code(KC_P4); // Ö
  616. unregister_mods(MOD_LALT);
  617. set_mods(temp_mods);
  618. }
  619. return false;
  620. break;
  621. case DE_ue:
  622. if (record->event.pressed) {
  623. uint8_t temp_mods = get_mods();
  624. if ((get_mods() | get_oneshot_mods()) & MOD_MASK_SHIFT) {
  625. clear_oneshot_mods();
  626. clear_mods();
  627. add_mods(MOD_BIT(KC_LALT));
  628. tap_code(KC_P0);
  629. tap_code(KC_P2);
  630. tap_code(KC_P2);
  631. tap_code(KC_P0); // Ü
  632. } else {
  633. clear_mods();
  634. add_mods(MOD_BIT(KC_LALT));
  635. tap_code(KC_P0);
  636. tap_code(KC_P2);
  637. tap_code(KC_P5);
  638. tap_code(KC_P2); // ü
  639. }
  640. unregister_mods(MOD_LALT);
  641. set_mods(temp_mods);
  642. }
  643. return false;
  644. break;
  645. case KC_DE_SWITCH:
  646. if (record->event.pressed) {
  647. if (de_layout_active) {
  648. de_layout_active = false; // deactivate German overlay
  649. set_single_persistent_default_layer(_HRWIDECOLEMAK);
  650. } else {
  651. de_layout_active = true; // activate German overlay
  652. set_single_persistent_default_layer(_HRWIDECOLEMAK_DE);
  653. }
  654. return false;
  655. }
  656. break;
  657. case LANG_SWITCH:
  658. if (record->event.pressed) {
  659. register_mods(MOD_LALT);
  660. register_code(KC_LSFT);
  661. if (de_layout_active) {
  662. de_layout_active = false; // deactivate German overlay
  663. set_single_persistent_default_layer(_HRWIDECOLEMAK);
  664. } else {
  665. de_layout_active = true; // activate German overlay
  666. set_single_persistent_default_layer(_HRWIDECOLEMAK_DE);
  667. }
  668. } else {
  669. unregister_code(KC_LSFT);
  670. unregister_mods(MOD_LALT);
  671. }
  672. return false;
  673. case DE_SZ:
  674. if (record->event.pressed) {
  675. uint8_t temp_mods = get_mods();
  676. if ((get_mods() | get_oneshot_mods()) & MOD_MASK_SHIFT) {
  677. clear_oneshot_mods();
  678. clear_mods();
  679. add_mods(MOD_BIT(KC_LALT));
  680. tap_code(KC_P0);
  681. tap_code(KC_P1);
  682. tap_code(KC_P7);
  683. tap_code(KC_P6); // °
  684. } else {
  685. clear_mods();
  686. add_mods(MOD_BIT(KC_LALT));
  687. tap_code(KC_P0);
  688. tap_code(KC_P2);
  689. tap_code(KC_P2);
  690. tap_code(KC_P3); // ß
  691. }
  692. unregister_mods(MOD_LALT);
  693. set_mods(temp_mods);
  694. }
  695. return false;
  696. break;
  697. case DE_EGRAVE:
  698. if (record->event.pressed) {
  699. uint8_t temp_mods = get_mods();
  700. if ((get_mods() | get_oneshot_mods()) & MOD_MASK_SHIFT) {
  701. clear_oneshot_mods();
  702. clear_mods();
  703. add_mods(MOD_BIT(KC_LALT));
  704. tap_code(KC_P0);
  705. tap_code(KC_P2);
  706. tap_code(KC_P0);
  707. tap_code(KC_P0); // È
  708. } else {
  709. clear_mods();
  710. add_mods(MOD_BIT(KC_LALT));
  711. tap_code(KC_P0);
  712. tap_code(KC_P2);
  713. tap_code(KC_P3);
  714. tap_code(KC_P2); // è
  715. }
  716. unregister_mods(MOD_LALT);
  717. set_mods(temp_mods);
  718. }
  719. return false;
  720. break;
  721. case DE_EAIGU:
  722. if (record->event.pressed) {
  723. uint8_t temp_mods = get_mods();
  724. if ((get_mods() | get_oneshot_mods()) & MOD_MASK_SHIFT) {
  725. clear_oneshot_mods();
  726. clear_mods();
  727. add_mods(MOD_BIT(KC_LALT));
  728. tap_code(KC_P0);
  729. tap_code(KC_P2);
  730. tap_code(KC_P0);
  731. tap_code(KC_P1); // É
  732. } else {
  733. clear_mods();
  734. add_mods(MOD_BIT(KC_LALT));
  735. tap_code(KC_P0);
  736. tap_code(KC_P2);
  737. tap_code(KC_P3);
  738. tap_code(KC_P3); // é
  739. }
  740. unregister_mods(MOD_LALT);
  741. set_mods(temp_mods);
  742. }
  743. return false;
  744. break;
  745. case KC_CURRENCY:
  746. if (record->event.pressed) {
  747. uint8_t temp_mods = get_mods();
  748. if ((get_mods() | get_oneshot_mods()) & MOD_MASK_SHIFT) {
  749. clear_oneshot_mods();
  750. clear_mods();
  751. add_mods(MOD_BIT(KC_LALT));
  752. tap_code(KC_P1);
  753. tap_code(KC_P5);
  754. tap_code(KC_P7); // ¥
  755. } else {
  756. clear_mods();
  757. add_mods(MOD_BIT(KC_LALT));
  758. tap_code(KC_P0);
  759. tap_code(KC_P1);
  760. tap_code(KC_P2);
  761. tap_code(KC_P8); // €
  762. }
  763. unregister_mods(MOD_LALT);
  764. set_mods(temp_mods);
  765. }
  766. return false;
  767. break;
  768. case DE_SLSH_QUST:
  769. if (record->event.pressed) {
  770. key_timer = timer_read();
  771. layer_on(_MOUSE);
  772. } else {
  773. if (timer_elapsed(key_timer) < (TAPPING_TERM * pinky_factor)) {
  774. layer_off(_MOUSE);
  775. uint8_t temp_mods = get_mods() | get_oneshot_mods();
  776. if (temp_mods & MOD_MASK_SHIFT) {
  777. tap_code(KC_MINS); // ?
  778. } else {
  779. tap_code16(KC_AMPR); // /
  780. }
  781. } else {
  782. layer_off(_MOUSE);
  783. }
  784. }
  785. return false;
  786. break;
  787. case DE_QUOT:
  788. if (record->event.pressed) {
  789. uint8_t temp_mods = get_mods() | get_oneshot_mods();
  790. if (temp_mods & MOD_MASK_SHIFT) {
  791. register_code(KC_2); // \"
  792. } else {
  793. register_code16(KC_PIPE); // /'
  794. }
  795. } else {
  796. unregister_code(KC_2);
  797. unregister_code16(KC_PIPE);
  798. }
  799. return true;
  800. case DE_DOT_RAB:
  801. if (record->event.pressed) {
  802. uint8_t temp_mods = get_mods() | get_oneshot_mods();
  803. if (temp_mods & MOD_MASK_SHIFT) {
  804. register_code16(LSFT(KC_NUBS)); // > right angle bracket
  805. } else {
  806. register_code(KC_DOT); // .
  807. }
  808. } else {
  809. unregister_code16(LSFT(KC_NUBS));
  810. unregister_code(KC_DOT);
  811. }
  812. return true;
  813. case DE_COMM_LAB:
  814. if (record->event.pressed) {
  815. uint8_t temp_mods = get_mods() | get_oneshot_mods();
  816. if (temp_mods & MOD_MASK_SHIFT) {
  817. clear_mods();
  818. clear_oneshot_mods();
  819. register_code16(KC_NUBS); // < left angle bracket
  820. set_mods(temp_mods);
  821. } else {
  822. register_code(KC_COMM); // ,
  823. }
  824. } else {
  825. unregister_code16(KC_NUBS);
  826. unregister_code(KC_COMM);
  827. }
  828. return true;
  829. case DE_SCLN:
  830. if (record->event.pressed) {
  831. uint8_t temp_mods = get_mods() | get_oneshot_mods();
  832. if (temp_mods & MOD_MASK_SHIFT) {
  833. tap_code(KC_DOT); // ;
  834. } else {
  835. add_mods(MOD_BIT(KC_LSFT));
  836. tap_code(KC_COMM); // :
  837. del_mods(MOD_BIT(KC_LSFT));
  838. }
  839. return false;
  840. }
  841. break;
  842. case DE_BSLS:
  843. if (record->event.pressed) {
  844. uint8_t temp_mods = get_mods() | get_oneshot_mods();
  845. clear_mods();
  846. clear_oneshot_mods();
  847. add_mods(MOD_BIT(KC_RALT));
  848. if (temp_mods & MOD_MASK_SHIFT) {
  849. register_code(KC_NUBS); // | Pipe
  850. } else {
  851. register_code(KC_MINS); // Backslash
  852. }
  853. set_mods(temp_mods);
  854. } else {
  855. unregister_code(KC_NUBS);
  856. unregister_code(KC_MINS);
  857. }
  858. return true;
  859. // switch multiplexing for escape, short tap for escape, long press for context menu
  860. case M_ESCM:
  861. if (record->event.pressed) {
  862. key_timer = timer_read();
  863. } else {
  864. if (timer_elapsed(key_timer) > TAPPING_TERM) {
  865. tap_code(KC_APP);
  866. } else {
  867. tap_code(KC_ESC);
  868. }
  869. }
  870. return false;
  871. case M_RGUI_SCLN:
  872. if (record->event.pressed) {
  873. key_timer = timer_read();
  874. add_mods(MOD_BIT(KC_RGUI));
  875. } else {
  876. del_mods(MOD_BIT(KC_RGUI));
  877. if (timer_elapsed(key_timer) < (TAPPING_TERM * pinky_factor)) {
  878. uint8_t temp_mods = get_mods() | get_oneshot_mods();
  879. if (temp_mods & MOD_MASK_SHIFT) {
  880. tap_code(KC_DOT); // ;
  881. } else {
  882. add_mods(MOD_BIT(KC_LSFT));
  883. tap_code(KC_COMM); // :
  884. del_mods(MOD_BIT(KC_LSFT));
  885. }
  886. } else {
  887. tap_code(KC_RGUI);
  888. }
  889. }
  890. return false;
  891. break;
  892. }
  893. return true;
  894. }
  895. bool muse_mode = false;
  896. uint8_t last_muse_note = 0;
  897. uint16_t muse_counter = 0;
  898. uint8_t muse_offset = 70;
  899. uint16_t muse_tempo = 50;
  900. bool encoder_update_user(uint8_t index, bool clockwise) {
  901. if (muse_mode) {
  902. if (IS_LAYER_ON(_RAISE)) {
  903. if (clockwise) {
  904. muse_offset++;
  905. } else {
  906. muse_offset--;
  907. }
  908. } else {
  909. if (clockwise) {
  910. muse_tempo += 1;
  911. } else {
  912. muse_tempo -= 1;
  913. }
  914. }
  915. } else {
  916. if (clockwise) {
  917. #ifdef MOUSEKEY_ENABLE
  918. tap_code(KC_MS_WH_DOWN);
  919. #else
  920. tap_code(KC_PGDN);
  921. #endif
  922. } else {
  923. #ifdef MOUSEKEY_ENABLE
  924. tap_code(KC_MS_WH_UP);
  925. #else
  926. tap_code(KC_PGUP);
  927. #endif
  928. }
  929. }
  930. return true;
  931. }
  932. bool dip_switch_update_user(uint8_t index, bool active) {
  933. switch (index) {
  934. case 0: {
  935. if (active) {
  936. layer_on(_ADJUST);
  937. } else {
  938. layer_off(_ADJUST);
  939. }
  940. break;
  941. }
  942. case 1:
  943. if (active) {
  944. muse_mode = true;
  945. } else {
  946. muse_mode = false;
  947. }
  948. }
  949. return true;
  950. }
  951. void leader_end_user(void) {
  952. if (leader_sequence_one_key(KC_F)) {
  953. // Anything you can do in a macro.
  954. SEND_STRING("QMK is awesome.");
  955. }
  956. if (leader_sequence_two_keys(KC_D, KC_D)) {
  957. SEND_STRING(SS_LCTL("a") SS_LCTL("c"));
  958. }
  959. if (leader_sequence_three_keys(KC_D, KC_D, KC_S)) {
  960. SEND_STRING("https://start.duckduckgo.com\n");
  961. }
  962. if (leader_sequence_two_keys(KC_A, KC_S)) {
  963. register_code(KC_LGUI);
  964. register_code(KC_S);
  965. unregister_code(KC_S);
  966. unregister_code(KC_LGUI);
  967. }
  968. }
  969. void matrix_scan_user(void) {
  970. #ifdef AUDIO_ENABLE
  971. if (muse_mode) {
  972. if (muse_counter == 0) {
  973. uint8_t muse_note = muse_offset + SCALE[muse_clock_pulse()];
  974. if (muse_note != last_muse_note) {
  975. stop_note(compute_freq_for_midi_note(last_muse_note));
  976. play_note(compute_freq_for_midi_note(muse_note), 0xF);
  977. last_muse_note = muse_note;
  978. }
  979. }
  980. muse_counter = (muse_counter + 1) % muse_tempo;
  981. } else {
  982. if (muse_counter) {
  983. stop_all_notes();
  984. muse_counter = 0;
  985. }
  986. }
  987. #endif
  988. }
  989. bool music_mask_user(uint16_t keycode) {
  990. switch (keycode) {
  991. case RAISE:
  992. case LOWER:
  993. return false;
  994. default:
  995. return true;
  996. }
  997. }
  998. uint16_t get_quick_tap_term(uint16_t keycode, keyrecord_t *record) {
  999. switch (keycode) {
  1000. case LSFT_T(KC_S):
  1001. return 0;
  1002. case RSFT_T(KC_E):
  1003. return 0;
  1004. case LSFT_T(KC_D):
  1005. return 0;
  1006. case RSFT_T(KC_K):
  1007. return 0;
  1008. case LSFT_T(KC_F):
  1009. return 0;
  1010. case RSFT_T(KC_U):
  1011. return 0;
  1012. case LT(_RAISE, KC_ENT):
  1013. return 0;
  1014. case LT(_RAISE_DE, KC_ENT):
  1015. return 0;
  1016. case LT(_LOWER, KC_BSPC):
  1017. return 0;
  1018. case LT(_LOWER_DE, KC_BSPC):
  1019. return 0;
  1020. default:
  1021. return QUICK_TAP_TERM;
  1022. }
  1023. }
  1024. // Set RGB to change with layer changes
  1025. #define HSV_DARKORANGE 10, 255, 255
  1026. #define HSV_DARKPINK 150, 100, 255
  1027. #define HSV_GRASS 57, 255, 255
  1028. #define HSV_OCEAN 148, 255, 255
  1029. // Light LEDs 1 to 9 in darkorange when HRCOLEMAK is active
  1030. const rgblight_segment_t PROGMEM my_layer0_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, 10, HSV_DARKORANGE});
  1031. // Light LEDs 1 to 9 in green when HRWIDECOLEMAK is active
  1032. const rgblight_segment_t PROGMEM my_layer1_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, 10, HSV_OCEAN});
  1033. // Light LEDs 1 to 9 in darkorange when de_layout_active is true
  1034. const rgblight_segment_t PROGMEM my_layer2_layer[] = RGBLIGHT_LAYER_SEGMENTS({3, 4, HSV_DARKORANGE}, {0, 3, HSV_OCEAN}, {8, 3, HSV_OCEAN});
  1035. // Light LEDs 1 to 9 in red when GAMING layer is active
  1036. const rgblight_segment_t PROGMEM my_layer3_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, 10, HSV_RED});
  1037. // Light LEDs 1 to 9 in white when WIDECOLEMAK is active
  1038. const rgblight_segment_t PROGMEM my_layer4_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, 10, HSV_WHITE});
  1039. // Light bottom LEDs in purple when ADJUST layer is active
  1040. const rgblight_segment_t PROGMEM my_layer5_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, 2, HSV_MAGENTA}, {7, 3, HSV_MAGENTA});
  1041. // Light bottom LEDs in red when caps lock is active. Hard to ignore!
  1042. const rgblight_segment_t PROGMEM my_capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, 3, HSV_GRASS}, {7, 3, HSV_GRASS});
  1043. // Light LEDs 1 to 9 in white when NAVIGATION is active
  1044. const rgblight_segment_t PROGMEM my_nav_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, 10, HSV_WHITE});
  1045. // Now define the array of layers. Later layers take precedence
  1046. const rgblight_segment_t *const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(my_layer0_layer, // hrcolemak
  1047. my_layer1_layer, // hrwidecolemak
  1048. my_layer2_layer, // de_layout
  1049. my_layer3_layer, // gaming
  1050. my_layer4_layer, // widecolemak
  1051. my_layer5_layer, // adjust
  1052. my_nav_layer, // nav
  1053. my_capslock_layer // capslock
  1054. );
  1055. void keyboard_post_init_user(void) {
  1056. // Enable the LED layers
  1057. rgblight_layers = my_rgb_layers;
  1058. }
  1059. bool led_update_user(led_t led_state) {
  1060. rgblight_set_layer_state(7, led_state.caps_lock);
  1061. return true;
  1062. }
  1063. layer_state_t layer_state_set_user(layer_state_t state) {
  1064. rgblight_set_layer_state(3, layer_state_cmp(state, _GAMING));
  1065. rgblight_set_layer_state(4, layer_state_cmp(state, _WIDECOLEMAK));
  1066. if ((layer_state_cmp(state, _LOWER) && layer_state_cmp(state, _RAISE)) || (layer_state_cmp(state, _LOWER_DE) && layer_state_cmp(state, _RAISE_DE))) {
  1067. return state | (1UL << _ADJUST);
  1068. } else {
  1069. return state & ~(1UL << _ADJUST);
  1070. }
  1071. // state = update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
  1072. rgblight_set_layer_state(5, layer_state_cmp(state, _ADJUST));
  1073. // return state;
  1074. }
  1075. layer_state_t default_layer_state_set_user(layer_state_t state) {
  1076. rgblight_set_layer_state(4, layer_state_cmp(state, _WIDECOLEMAK));
  1077. rgblight_set_layer_state(1, layer_state_cmp(state, _HRWIDECOLEMAK));
  1078. rgblight_set_layer_state(2, layer_state_cmp(state, _HRWIDECOLEMAK_DE));
  1079. return state;
  1080. }