keymap.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. #include QMK_KEYBOARD_H
  2. enum sofle_layers {
  3. /* _M_XYZ = Mac Os, _W_XYZ = Win/Linux */
  4. _QWERTY,
  5. _COLEMAK,
  6. _LOWER,
  7. _RAISE,
  8. _ADJUST,
  9. };
  10. enum custom_keycodes {
  11. KC_QWERTY = SAFE_RANGE,
  12. KC_COLEMAK,
  13. KC_LOWER,
  14. KC_RAISE,
  15. KC_ADJUST,
  16. KC_PRVWD,
  17. KC_NXTWD,
  18. KC_LSTRT,
  19. KC_LEND,
  20. KC_DLINE
  21. };
  22. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  23. /*
  24. * QWERTY
  25. * ,-----------------------------------------. ,-----------------------------------------.
  26. * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` |
  27. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  28. * | ESC | Q | W | E | R | T | | Y | U | I | O | P | Bspc |
  29. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  30. * | Tab | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' |
  31. * |------+------+------+------+------+------| | | |------+------+------+------+------+------|
  32. * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift|
  33. * `-----------------------------------------/ / \ \-----------------------------------------'
  34. * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
  35. * | | | | |/ / \ \ | | | | |
  36. * `----------------------------------' '------''---------------------------'
  37. */
  38. [_QWERTY] = LAYOUT(
  39. KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV,
  40. KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
  41. KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
  42. KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MUTE, XXXXXXX,KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
  43. KC_LGUI,KC_LALT,KC_LCTRL, KC_LOWER, KC_ENT, KC_SPC, KC_RAISE, KC_RCTRL, KC_RALT, KC_RGUI
  44. ),
  45. /*
  46. * COLEMAK
  47. * ,-----------------------------------------. ,-----------------------------------------.
  48. * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` |
  49. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  50. * | ESC | Q | W | F | P | G | | J | L | U | Y | ; | Bspc |
  51. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  52. * | TAB | A | R | S | T | D |-------. ,-------| H | N | E | I | O | ' |
  53. * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
  54. * |LShift| Z | X | C | V | B |-------| |-------| K | M | , | . | / |RShift|
  55. * `-----------------------------------------/ / \ \-----------------------------------------'
  56. * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
  57. * | | | | |/ / \ \ | | | | |
  58. * `----------------------------------' '------''---------------------------'
  59. */
  60. [_COLEMAK] = LAYOUT(
  61. KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV,
  62. KC_ESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC,
  63. KC_TAB, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
  64. KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MUTE, XXXXXXX,KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
  65. KC_LGUI,KC_LALT,KC_LCTRL,KC_LOWER, KC_ENT, KC_SPC, KC_RAISE, KC_RCTRL, KC_RALT, KC_RGUI
  66. ),
  67. /* LOWER
  68. * ,-----------------------------------------. ,-----------------------------------------.
  69. * | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
  70. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  71. * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | F12 |
  72. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  73. * | Tab | ! | @ | # | $ | % |-------. ,-------| ^ | & | * | ( | ) | | |
  74. * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
  75. * | Shift| = | - | + | { | } |-------| |-------| [ | ] | ; | : | \ | Shift|
  76. * `-----------------------------------------/ / \ \-----------------------------------------'
  77. * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
  78. * | | | | |/ / \ \ | | | | |
  79. * `----------------------------------' '------''---------------------------'
  80. */
  81. [_LOWER] = LAYOUT(
  82. _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
  83. KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_F12,
  84. _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PIPE,
  85. _______, KC_EQL, KC_MINS, KC_PLUS, KC_LCBR, KC_RCBR, _______, _______, KC_LBRC, KC_RBRC, KC_SCLN, KC_COLN, KC_BSLS, _______,
  86. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  87. ),
  88. /* RAISE
  89. * ,----------------------------------------. ,-----------------------------------------.
  90. * | | | | | | | | | | | | | |
  91. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  92. * | Esc | Ins | Pscr | Menu | | | | | PWrd | Up | NWrd | DLine| Bspc |
  93. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  94. * | Tab | LAt | LCtl |LShift| | Caps |-------. ,-------| | Left | Down | Rigth| Del | Bspc |
  95. * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
  96. * |Shift | Undo | Cut | Copy | Paste| |-------| |-------| | LStr | | LEnd | | Shift|
  97. * `-----------------------------------------/ / \ \-----------------------------------------'
  98. * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
  99. * | | | | |/ / \ \ | | | | |
  100. * `----------------------------------' '------''---------------------------'
  101. */
  102. [_RAISE] = LAYOUT(
  103. _______, _______ , _______ , _______ , _______ , _______, _______, _______ , _______, _______ , _______ ,_______,
  104. _______, KC_INS, KC_PSCR, KC_APP, XXXXXXX, XXXXXXX, KC_PGUP, KC_PRVWD, KC_UP, KC_NXTWD,KC_DLINE, KC_BSPC,
  105. _______, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_CAPS, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, KC_BSPC,
  106. _______,KC_UNDO, KC_CUT, KC_COPY, KC_PASTE, XXXXXXX, _______, _______, XXXXXXX, KC_LSTRT, XXXXXXX, KC_LEND, XXXXXXX, _______,
  107. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  108. ),
  109. /* ADJUST
  110. * ,-----------------------------------------. ,-----------------------------------------.
  111. * | | | | | | | | | | | | | |
  112. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  113. * | RESET| |QWERTY|COLEMAK| | | | | | | | | |
  114. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  115. * | | |MACWIN| | | |-------. ,-------| | VOLDO| MUTE | VOLUP| | |
  116. * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
  117. * | | | | | | |-------| |-------| | PREV | PLAY | NEXT | | |
  118. * `-----------------------------------------/ / \ \-----------------------------------------'
  119. * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
  120. * | | | | |/ / \ \ | | | | |
  121. * `----------------------------------' '------''---------------------------'
  122. */
  123. [_ADJUST] = LAYOUT(
  124. XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  125. RESET , XXXXXXX,KC_QWERTY,KC_COLEMAK,CG_TOGG,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  126. XXXXXXX , XXXXXXX,CG_TOGG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, XXXXXXX, XXXXXXX,
  127. XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
  128. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  129. )
  130. };
  131. #ifdef OLED_ENABLE
  132. static void render_logo(void) {
  133. static const char PROGMEM qmk_logo[] = {
  134. 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,
  135. 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4,
  136. 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0
  137. };
  138. oled_write_P(qmk_logo, false);
  139. }
  140. static void print_status_narrow(void) {
  141. // Print current mode
  142. oled_write_P(PSTR("\n\n"), false);
  143. oled_write_ln_P(PSTR("MODE"), false);
  144. oled_write_ln_P(PSTR(""), false);
  145. if (keymap_config.swap_lctl_lgui) {
  146. oled_write_ln_P(PSTR("MAC"), false);
  147. } else {
  148. oled_write_ln_P(PSTR("WIN"), false);
  149. }
  150. switch (get_highest_layer(default_layer_state)) {
  151. case _QWERTY:
  152. oled_write_ln_P(PSTR("Qwrt"), false);
  153. break;
  154. case _COLEMAK:
  155. oled_write_ln_P(PSTR("Clmk"), false);
  156. break;
  157. default:
  158. oled_write_P(PSTR("Undef"), false);
  159. }
  160. oled_write_P(PSTR("\n\n"), false);
  161. // Print current layer
  162. oled_write_ln_P(PSTR("LAYER"), false);
  163. switch (get_highest_layer(layer_state)) {
  164. case _COLEMAK:
  165. case _QWERTY:
  166. oled_write_P(PSTR("Base\n"), false);
  167. break;
  168. case _RAISE:
  169. oled_write_P(PSTR("Raise"), false);
  170. break;
  171. case _LOWER:
  172. oled_write_P(PSTR("Lower"), false);
  173. break;
  174. case _ADJUST:
  175. oled_write_P(PSTR("Adj\n"), false);
  176. break;
  177. default:
  178. oled_write_ln_P(PSTR("Undef"), false);
  179. }
  180. oled_write_P(PSTR("\n\n"), false);
  181. led_t led_usb_state = host_keyboard_led_state();
  182. oled_write_ln_P(PSTR("CPSLK"), led_usb_state.caps_lock);
  183. }
  184. oled_rotation_t oled_init_user(oled_rotation_t rotation) {
  185. if (is_keyboard_master()) {
  186. return OLED_ROTATION_270;
  187. }
  188. return rotation;
  189. }
  190. bool oled_task_user(void) {
  191. if (is_keyboard_master()) {
  192. print_status_narrow();
  193. } else {
  194. render_logo();
  195. }
  196. return false;
  197. }
  198. #endif
  199. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  200. switch (keycode) {
  201. case KC_QWERTY:
  202. if (record->event.pressed) {
  203. set_single_persistent_default_layer(_QWERTY);
  204. }
  205. return false;
  206. case KC_COLEMAK:
  207. if (record->event.pressed) {
  208. set_single_persistent_default_layer(_COLEMAK);
  209. }
  210. return false;
  211. case KC_LOWER:
  212. if (record->event.pressed) {
  213. layer_on(_LOWER);
  214. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  215. } else {
  216. layer_off(_LOWER);
  217. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  218. }
  219. return false;
  220. case KC_RAISE:
  221. if (record->event.pressed) {
  222. layer_on(_RAISE);
  223. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  224. } else {
  225. layer_off(_RAISE);
  226. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  227. }
  228. return false;
  229. case KC_ADJUST:
  230. if (record->event.pressed) {
  231. layer_on(_ADJUST);
  232. } else {
  233. layer_off(_ADJUST);
  234. }
  235. return false;
  236. case KC_PRVWD:
  237. if (record->event.pressed) {
  238. if (keymap_config.swap_lctl_lgui) {
  239. register_mods(mod_config(MOD_LALT));
  240. register_code(KC_LEFT);
  241. } else {
  242. register_mods(mod_config(MOD_LCTL));
  243. register_code(KC_LEFT);
  244. }
  245. } else {
  246. if (keymap_config.swap_lctl_lgui) {
  247. unregister_mods(mod_config(MOD_LALT));
  248. unregister_code(KC_LEFT);
  249. } else {
  250. unregister_mods(mod_config(MOD_LCTL));
  251. unregister_code(KC_LEFT);
  252. }
  253. }
  254. break;
  255. case KC_NXTWD:
  256. if (record->event.pressed) {
  257. if (keymap_config.swap_lctl_lgui) {
  258. register_mods(mod_config(MOD_LALT));
  259. register_code(KC_RIGHT);
  260. } else {
  261. register_mods(mod_config(MOD_LCTL));
  262. register_code(KC_RIGHT);
  263. }
  264. } else {
  265. if (keymap_config.swap_lctl_lgui) {
  266. unregister_mods(mod_config(MOD_LALT));
  267. unregister_code(KC_RIGHT);
  268. } else {
  269. unregister_mods(mod_config(MOD_LCTL));
  270. unregister_code(KC_RIGHT);
  271. }
  272. }
  273. break;
  274. case KC_LSTRT:
  275. if (record->event.pressed) {
  276. if (keymap_config.swap_lctl_lgui) {
  277. //CMD-arrow on Mac, but we have CTL and GUI swapped
  278. register_mods(mod_config(MOD_LCTL));
  279. register_code(KC_LEFT);
  280. } else {
  281. register_code(KC_HOME);
  282. }
  283. } else {
  284. if (keymap_config.swap_lctl_lgui) {
  285. unregister_mods(mod_config(MOD_LCTL));
  286. unregister_code(KC_LEFT);
  287. } else {
  288. unregister_code(KC_HOME);
  289. }
  290. }
  291. break;
  292. case KC_LEND:
  293. if (record->event.pressed) {
  294. if (keymap_config.swap_lctl_lgui) {
  295. //CMD-arrow on Mac, but we have CTL and GUI swapped
  296. register_mods(mod_config(MOD_LCTL));
  297. register_code(KC_RIGHT);
  298. } else {
  299. register_code(KC_END);
  300. }
  301. } else {
  302. if (keymap_config.swap_lctl_lgui) {
  303. unregister_mods(mod_config(MOD_LCTL));
  304. unregister_code(KC_RIGHT);
  305. } else {
  306. unregister_code(KC_END);
  307. }
  308. }
  309. break;
  310. case KC_DLINE:
  311. if (record->event.pressed) {
  312. register_mods(mod_config(MOD_LCTL));
  313. register_code(KC_BSPC);
  314. } else {
  315. unregister_mods(mod_config(MOD_LCTL));
  316. unregister_code(KC_BSPC);
  317. }
  318. break;
  319. case KC_COPY:
  320. if (record->event.pressed) {
  321. register_mods(mod_config(MOD_LCTL));
  322. register_code(KC_C);
  323. } else {
  324. unregister_mods(mod_config(MOD_LCTL));
  325. unregister_code(KC_C);
  326. }
  327. return false;
  328. case KC_PASTE:
  329. if (record->event.pressed) {
  330. register_mods(mod_config(MOD_LCTL));
  331. register_code(KC_V);
  332. } else {
  333. unregister_mods(mod_config(MOD_LCTL));
  334. unregister_code(KC_V);
  335. }
  336. return false;
  337. case KC_CUT:
  338. if (record->event.pressed) {
  339. register_mods(mod_config(MOD_LCTL));
  340. register_code(KC_X);
  341. } else {
  342. unregister_mods(mod_config(MOD_LCTL));
  343. unregister_code(KC_X);
  344. }
  345. return false;
  346. break;
  347. case KC_UNDO:
  348. if (record->event.pressed) {
  349. register_mods(mod_config(MOD_LCTL));
  350. register_code(KC_Z);
  351. } else {
  352. unregister_mods(mod_config(MOD_LCTL));
  353. unregister_code(KC_Z);
  354. }
  355. return false;
  356. }
  357. return true;
  358. }
  359. #ifdef ENCODER_ENABLE
  360. bool encoder_update_user(uint8_t index, bool clockwise) {
  361. if (index == 0) {
  362. if (clockwise) {
  363. tap_code(KC_VOLU);
  364. } else {
  365. tap_code(KC_VOLD);
  366. }
  367. } else if (index == 1) {
  368. if (clockwise) {
  369. tap_code(KC_PGDOWN);
  370. } else {
  371. tap_code(KC_PGUP);
  372. }
  373. }
  374. return true;
  375. }
  376. #endif