keymap.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
  1. /* Copyright 2021 Richard Nunez <antebios1@gmail.com>
  2. *
  3. * This program is free software: you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License as published by
  5. * the Free Software Foundation, either version 2 of the License, or
  6. * (at your option) any later version.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include QMK_KEYBOARD_H
  17. // Keep track of key presses for Modifier
  18. typedef struct {
  19. bool is_press_action;
  20. int state;
  21. } tap;
  22. // Key Tap enumerator
  23. enum {
  24. SINGLE_TAP = 1,
  25. SINGLE_HOLD = 2,
  26. DOUBLE_TAP = 3,
  27. DOUBLE_HOLD = 4,
  28. TRIPLE_TAP = 5,
  29. TRIPLE_HOLD = 6
  30. };
  31. // Each layer gets a name for readability, which is then used in the keymap matrix below.
  32. // The underscores don't mean anything - you can have a layer called STUFF or any other name.
  33. // Layer names don't all need to be of the same length, obviously, and you can also skip them
  34. // entirely and just use numbers.
  35. enum custom_layer {
  36. _QWERTY,
  37. _ALT,
  38. _CTRL,
  39. _LOWER,
  40. _RAISE,
  41. _MOUSE,
  42. _ADJUST,
  43. };
  44. enum custom_keycodes {
  45. QWERTY = SAFE_RANGE,
  46. ALT,
  47. CTRL,
  48. LOWER,
  49. RAISE,
  50. MOUSE,
  51. ADJUST
  52. };
  53. // TAP DANCE ***********************************************************
  54. //Tap Dance Declarations
  55. enum {
  56. ALT_OSL1 = 0,
  57. CTL_OSL1,
  58. TD_DEL_BSPC ,
  59. TD_ESC_GRAVE,
  60. TD_TAB_TILDE,
  61. TD_9_LPRN,
  62. TD_0_RPRN,
  63. TD_MINS_UNDS,
  64. TD_EQL_PLUS,
  65. TD_LBRC_LCBR,
  66. TD_RBRC_RCBR,
  67. TD_SCLN_COLN,
  68. TD_QUOT_DQT,
  69. TD_COMM_LABK,
  70. TD_DOT_RABK,
  71. TD_SLSH_QUES,
  72. TD_BSLS_PIPE,
  73. TD_PGUP_HOME,
  74. TD_PGDN_END,
  75. TD_Q_LrALT,
  76. TD_W_Lyr2,
  77. TD_E_Lyr3,
  78. TD_R_LrKey,
  79. TD_T_LrMS,
  80. TD_SHIFT_CAPS,
  81. TD_SPC_ENT,
  82. TD_LayerDn,
  83. TD_LayerUp
  84. };
  85. // Alt key action:
  86. // SINGLE_TAP = toggle layer, then wait for keypress on called layer, then switch back to original layer.
  87. // SINGLE_HOLD = will work as normal sending the keypress.
  88. // DOUBLE_TAP = 3,
  89. // DOUBLE_HOLD = will then toggle layer and keep sending the Alt keycode until next keypress, then switch back to original layer.
  90. // TRIPLE_TAP = 5,
  91. // TRIPLE_HOLD = 6
  92. // // Alt held down, then use as normal.
  93. //
  94. // Alt tapped, then hold Alt,
  95. int cur_dance (qk_tap_dance_state_t *state);
  96. void alt_finished (qk_tap_dance_state_t *state, void *user_data);
  97. void alt_reset (qk_tap_dance_state_t *state, void *user_data);
  98. int cur_dance (qk_tap_dance_state_t *state) {
  99. if (state->count == 1) {
  100. if (state->pressed) return SINGLE_HOLD;
  101. else return SINGLE_TAP;
  102. }
  103. else if (state->count == 2) {
  104. if (state->pressed) return DOUBLE_HOLD;
  105. else return DOUBLE_TAP;
  106. }
  107. else if (state->count == 3) {
  108. if (state->interrupted || !state->pressed) return TRIPLE_TAP;
  109. else return TRIPLE_HOLD;
  110. }
  111. else return 8;
  112. }
  113. static tap alttap_state = {
  114. .is_press_action = true,
  115. .state = 0
  116. };
  117. void alt_finished (qk_tap_dance_state_t *state, void *user_data) {
  118. alttap_state.state = cur_dance(state);
  119. switch (alttap_state.state) {
  120. case SINGLE_TAP: set_oneshot_layer(_ALT, ONESHOT_START); clear_oneshot_layer_state(ONESHOT_PRESSED); break;
  121. case SINGLE_HOLD: register_code(KC_LALT); break;
  122. case DOUBLE_TAP: set_oneshot_layer(_ALT, ONESHOT_START); set_oneshot_layer(_ALT, ONESHOT_PRESSED); break;
  123. case DOUBLE_HOLD: register_code(KC_LALT); layer_on(_ALT); break;
  124. //Last case is for fast typing. Assuming your key is `f`:
  125. //For example, when typing the word `buffer`, and you want to make sure that you send `ff` and not `Esc`.
  126. //In order to type `ff` when typing fast, the next character will have to be hit within the `TAPPING_TERM`, which by default is 200ms.
  127. }
  128. }
  129. void alt_reset (qk_tap_dance_state_t *state, void *user_data) {
  130. switch (alttap_state.state) {
  131. case SINGLE_TAP: break;
  132. case SINGLE_HOLD: unregister_code(KC_LALT); break;
  133. case DOUBLE_TAP: break;
  134. case DOUBLE_HOLD: layer_off(_ALT); unregister_code(KC_LALT); break;
  135. }
  136. alttap_state.state = 0;
  137. }
  138. // Ctrl tapped, then hold Ctrl,
  139. void ctl_finished (qk_tap_dance_state_t *state, void *user_data);
  140. void ctl_reset (qk_tap_dance_state_t *state, void *user_data);
  141. static tap ctltap_state = {
  142. .is_press_action = true,
  143. .state = 0
  144. };
  145. void ctl_finished (qk_tap_dance_state_t *state, void *user_data) {
  146. ctltap_state.state = cur_dance(state);
  147. switch (ctltap_state.state) {
  148. case SINGLE_TAP: set_oneshot_mods(MOD_BIT(KC_LCTL)); break;
  149. case SINGLE_HOLD: register_code(KC_LCTL); break;
  150. case DOUBLE_TAP: set_oneshot_layer(_CTRL, ONESHOT_START); set_oneshot_layer(_CTRL, ONESHOT_PRESSED); break;
  151. case DOUBLE_HOLD: register_code(KC_LCTL); layer_on(_CTRL); break;
  152. //Last case is for fast typing. Assuming your key is `f`:
  153. //For example, when typing the word `buffer`, and you want to make sure that you send `ff` and not `Esc`.
  154. //In order to type `ff` when typing fast, the next character will have to be hit within the `TAPPING_TERM`, which by default is 200ms.
  155. }
  156. }
  157. void ctl_reset (qk_tap_dance_state_t *state, void *user_data) {
  158. switch (ctltap_state.state) {
  159. case SINGLE_TAP: break;
  160. case SINGLE_HOLD: unregister_code(KC_LCTL); break;
  161. case DOUBLE_TAP: break;
  162. case DOUBLE_HOLD: layer_off(_CTRL); unregister_code(KC_LCTL); break;
  163. }
  164. ctltap_state.state = 0;
  165. }
  166. // Layer Down tap dance
  167. void layerDown_finished (qk_tap_dance_state_t *state, void *user_data);
  168. void layerDown_reset (qk_tap_dance_state_t *state, void *user_data);
  169. static tap layerdn_tap_state = {
  170. .is_press_action = true,
  171. .state = 0
  172. };
  173. void layerDown_finished (qk_tap_dance_state_t *state, void *user_data) {
  174. layerdn_tap_state.state = cur_dance(state);
  175. switch (layerdn_tap_state.state) {
  176. case SINGLE_TAP: break;
  177. case SINGLE_HOLD: layer_on(_LOWER); break;
  178. case DOUBLE_TAP: layer_move(_QWERTY); break;
  179. case DOUBLE_HOLD: break;
  180. }
  181. }
  182. void layerDown_reset (qk_tap_dance_state_t *state, void *user_data) {
  183. switch (layerdn_tap_state.state) {
  184. case SINGLE_TAP: break;
  185. case SINGLE_HOLD: layer_off(_LOWER); break;
  186. case DOUBLE_TAP: break;
  187. case DOUBLE_HOLD: break;
  188. }
  189. layerdn_tap_state.state = 0;
  190. }
  191. // Shift key action:
  192. // Shift held down, then use as normal and use Shift Mode of key.
  193. // Shift tapped, then Capitlize next keystroke only.
  194. // Shift double-tapped, then CAPSLOCK
  195. // Shift double-tapped again, CAPS UNLOCKED
  196. // void dance_onshot_lsft(qk_tap_dance_state_t *state, void *user_data) {
  197. void lshift_finished (qk_tap_dance_state_t *state, void *user_data);
  198. void lshift_reset (qk_tap_dance_state_t *state, void *user_data);
  199. static tap lshifttap_state = {
  200. .is_press_action = true,
  201. .state = 0
  202. };
  203. void lshift_finished (qk_tap_dance_state_t *state, void *user_data) {
  204. lshifttap_state.state = cur_dance(state);
  205. switch (lshifttap_state.state) {
  206. case SINGLE_TAP: set_oneshot_mods(MOD_BIT(KC_LSFT)); break;
  207. case SINGLE_HOLD: register_code(KC_LSFT); break;
  208. case DOUBLE_TAP: tap_code (KC_CAPS); break;
  209. case DOUBLE_HOLD: break;
  210. }
  211. }
  212. void lshift_reset (qk_tap_dance_state_t *state, void *user_data) {
  213. switch (lshifttap_state.state) {
  214. case SINGLE_TAP: break;
  215. case SINGLE_HOLD: unregister_code(KC_LSFT); break;
  216. case DOUBLE_TAP: break;
  217. case DOUBLE_HOLD: break;
  218. }
  219. lshifttap_state.state = 0;
  220. }
  221. //Tap Dance Definitions
  222. qk_tap_dance_action_t tap_dance_actions[] = {
  223. [TD_DEL_BSPC] = ACTION_TAP_DANCE_DOUBLE(KC_DEL, KC_BSPC),
  224. [TD_ESC_GRAVE] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_GRAVE),
  225. [TD_TAB_TILDE] = ACTION_TAP_DANCE_DOUBLE(KC_TAB, KC_TILDE),
  226. [TD_9_LPRN] = ACTION_TAP_DANCE_DOUBLE(KC_9, KC_LPRN),
  227. [TD_0_RPRN] = ACTION_TAP_DANCE_DOUBLE(KC_0, KC_RPRN),
  228. [TD_MINS_UNDS] = ACTION_TAP_DANCE_DOUBLE(KC_MINS, KC_UNDS),
  229. [TD_EQL_PLUS] = ACTION_TAP_DANCE_DOUBLE(KC_EQL, KC_PLUS),
  230. [TD_LBRC_LCBR] = ACTION_TAP_DANCE_DOUBLE(KC_LBRC, KC_LCBR),
  231. [TD_RBRC_RCBR] = ACTION_TAP_DANCE_DOUBLE(KC_RBRC, KC_RCBR),
  232. [TD_SCLN_COLN] = ACTION_TAP_DANCE_DOUBLE(KC_SCLN, KC_COLN),
  233. [TD_QUOT_DQT] = ACTION_TAP_DANCE_DOUBLE(KC_QUOT, KC_DQT),
  234. [TD_COMM_LABK] = ACTION_TAP_DANCE_DOUBLE(KC_COMM, KC_LABK),
  235. [TD_DOT_RABK] = ACTION_TAP_DANCE_DOUBLE(KC_DOT, KC_RABK),
  236. [TD_SLSH_QUES] = ACTION_TAP_DANCE_DOUBLE(KC_SLSH, KC_QUES),
  237. [TD_BSLS_PIPE] = ACTION_TAP_DANCE_DOUBLE(KC_BSLS, KC_PIPE),
  238. [TD_PGUP_HOME] = ACTION_TAP_DANCE_DOUBLE(KC_PGUP, KC_HOME),
  239. [TD_PGDN_END] = ACTION_TAP_DANCE_DOUBLE(KC_PGUP, KC_END),
  240. [TD_Q_LrALT] = ACTION_TAP_DANCE_DUAL_ROLE(KC_Q, _ALT),
  241. [TD_R_LrKey] = ACTION_TAP_DANCE_DUAL_ROLE(KC_R, _RAISE),
  242. [TD_T_LrMS] = ACTION_TAP_DANCE_DUAL_ROLE(KC_T, _MOUSE),
  243. [TD_SHIFT_CAPS] = ACTION_TAP_DANCE_FN_ADVANCED(NULL,lshift_finished, lshift_reset),
  244. [TD_SPC_ENT] = ACTION_TAP_DANCE_DOUBLE(KC_SPACE, KC_ENT),
  245. [ALT_OSL1] = ACTION_TAP_DANCE_FN_ADVANCED(NULL,alt_finished, alt_reset),
  246. [CTL_OSL1] = ACTION_TAP_DANCE_FN_ADVANCED(NULL,ctl_finished, ctl_reset),
  247. [TD_LayerDn] = ACTION_TAP_DANCE_FN_ADVANCED(NULL,layerDown_finished, layerDown_reset)
  248. };
  249. // Fillers to make layering more clear
  250. // #define _______ KC_TRNS
  251. // #define XXXXXXX KC_NO
  252. #define KC_L1 LOWER
  253. #define KC_L2 RAISE
  254. // MO(_LOWER)
  255. // MO(_RAISE)
  256. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  257. /* Qwerty
  258. * ,-----------------------------------------------------------------------------------------------------.
  259. * | DEL/Bksp | 1 | 2 | 3 | 4 | 5 | DEL | Bksp | 6 | 7 | 8 | 9 | 0 | - |
  260. * |----------+------+------+------+------+------+------+------+------+------+------+------+------+------|
  261. * | Tab | Q | W | E | R | T | [ | ] | Y | U | I | O | P | = |
  262. * |----------+------+------+------+------+------+-------------+------+------+------+------+------+------|
  263. * | Enter | A | S | D | F | G | PGUP | HOME | H | J | K | L | ; | ' |
  264. * |----------+------+------+------+------+------+------|------+------+------+------+------+------+------|
  265. * | Shift | Z | X | C | V | B | PGDN | END | N | M | , | . | / | \ |
  266. * |----------+------+------+------+------+------+------+------+------+------+------+------+------+------|
  267. * | Ctrl | Win | Alt |Lower |Raise | Space/Enter | Space | <-- | v | ^ | --> | Esc |
  268. * `----------------------------------------------------------------------------------------------------'
  269. */
  270. [_QWERTY] = LAYOUT(
  271. //,-----------------+--------------+-------------+--------------+--------------+--------------+-----------------+-----------------+------+--------+----------------+---------------+---------------+-----------------.
  272. TD(TD_DEL_BSPC) , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_DELETE , KC_BSPACE , KC_6 , KC_7 , KC_8 , TD(TD_9_LPRN) , TD(TD_0_RPRN) ,TD(TD_MINS_UNDS),
  273. //|-----------------+--------------+-------------+--------------+--------------+--------------+-----------------+-----------------+------+--------+----------------+---------------+---------------+-----------------|
  274. TD(TD_TAB_TILDE) ,TD(TD_Q_LrALT), KC_W , KC_E ,TD(TD_R_LrKey), TD(TD_T_LrMS), TD(TD_LBRC_LCBR), TD(TD_RBRC_RCBR), KC_Y , KC_U , KC_I , KC_O , KC_P ,TD(TD_EQL_PLUS),
  275. //|-----------------+--------------+-------------+--------------+--------------+--------------+-----------------+-----------------+------+--------+----------------+---------------+----------------+----------------|
  276. KC_ENT , KC_A , KC_S , KC_D , KC_F , KC_G , KC_PGUP , KC_HOME , KC_H , KC_J , KC_K , KC_L ,TD(TD_SCLN_COLN),TD(TD_QUOT_DQT),
  277. //|-----------------+--------------+-------------+--------------+--------------+--------------+-----------------+-----------------+------+--------+----------------+---------------+----------------+----------------|
  278. TD(TD_SHIFT_CAPS), KC_Z , KC_X , KC_C , KC_V , KC_B , KC_PGDN , KC_END , KC_N , KC_M ,TD(TD_COMM_LABK),TD(TD_DOT_RABK),TD(TD_SLSH_QUES),TD(TD_BSLS_PIPE),
  279. //|-----------------+--------------+-------------+--------------+--------------+--------------+-----------------+-----------------+------+--------+----------------+---------------+----------------+----------------|
  280. TD(CTL_OSL1) , KC_LGUI , TD(ALT_OSL1),TD(TD_LayerDn), KC_L2 , TD(TD_SPC_ENT) , TD(TD_SPC_ENT) , KC_LEFT, KC_DOWN , KC_UP , KC_RIGHT ,TD(TD_ESC_GRAVE)
  281. //`-----------------+--------------+-------------+--------------+--------------+--------------------------------+------------------------+--------+----------------+---------------+----------------+----------------'
  282. ),
  283. /* ALT Layout
  284. * ,-----------------------------------------------------------------------------------------------------.
  285. * | DEL/Bksp | 1 | 2 | 3 | 4 | 5 | DEL | Bksp | 6 | 7 | 8 | 9 | 0 | - |
  286. * |----------+------+------+------+------+------+------+------+------+------+------+------+------+------|
  287. * | Tab | Q | W | E | R | T | [ | ] | Y | U | I | O | P | = |
  288. * |----------+------+------+------+------+------+-------------+------+------+------+------+------+------|
  289. * | Enter | A | S | D | F | G | PGUP | HOME | H | J | K | L | ; | ' |
  290. * |----------+------+------+------+------+------+------|------+------+------+------+------+------+------|
  291. * | Shift | Z | X | C | V | B | PGDN | END | N | M | , | . | / | \ |
  292. * |----------+------+------+------+------+------+------+------+------+------+------+------+------+------|
  293. * | Ctrl | Win | Alt | Fn |Lower | Space/Enter | Space | <-- | v | ^ | --> | Esc |
  294. * `----------------------------------------------------------------------------------------------------'
  295. */
  296. [_ALT] = LAYOUT(
  297. //,-----------------+-------------+-------------+--------------+--------------+---------+-----------------+-----------------+---------+---------+----------------+---------------+---------------+----------------.
  298. KC_TRNS , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_TRNS , KC_TRNS , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11,
  299. //|-----------------+-------------+-------------+--------------+--------------+---------+-----------------+-----------------+---------+---------+----------------+---------------+---------------+----------------|
  300. KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_F12,
  301. //|-----------------+-------------+-------------+--------------+--------------+---------+-----------------+-----------------+---------+---------+----------------+---------------+---------------+----------------|
  302. // KC_ENT , KC_A , KC_S , KC_D , KC_F , KC_G , KC_PGUP , KC_HOME , KC_H , KC_J , KC_K , KC_L ,TD(TD_SCLN_COLN),TD(TD_QUOT_DQT),
  303. KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS,
  304. //|-----------------+-------------+-------------+--------------+--------------+---------+-----------------+-----------------+---------+---------+----------------+---------------+---------------+----------------|
  305. KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS,
  306. //|-----------------+-------------+-------------+--------------+--------------+---------+-----------------+-----------------+---------+---------+----------------+---------------+---------------+----------------|
  307. TD(CTL_OSL1) , KC_LGUI , TD(ALT_OSL1),TD(TD_LayerDn), KC_L2 , TD(TD_SPC_ENT) , TD(TD_SPC_ENT) , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS ,TD(TD_ESC_GRAVE)
  308. //`-----------------+-------------+-------------+--------------+--------------+---------------------------+---------------------------+---------+----------------+---------------+---------------+----------------'
  309. ),
  310. /* CTRL Layout
  311. * ,-----------------------------------------------------------------------------------------------------.
  312. * | DEL/Bksp | F1 | F2 | F3 | F4 | F5 | DEL | Bksp | F6 | F7 | F8 | F9 | F10 | F11 |
  313. * |----------+------+------+------+------+------+------+------+------+------+------+------+------+------|
  314. * | Tab | Q | W | E | R | T | [ | ] | Y | U | I | O | P | F12 |
  315. * |----------+------+------+------+------+------+-------------+------+------+------+------+------+------|
  316. * | Enter | A | S | D | F | G | PGUP | HOME | H | J | K | L | ; | ' |
  317. * |----------+------+------+------+------+------+------|------+------+------+------+------+------+------|
  318. * | Shift | Z | X | C | V | B | PGDN | END | N | M | , | . | / | \ |
  319. * |----------+------+------+------+------+------+------+------+------+------+------+------+------+------|
  320. * | Ctrl | Win | Alt | Fn |Lower | Space/Enter | Space | <-- | v | ^ | --> | Esc |
  321. * `----------------------------------------------------------------------------------------------------'
  322. */
  323. [_CTRL] = LAYOUT(
  324. //,-----------------+-------------+-------------+--------------+--------------+---------+-----------------+-----------------+---------+---------+----------------+---------------+---------------+----------------.
  325. KC_TRNS , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_TRNS , KC_TRNS , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11,
  326. //|-----------------+-------------+-------------+--------------+--------------+---------+-----------------+-----------------+---------+---------+----------------+---------------+---------------+----------------|
  327. KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_F12,
  328. //|-----------------+-------------+-------------+--------------+--------------+---------+-----------------+-----------------+---------+---------+----------------+---------------+---------------+----------------|
  329. KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS,
  330. //|-----------------+-------------+-------------+--------------+--------------+---------+-----------------+-----------------+---------+---------+----------------+---------------+---------------+----------------|
  331. KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS,
  332. //|-----------------+-------------+-------------+--------------+--------------+---------+-----------------+-----------------+---------+---------+----------------+---------------+---------------+----------------|
  333. TD(CTL_OSL1) , KC_LGUI , TD(ALT_OSL1),TD(TD_LayerDn), KC_L2 , TD(TD_SPC_ENT) , TD(TD_SPC_ENT) , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS ,TD(TD_ESC_GRAVE)
  334. //`-----------------+-------------+-------------+--------------+--------------+---------------------------+---------------------------+---------+----------------+---------------+---------------+----------------'
  335. ),
  336. /* Lower
  337. * ,-------------------------------------------------------------------------------------------------.
  338. * | ` | F1 | F2 | F3 | F4 | F5 | | | F6 | F7 | F8 | F9 | F10 | F11 |
  339. * |------+------+------+------+------+------+------+-------------+------+------+------+------+------|
  340. * | ~ | | UP | | | | | | Prev | Next | Vol- | Vol+ | Play | F12 |
  341. * |------+------+------+------+------+------+------+-------------+------+------+------+------+------|
  342. * |Enter | LEFT | DOWN |RIGHT | | | | | | | MUTE | | | |
  343. * |------+------+------+------+------+------+------|------+------+------+------+------+------+------|
  344. * | | | | | | | | | | | | | | |
  345. * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
  346. * | | | | | | | | | | | | |
  347. * `------------------------------------------------------------------------------------------+------'
  348. */
  349. [_LOWER] = LAYOUT(
  350. KC_GRV , KC_F1 , KC_F2 , KC_F3 , KC_F4, KC_F5, KC_INS , _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
  351. KC_TILD, _______, KC_UP , _______ , _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, KC_F12,
  352. KC_ENT , KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, KC_MUTE, _______, _______, _______,
  353. _______, _______, _______, _______ , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  354. _______, _______, _______, _______ , _______, _______ , _______ , _______, _______, _______, _______, _______
  355. ),
  356. /* Raise
  357. * ,-------------------------------------------------------------------------------------------------.
  358. * | | | | | | | | | | | | | | |
  359. * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
  360. * ,-------------------------------------------------------------------------------------------------.
  361. * | Bksp | | | | | | | | | 7 | 8 | 9 | | |
  362. * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
  363. * | | | | | | | | | | 4 | 5 | 6 | - | / |
  364. * |------+------+------+------+------+-------------+------+------+------+------+------+------+------|
  365. * | | | | | | | | | | 1 | 2 | 3 | + | * |
  366. * |------+------+------+------+------+------|------+------+------+------+------+------+------+------|
  367. * | | | | | | | | | | 0 | , | . | = | |
  368. * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
  369. * |CtAlDl| | | | | | Enter | | | | | |
  370. * `-------------------------------------------------------------------------------------------------'
  371. */
  372. /*
  373. KC_INS
  374. KC_PSCR
  375. KC_SLCK
  376. KC_PAUS
  377. */
  378. [_RAISE] = LAYOUT(
  379. KC_BSPC , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_7 , KC_8 , KC_9 , _______, _______,
  380. XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_4 , KC_5 , KC_6 , KC_MINS, KC_SLSH,
  381. XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_1 , KC_2 , KC_3 , KC_PLUS, KC_ASTR,
  382. XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_0 , KC_COMM, KC_DOT , KC_EQL , XXXXXXX,
  383. LALT(LCTL(KC_DEL)), _______, _______, _______, _______, _______ , KC_ENT , _______, _______, _______, _______, _______
  384. ),
  385. /* Adjust (Lower + Raise)
  386. * ,-------------------------------------------------------------------------------------------------.
  387. * | | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |
  388. * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
  389. * | | | | |Reset | | | | | | | | | Del |
  390. * |------+------+------+------+------+------+------+-------------+------+------+------+------+------|
  391. * | | | | | |Audoff|Aud on|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | |
  392. * |------+------+------+------+------+------+------+------|------+------+------+------+------+------|
  393. * | | | |Voice-|Voice+|Musoff|Mus on| | | | | | | |
  394. * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
  395. * | | | | | | | | | | | | | |
  396. * `-------------------------------------------------------------------------------------------------'
  397. */
  398. [_ADJUST] = LAYOUT(
  399. _______, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
  400. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_DEL,
  401. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, XXXXXXX, XXXXXXX, XXXXXXX, _______,
  402. XXXXXXX, XXXXXXX, XXXXXXX, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  403. XXXXXXX, _______, _______, _______, _______, _______, _______, _______,_______,_______, _______, _______
  404. )
  405. ,
  406. /* Layer 3 - Mouse Controls
  407. * ,-------------------------------------------------------------------------------------------------.
  408. * | | F1 | F2 | F3 | F4 | F5 | | | F6 | F7 | F8 | F9 | F10 | F11 |
  409. * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
  410. * |SPEED0| |MS UP | | | | | | | |WHUP | | | F12 |
  411. * |------+------+------+------+------+------+------+-------------+------+------+------+------+------|
  412. * |SPEED1|MSLeft|MS DN |MSRite| | | | | |WHLeft|WHDN |WHRite| | |
  413. * |------+------+------+------+------+------+------+------|------+------+------+------+------+------|
  414. * |SPEED2| | | | | | | | | BTN1 | BTN2 | BTN3 | | |
  415. * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
  416. * | Ctrl | Win | Alt |Lower |Raise | Space/Enter | Space | <-- | v | ^ | --> | Esc |
  417. * `-------------------------------------------------------------------------------------------------'
  418. */
  419. [_MOUSE] = LAYOUT(
  420. _______ , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , XXXXXXX, XXXXXXX, KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11,
  421. KC_MS_ACCEL0, XXXXXXX , KC_MS_UP , XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX , KC_MS_WH_UP , XXXXXXX , XXXXXXX , KC_F12,
  422. KC_MS_ACCEL1, KC_MS_LEFT, KC_MS_DOWN , KC_MS_RIGHT , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_WH_LEFT, KC_MS_WH_DOWN, KC_MS_WH_RIGHT, XXXXXXX , XXXXXXX,
  423. KC_MS_ACCEL2, XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_BTN1 , KC_MS_BTN2 , KC_MS_BTN3 , XXXXXXX , XXXXXXX,
  424. TD(CTL_OSL1), KC_LGUI , TD(ALT_OSL1), TD(TD_LayerDn) , KC_L2 , TD(TD_SPC_ENT) , KC_SPACE , KC_LEFT , KC_DOWN , KC_UP , KC_RIGHT, TD(TD_ESC_GRAVE)
  425. )
  426. };
  427. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  428. switch (keycode) {
  429. case KC_TRNS:
  430. case KC_NO:
  431. /* Always cancel one-shot layer when another key gets pressed */
  432. if (record->event.pressed && is_oneshot_layer_active())
  433. clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
  434. return true;
  435. case RESET:
  436. /* Don't allow reset from oneshot layer state */
  437. if (record->event.pressed && is_oneshot_layer_active()){
  438. clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
  439. return false;
  440. }
  441. return true;
  442. case QWERTY:
  443. if (record->event.pressed) {
  444. set_single_persistent_default_layer(_QWERTY);
  445. }
  446. return false;
  447. break;
  448. case LOWER:
  449. if (record->event.pressed) {
  450. layer_on(_LOWER);
  451. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  452. } else {
  453. layer_off(_LOWER);
  454. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  455. }
  456. return false;
  457. break;
  458. case RAISE:
  459. if (record->event.pressed) {
  460. layer_on(_RAISE);
  461. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  462. } else {
  463. layer_off(_RAISE);
  464. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  465. }
  466. return false;
  467. break;
  468. case MOUSE:
  469. if (record->event.pressed) {
  470. set_single_persistent_default_layer(_MOUSE);
  471. }
  472. return false;
  473. break;
  474. }
  475. return true;
  476. };