keymap.c 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. /* Copyright 2021 Don Kjer and Tyler Tidman
  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. // Layer shorthand
  18. enum _layer {
  19. _WBL,
  20. _WFL,
  21. _WSL,
  22. _MBL,
  23. _MFL,
  24. _MSL
  25. };
  26. #ifndef DEFAULT_LAYOUT
  27. # define DEFAULT_LAYOUT _WBL // Change to _MBL to boot into Mac layout.
  28. #endif
  29. #ifndef ALT_LAYOUT
  30. # define ALT_LAYOUT _MBL // Layout to display 'MR' led when active.
  31. #endif
  32. static bool win_key_locked = false;
  33. static bool mac_media_locked = false;
  34. static bool win_appkey_pressed = false;
  35. static bool mac_fnkey_pressed = false;
  36. // Defines the keycodes used by our macros in process_record_user
  37. enum custom_keycodes {
  38. KC_TGUI = SAFE_RANGE, // Toggle between GUI Lock or Unlock (Windows)
  39. KC_TMED, // Toggle between Fx keys or Media keys (Mac)
  40. KC_WFN, // Windows function key
  41. KC_MFN, // Mac function key
  42. MO_WSL, // Windows system key
  43. MO_MSL, // Mac system key
  44. DF_W2MBL, // Change layout from Windows to Mac
  45. DF_M2WBL // Change layout from Mac to Windows
  46. };
  47. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  48. /* Keymap _WBL: Windows Base Layer (Default Layer)
  49. * ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
  50. * │Esc│ │M1 │M3 │M2 │M4 │ │M1 │M3 │M2 │M4 │ │M1 │M3 │M2 │M4 │ │PSc│Slk│Pse│
  51. * └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
  52. * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐
  53. * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│ │Ins│Hom│PgU│ │Num│ / │ * │ - │
  54. * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ ├───┼───┼───┼───┤
  55. * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ │Del│End│PgD│ │ 7 │ 8 │ 9 │ │
  56. * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬┈┈┈┈┤ └───┴───┴───┘ ├───┼───┼───┤ + │
  57. * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ # │Entr│ │ 4 │ 5 │ 6 │ │
  58. * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ ┌───┐ ├───┼───┼───┼───┤
  59. * │Shft│ \ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ │ ↑ │ │ 1 │ 2 │ 3 │ │
  60. * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤Ent│
  61. * │Ctrl│GUI │Alt │ │ Alt│Func│ App│Ctrl│ │ ← │ ↓ │ → │ │ 0 │ . │ │
  62. * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘
  63. */
  64. [_WBL] = LAYOUT_all( /* Windows Base Layer */
  65. KC_ESC, KC_BTN1, KC_BTN3, KC_BTN2, KC_BTN4, KC_BTN1, KC_BTN3, KC_BTN2, KC_BTN4, KC_BTN1, KC_BTN3, KC_BTN2, KC_BTN4, KC_PSCR, KC_SCRL, KC_PAUS,
  66. KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS,
  67. KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS,
  68. KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6,
  69. KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
  70. KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_WFN, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT
  71. ),
  72. /* Keymap _WFL: Windows Function Layer
  73. * ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
  74. * │ │ │F1 │F2 │F3 │F4 │ │F5 │F6 │F7 │F8 │ │F9 │F10│F11│F12│ │ │ │Mut│
  75. * └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
  76. * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐
  77. * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │Vo+│ │ │ │ │ │
  78. * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ ├───┼───┼───┼───┤
  79. * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │Vo-│ │ │ │ │ │
  80. * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬┈┈┈┈┤ └───┴───┴───┘ ├───┼───┼───┤ │
  81. * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
  82. * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ ┌───┐ ├───┼───┼───┼───┤
  83. * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
  84. * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤ │
  85. * │ │Lock│ │ │ │Func│ Sys│ │ │ │ │ │ │ │ │ │
  86. * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘
  87. */
  88. [_WFL] = LAYOUT_all( /* Windows Function Layer */
  89. _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_MUTE,
  90. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLU, _______, _______, _______, _______,
  91. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD, _______, _______, _______, _______,
  92. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  93. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  94. _______, KC_TGUI, _______, _______, _______, _______, MO_WSL, _______, _______, _______, _______, _______, _______
  95. ),
  96. /* Keymap _WSL: Windows System Layer
  97. * ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
  98. * │Rst│ │Slp│ │ │Pwr│ │ │ │ │ │ │ │ │ │MAC│ │ │ │ │
  99. * └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
  100. * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐
  101. * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
  102. * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ ├───┼───┼───┼───┤
  103. * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
  104. * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬┈┈┈┈┤ └───┴───┴───┘ ├───┼───┼───┤ │
  105. * │ │ │ │DBG│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
  106. * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ ┌───┐ ├───┼───┼───┼───┤
  107. * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
  108. * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤ │
  109. * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
  110. * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘
  111. */
  112. [_WSL] = LAYOUT_all( /* Windows Second / System Layer */
  113. QK_BOOT, KC_SLEP, XXXXXXX, XXXXXXX, KC_PWR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DF_W2MBL, XXXXXXX, XXXXXXX, XXXXXXX,
  114. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  115. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  116. XXXXXXX, XXXXXXX, XXXXXXX, DB_TOGG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  117. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  118. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
  119. ),
  120. /* Keymap _MBL: Mac Base Layer (Alternate Layout)
  121. * ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
  122. * │Esc│ │M1 │M3 │M2 │M4 │ │M1 │M3 │M2 │M4 │ │M1 │M3 │M2 │M4 │ │F13│F14│F15│
  123. * └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
  124. * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐
  125. * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│ │Ins│Hom│PgU│ │Num│ / │ * │ - │
  126. * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ ├───┼───┼───┼───┤
  127. * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ │Del│End│PgD│ │ 7 │ 8 │ 9 │ │
  128. * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬┈┈┈┈┤ └───┴───┴───┘ ├───┼───┼───┤ + │
  129. * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ # │Entr│ │ 4 │ 5 │ 6 │ │
  130. * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ ┌───┐ ├───┼───┼───┼───┤
  131. * │Shft│ \ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ │ ↑ │ │ 1 │ 2 │ 3 │ │
  132. * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤Ent│
  133. * │Ctrl│Alt │GUI │ │ GUI│ Alt│Func│Ctrl│ │ ← │ ↓ │ → │ │ 0 │ . │ │
  134. * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘
  135. */
  136. [_MBL] = LAYOUT_all( /* Mac Base Layer */
  137. KC_ESC, KC_BTN1, KC_BTN3, KC_BTN2, KC_BTN4, KC_BTN1, KC_BTN3, KC_BTN2, KC_BTN4, KC_BTN1, KC_BTN3, KC_BTN2, KC_BTN4, KC_F13, KC_F14, KC_F15,
  138. KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS,
  139. KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS,
  140. KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6,
  141. KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
  142. KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_MFN, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT
  143. ),
  144. /* Keymap _MFL: Mac Function Layer
  145. * ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
  146. * │ │ │F1 │F2 │F3 │F4 │ │F5 │F6 │F7 │F8 │ │F9 │F10│F11│F12│ │TMd│ │Mut│
  147. * └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
  148. * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐
  149. * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │Vo+│ │ │ │ │ │
  150. * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ ├───┼───┼───┼───┤
  151. * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │Vo-│ │ │ │ │ │
  152. * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬┈┈┈┈┤ └───┴───┴───┘ ├───┼───┼───┤ │
  153. * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
  154. * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ ┌───┐ ├───┼───┼───┼───┤
  155. * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
  156. * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤ │
  157. * │ │ │ │ │ │ Sys│Func│ │ │ │ │ │ │ │ │ │
  158. * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘
  159. */
  160. [_MFL] = LAYOUT_all( /* Mac Function Layer */
  161. _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TMED, _______, KC_MUTE,
  162. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLU, _______, _______, _______, _______,
  163. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD, _______, _______, _______, _______,
  164. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  165. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  166. _______, _______, _______, _______, _______, MO_MSL, _______, _______, _______, _______, _______, _______, _______
  167. ),
  168. /* Keymap _MSL: Mac System Layer
  169. * ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
  170. * │Rst│ │ │ │ │Slp│ │ │ │ │ │ │ │ │ │WIN│ │ │ │ │
  171. * └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
  172. * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐
  173. * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
  174. * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ ├───┼───┼───┼───┤
  175. * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
  176. * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬┈┈┈┈┤ └───┴───┴───┘ ├───┼───┼───┤ │
  177. * │ │ │ │DBG│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
  178. * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ ┌───┐ ├───┼───┼───┼───┤
  179. * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
  180. * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤ │
  181. * │ │ │ │ │ │ Sys│Func│ │ │ │ │ │ │ │ │ │
  182. * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘
  183. */
  184. [_MSL] = LAYOUT_all( /* Mac Second / System Layer */
  185. QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, KC_SLEP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DF_M2WBL, XXXXXXX, XXXXXXX, XXXXXXX,
  186. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  187. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  188. XXXXXXX, XXXXXXX, XXXXXXX, DB_TOGG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  189. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  190. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
  191. )
  192. };
  193. void unlock_win_key(void) {
  194. win_key_locked = false;
  195. mac_media_locked = false;
  196. writePinHigh(LED_WIN_LOCK_PIN);
  197. }
  198. void toggle_lock_win_key(void) {
  199. win_key_locked = !win_key_locked;
  200. writePin(LED_WIN_LOCK_PIN, !win_key_locked);
  201. }
  202. void toggle_lock_media_key(void) {
  203. mac_media_locked = !mac_media_locked;
  204. writePin(LED_WIN_LOCK_PIN, !mac_media_locked);
  205. }
  206. #ifdef CONSOLE_ENABLE
  207. void dprint_global_layers(void) {
  208. dprint("Global Layers:");
  209. if (IS_LAYER_ON(_WFL)) { dprint(" _WFL"); }
  210. if (IS_LAYER_ON(_WSL)) { dprint(" _WSL"); }
  211. if (IS_LAYER_ON(_MFL)) { dprint(" _MFL"); }
  212. if (IS_LAYER_ON(_MSL)) { dprint(" _MSL"); }
  213. dprintf("\n");
  214. }
  215. void dprint_layers(layer_state_t state) {
  216. dprint("Layers:");
  217. if (IS_LAYER_ON_STATE(state, _WFL)) { dprint(" _WFL"); }
  218. if (IS_LAYER_ON_STATE(state, _WSL)) { dprint(" _WSL"); }
  219. if (IS_LAYER_ON_STATE(state, _MFL)) { dprint(" _MFL"); }
  220. if (IS_LAYER_ON_STATE(state, _MSL)) { dprint(" _MSL"); }
  221. dprintf("\n");
  222. }
  223. #endif
  224. layer_state_t default_layer_state_set_user(layer_state_t state) {
  225. #ifdef CONSOLE_ENABLE
  226. dprintf("default_layer_state_set_user: 0x%x\n", state);
  227. dprint_global_layers();
  228. #endif
  229. // Disable windows key lock on default layer transition.
  230. unlock_win_key();
  231. win_appkey_pressed = false;
  232. mac_fnkey_pressed = false;
  233. writePin(LED_MR_LOCK_PIN, !IS_LAYER_ON_STATE(state, ALT_LAYOUT));
  234. return state;
  235. }
  236. layer_state_t layer_state_set_user(layer_state_t state) {
  237. #ifdef CONSOLE_ENABLE
  238. dprintf("layer_state_set_user: 0x%x\n", state);
  239. dprint_layers(state);
  240. #endif
  241. return state;
  242. }
  243. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  244. switch (keycode) {
  245. case KC_TGUI:
  246. if (!record->event.pressed) {
  247. // Toggle GUI lock on key release
  248. toggle_lock_win_key();
  249. }
  250. break;
  251. case KC_TMED:
  252. // Only trigger when Fn key is also held down, to avoid accidental unlock.
  253. if (!mac_fnkey_pressed) { return false; }
  254. if (!record->event.pressed) {
  255. // Toggle Media Lock on key release
  256. toggle_lock_media_key();
  257. }
  258. break;
  259. case KC_LGUI:
  260. if (win_key_locked) { return false; }
  261. break;
  262. case KC_WFN:
  263. // Like MO(_WFL), but also enables _WSL if KC_APP is already pressed down.
  264. if (record->event.pressed) {
  265. layer_on(_WFL);
  266. if (win_appkey_pressed) {
  267. // Also enable Secondary layer if App key is being held down.
  268. win_appkey_pressed = false;
  269. layer_on(_WSL);
  270. }
  271. } else {
  272. if (IS_LAYER_ON(_WFL)) { layer_off(_WFL); }
  273. if (IS_LAYER_ON(_MSL)) { layer_off(_MSL); }
  274. }
  275. break;
  276. case KC_APP:
  277. if (record->event.pressed) {
  278. // Don't actually press down the app menu key
  279. win_appkey_pressed = true;
  280. } else {
  281. if (IS_LAYER_ON(_WSL)) { layer_off(_WSL); }
  282. if (IS_LAYER_ON(_MFL)) { layer_off(_MFL); }
  283. if (win_appkey_pressed) {
  284. win_appkey_pressed = false;
  285. // Tap the KC_APP key on key release.
  286. tap_code(KC_APP);
  287. }
  288. }
  289. return false;
  290. break;
  291. case KC_MFN:
  292. // Mac Fn key. Emit Fn keycode, and also transition layers similar to KC_WFN.
  293. if (record->event.pressed) {
  294. mac_fnkey_pressed = true;
  295. layer_on(_MFL);
  296. // Also enable Secondary layer if Right-Alt key is being held down.
  297. if (get_mods() & MOD_BIT(KC_RALT)) {
  298. layer_on(_MSL);
  299. }
  300. } else {
  301. mac_fnkey_pressed = false;
  302. if (!mac_media_locked) {
  303. if (IS_LAYER_ON(_MFL)) { layer_off(_MFL); }
  304. if (IS_LAYER_ON(_WSL)) { layer_off(_WSL); }
  305. }
  306. }
  307. break;
  308. case KC_RALT:
  309. // Disable MSL/WFL layer on key-up.
  310. if (!record->event.pressed) {
  311. if (IS_LAYER_ON(_MSL)) { layer_off(_MSL); }
  312. if (IS_LAYER_ON(_WFL)) { layer_off(_WFL); }
  313. }
  314. break;
  315. case MO_WSL:
  316. if (record->event.pressed) {
  317. layer_on(_WSL);
  318. } else {
  319. if (IS_LAYER_ON(_WSL)) { layer_off(_WSL); }
  320. if (IS_LAYER_ON(_MFL)) { layer_off(_MFL); }
  321. }
  322. break;
  323. case MO_MSL:
  324. if (record->event.pressed) {
  325. layer_on(_MSL);
  326. } else {
  327. if (IS_LAYER_ON(_MSL)) { layer_off(_MSL); }
  328. if (IS_LAYER_ON(_WFL)) { layer_off(_WFL); }
  329. }
  330. break;
  331. case DF_W2MBL:
  332. if (!record->event.pressed) {
  333. // Switch base layer, but preserve first/secondary layers.
  334. default_layer_set(1UL<<_MBL);
  335. layer_state_set(1UL<<_MFL | 1UL<<_MSL);
  336. }
  337. break;
  338. case DF_M2WBL:
  339. if (!record->event.pressed) {
  340. // Switch base layer, but preserve first/secondary layers.
  341. default_layer_set(1UL<<_WBL);
  342. layer_state_set(1UL<<_WFL | 1UL<<_WSL);
  343. }
  344. break;
  345. case QK_BOOT:
  346. if (record->event.pressed) {
  347. // Flash LEDs to indicate bootloader mode is enabled.
  348. on_all_leds();
  349. }
  350. break;
  351. }
  352. return true;
  353. }
  354. void keyboard_post_init_user(void) {
  355. default_layer_set(1UL<<DEFAULT_LAYOUT);
  356. }