keymap.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. /* Copyright 2019 Thomas Baart <thomas@splitkb.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. typedef union {
  18. uint32_t raw;
  19. struct {
  20. bool osIsWindows;
  21. };
  22. } user_config_t;
  23. user_config_t user_config;
  24. enum layers {
  25. _QWERTY = 0,
  26. _COLEMAK,
  27. _NAV,
  28. _SYMBOLS,
  29. _NUM,
  30. _ADJUST
  31. };
  32. enum custom_keycodes {
  33. Qwerty = SAFE_RANGE,
  34. Colemak,
  35. Undo,
  36. Cut,
  37. Copy,
  38. Paste,
  39. NxtWord,
  40. PrvWord
  41. };
  42. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  43. /*
  44. * Base Layer: QWERTY
  45. *
  46. * ,-------------------------------------------. ,-------------------------------------------.
  47. * | TAB | Q | W | E | R | T | | Y | U | I | O | P | Bksp |
  48. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  49. * | NAV | A | S | D | F | G | | H | J | K | L | ; : | ' " |
  50. * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
  51. * | LShift | Z | X | C | V | B |Enter | ESC | |ADJUST|Space | N | M | , < | . > | / ? | Del |
  52. * `----------------------+------+------+------+ +------| |------+ +------+------+------+----------------------'
  53. * | LCTL | GUI | RALT | | NUM | | NUM | | SYMB | NAV |LEADER|
  54. * | | | | | | | | | | | |
  55. * `----------------------------------' `----------------------------------'
  56. */
  57. [_QWERTY] = LAYOUT(
  58. KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y, KC_U , KC_I , KC_O , KC_P , KC_BSPC,
  59. MO(_NAV), KC_A , KC_S , KC_D , KC_F , KC_G , KC_H, KC_J , KC_K , KC_L ,KC_SCLN, KC_QUOT,
  60. KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B , XXXXXXX, KC_ESC , MO(_ADJUST), XXXXXXX, KC_N, KC_M ,KC_COMM, KC_DOT ,KC_SLSH, RSFT_T(KC_DEL),
  61. KC_LCTL, KC_LGUI, KC_RALT, KC_ENT ,TT(_NUM),TT(_NUM), KC_SPC, MO(_SYMBOLS), MO(_NAV), KC_LEAD
  62. ),
  63. /*
  64. * Base Layer: Colemak
  65. *
  66. * ,-------------------------------------------. ,-------------------------------------------.
  67. * | TAB | Q | W | F | P | G | | J | L | U | Y | ; : | Bksp |
  68. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  69. * | NAV | A | R | S | T | D | | H | N | E | I | O | ' " |
  70. * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
  71. * | LShift | Z | X | C | V | B |Enter | ESC | |ADJUST|Space | K | M | , < | . > | / ? | Del |
  72. * `----------------------+------+------+------+ +------| |------+ +------+------+------+----------------------'
  73. * | LCTL | GUI | RALT | | NUM | | NUM | | SYMB | NAV |LEADER|
  74. * | | | | | | | | | | | |
  75. * `----------------------------------' `----------------------------------'
  76. */
  77. [_COLEMAK] = LAYOUT(
  78. KC_TAB , KC_Q , KC_W , KC_F , KC_P , KC_G , KC_J, KC_L , KC_U , KC_Y ,KC_SCLN, KC_BSPC,
  79. MO(_NAV), KC_A , KC_R , KC_S , KC_T , KC_D , KC_H, KC_N , KC_E , KC_I , KC_O , KC_QUOT,
  80. KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B , XXXXXXX, KC_ESC , MO(_ADJUST), XXXXXXX, KC_K, KC_M ,KC_COMM, KC_DOT ,KC_SLSH, RSFT_T(KC_DEL),
  81. KC_LCTL, KC_LGUI, KC_RALT, KC_ENT ,TT(_NUM),TT(_NUM), KC_SPC, MO(_SYMBOLS), MO(_NAV), KC_LEAD
  82. ),
  83. /*
  84. * Navigation Layer: Cursor, Text Navigation
  85. *
  86. * ,-------------------------------------------. ,-------------------------------------------.
  87. * | | | |WheelU| | | | |PrvWord| Up |NxtWord| | |
  88. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  89. * | | | LCTL |WheelD|LSFT | Bksp | | Bksp | Left | Down |Right | Del | |
  90. * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
  91. * | | Undo | Cut | Copy |Paste | | | | | | | | Home | | End | | |
  92. * `----------------------+------+------+------+ +------| |------+ +------+------+------+----------------------'
  93. * | | | | |Space | | | | | | |
  94. * | | | | | | | | | | | |
  95. * `----------------------------------' `----------------------------------'
  96. */
  97. [_NAV] = LAYOUT(
  98. _______, _______, _______, KC_WH_U, _______, _______, _______, PrvWord, KC_UP , NxtWord, _______, _______,
  99. _______, _______, KC_LCTL, KC_WH_D, KC_LSFT, KC_BSPC, KC_BSPC, KC_LEFT, KC_DOWN,KC_RIGHT, KC_DEL , _______,
  100. _______, Undo , Cut , Copy , Paste , _______, XXXXXXX, _______, _______, XXXXXXX, _______, KC_HOME, _______, KC_END , _______, _______,
  101. _______, _______, _______, _______, KC_SPC , _______, _______, _______, _______, _______
  102. ),
  103. /*
  104. * Symbol Layer
  105. *
  106. * ,-------------------------------------------. ,-------------------------------------------.
  107. * | ` ~ | ! | @ | # | $ | % | | ^ | { | } | | € | |
  108. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  109. * | ~ | | | - _ | = + | & | | * | ( | ) | | | | |
  110. * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
  111. * | | | | _ | + | | | | | | | | [ { | ] } | | \ | | |
  112. * `----------------------+------+------+------+ +------| |------+ +------+------+------+----------------------'
  113. * | | | | | | | | | | | |
  114. * | | | | | | | | | | | |
  115. * `----------------------------------' `----------------------------------'
  116. */
  117. [_SYMBOLS] = LAYOUT(
  118. KC_GRV, KC_EXLM, KC_AT , KC_HASH, KC_DLR , KC_PERC, KC_CIRC, KC_LCBR, KC_RCBR, _______,ALGR(KC_5),_______,
  119. KC_TILD, _______, _______, KC_MINS, KC_EQL , KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, KC_PIPE, _______,
  120. _______, _______, _______, KC_UNDS, KC_PLUS, _______, XXXXXXX, _______, _______, XXXXXXX, _______, KC_LBRC, KC_RBRC, _______, KC_BSLS, _______,
  121. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  122. ),
  123. /*
  124. * Num Layer
  125. *
  126. * ,-------------------------------------------. ,-------------------------------------------.
  127. * | | 1 ! | 2 @ | 3 # | 4 $ | 5 % | | / | 7 & | 8 * | 9 ( | - | |
  128. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  129. * | | 6 ^ | 7 & | 8 * | 9 ( | 0 ) | | * | 4 $ | 5 % | 6 ^ | + | Space |
  130. * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
  131. * | | | | | | | | | | | | 0 ) | 1 ! | 2 @ | 3 # | = | Enter |
  132. * `----------------------+------+------+------+ +------| |------+ +------+------+------+----------------------'
  133. * | | | | | | | | | | , | . |
  134. * | | | | | | | | | | | |
  135. * `----------------------------------' `----------------------------------'
  136. */
  137. [_NUM] = LAYOUT(
  138. _______, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_PSLS, KC_7 , KC_8 , KC_9 , KC_PMNS, _______,
  139. _______, KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_PAST, KC_4 , KC_5 , KC_6 , KC_PLUS, KC_SPC ,
  140. _______, _______, _______, _______, _______, _______, XXXXXXX, _______, _______, XXXXXXX, KC_0 , KC_1 , KC_2 , KC_3 , KC_PEQL, KC_ENT ,
  141. _______, _______, _______, _______, _______, _______, _______, _______, KC_PCMM, KC_DOT
  142. ),
  143. /*
  144. * Adjust Layer: Media
  145. *
  146. * ,-------------------------------------------. ,-------------------------------------------.
  147. * | | F9 | F10 | F11 | F12 | | | SAI | | Vol+ | | Play | |
  148. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  149. * | | F5 | F6 | F7 | F8 | | | HUI | Prev | Vol- | Nxt | | |
  150. * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
  151. * | | F1 | F2 | F3 | F4 | | | | | | | VAI | Mute | | | | |
  152. * `----------------------+------+------+------+ +------| |------+ +------+------+------+----------------------'
  153. * |Qwerty|Colemak| | | | | RGB | | RGB | | |
  154. * | Dflt | Dflt | | | | |Toggle| | Mode | | |
  155. * `----------------------------------' `----------------------------------'
  156. */
  157. [_ADJUST] = LAYOUT(
  158. _______, KC_F9 , KC_F10 , KC_F11 , KC_F12 , _______, RGB_SAI, _______, KC_VOLU, _______, KC_MPLY, _______,
  159. _______, KC_F5 , KC_F6 , KC_F7 , KC_F8 , _______, RGB_HUI, KC_MPRV, KC_VOLD, KC_MNXT, _______, _______,
  160. _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , _______, XXXXXXX, _______, _______, XXXXXXX, RGB_VAI, KC_MUTE, _______, _______, _______, _______,
  161. Qwerty , Colemak, _______, _______, _______, RGB_TOG, _______, RGB_MOD, _______, _______
  162. ),
  163. // /*
  164. // * Layer template
  165. // *
  166. // * ,-------------------------------------------. ,-------------------------------------------.
  167. // * | | | | | | | | | | | | | |
  168. // * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  169. // * | | | | | | | | | | | | | |
  170. // * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
  171. // * | | | | | | | | | | | | | | | | | |
  172. // * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
  173. // * | | | | | | | | | | | |
  174. // * | | | | | | | | | | | |
  175. // * `----------------------------------' `----------------------------------'
  176. // */
  177. // [_LAYERINDEX] = LAYOUT(
  178. // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  179. // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  180. // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  181. // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  182. // ),
  183. };
  184. void keyboard_post_init_user(void) {
  185. // Call the post init code.
  186. // Read the user config from EEPROM
  187. user_config.raw = eeconfig_read_user();
  188. // Default RGB settings, without saving settings
  189. rgblight_enable_noeeprom();
  190. rgblight_sethsv_noeeprom(HSV_CYAN);
  191. rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
  192. }
  193. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  194. switch(keycode) {
  195. case Qwerty:
  196. if (record->event.pressed) {
  197. set_single_persistent_default_layer(_QWERTY);
  198. }
  199. break;
  200. case Colemak:
  201. if (record->event.pressed) {
  202. set_single_persistent_default_layer(_COLEMAK);
  203. }
  204. break;
  205. case Undo:
  206. if (record->event.pressed) {
  207. if (user_config.osIsWindows == 1) {
  208. tap_code16(C(KC_Z));
  209. } else if (user_config.osIsWindows == 0) {
  210. tap_code16(G(KC_Z));
  211. }
  212. }
  213. break;
  214. case Cut:
  215. if (record->event.pressed) {
  216. if (user_config.osIsWindows == 1) {
  217. tap_code16(C(KC_X));
  218. } else if (user_config.osIsWindows == 0) {
  219. tap_code16(G(KC_X));
  220. }
  221. }
  222. break;
  223. case Copy:
  224. if (record->event.pressed) {
  225. if (user_config.osIsWindows == 1) {
  226. tap_code16(C(KC_C));
  227. } else if (user_config.osIsWindows == 0) {
  228. tap_code16(G(KC_C));
  229. }
  230. }
  231. break;
  232. case Paste:
  233. if (record->event.pressed) {
  234. if (user_config.osIsWindows == 1) {
  235. tap_code16(C(KC_V));
  236. } else if (user_config.osIsWindows == 0) {
  237. tap_code16(G(KC_V));
  238. }
  239. }
  240. break;
  241. case PrvWord:
  242. if (record->event.pressed) {
  243. if (user_config.osIsWindows == 1) {
  244. tap_code16(C(KC_LEFT));
  245. } else if (user_config.osIsWindows == 0) {
  246. tap_code16(A(KC_LEFT));
  247. }
  248. }
  249. break;
  250. case NxtWord:
  251. if (record->event.pressed) {
  252. if (user_config.osIsWindows == 1) {
  253. tap_code16(C(KC_RGHT));
  254. } else if (user_config.osIsWindows == 0) {
  255. tap_code16(A(KC_RGHT));
  256. }
  257. }
  258. break;
  259. }
  260. return true;
  261. };
  262. LEADER_EXTERNS();
  263. void matrix_scan_user(void) {
  264. LEADER_DICTIONARY() {
  265. leading = false;
  266. leader_end();
  267. // Set current OS indicator to macOs
  268. SEQ_ONE_KEY(KC_M) {
  269. user_config.osIsWindows = false;
  270. eeconfig_update_user(user_config.raw);
  271. }
  272. // Set current OS indicator to Windows
  273. SEQ_ONE_KEY(KC_W) {
  274. user_config.osIsWindows = true;
  275. eeconfig_update_user(user_config.raw);
  276. }
  277. // Screenshot
  278. SEQ_ONE_KEY(KC_S) {
  279. if (user_config.osIsWindows == 1) {
  280. tap_code16(S(G(KC_S)));
  281. } else if (user_config.osIsWindows == 0) {
  282. tap_code16(S(G(KC_4)));
  283. }
  284. }
  285. // Video
  286. SEQ_ONE_KEY(KC_V) {
  287. if (user_config.osIsWindows == 0) {
  288. tap_code16(S(G(KC_5)));
  289. }
  290. }
  291. // Sleep
  292. SEQ_ONE_KEY(KC_P) {
  293. if (user_config.osIsWindows == 1) {
  294. SEND_STRING(SS_LGUI("x") "u" "h");
  295. } else if (user_config.osIsWindows == 0) {
  296. tap_code16(A(G(KC_PWR)));
  297. }
  298. }
  299. }
  300. }