/* Copyright 2020 Thys de Wet * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include QMK_KEYBOARD_H //This keymap is HEAVILY inspired by sofle enum grandiceps_layers { _QWERTY, _COLEMAK, _LOWER, _RAISE, _ADJUST, }; enum custom_keycodes { KC_QWERTY = SAFE_RANGE, KC_COLEMAK, KC_LOWER, KC_RAISE, KC_ADJUST, KC_PRVWD, KC_NXTWD, KC_LSTRT, KC_LEND, KC_DLINE, KC_TEAMS }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* * QWERTY * ,-----------------------------------------. ,-----------------------------------------. * | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - | * |------+------+------+------+------+------| |------+------+------+------+------+------| * | DEL | Q | W | E | R | T | | Y | U | I | O | P | Bspc | * |------+------+------+------+------+------| |------+------+------+------+------+------| * | Tab | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' | * |------+------+------+------+------+------| | | |------+------+------+------+------+------| * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift| * `-----------------------------------------/ / \ \-----------------------------------------' * | LGUI | LAlt | LCTR |LOWER | /Space / \Enter \ |RAISE | RCTR | RAlt | RGUI | * | | | | |/ / \ \ | | | | | * `----------------------------------' '------''---------------------------' */ [_QWERTY] = LAYOUT( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_DEL, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MUTE, KC_TEAMS,KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_LGUI,KC_LALT,KC_LCTRL, KC_LOWER, KC_SPC, KC_ENT, KC_RAISE, KC_RCTRL, KC_RALT, KC_RGUI ), /* * COLEMAK * ,-----------------------------------------. ,-----------------------------------------. * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | * |------+------+------+------+------+------| |------+------+------+------+------+------| * | ESC | Q | W | F | P | G | | J | L | U | Y | ; | Bspc | * |------+------+------+------+------+------| |------+------+------+------+------+------| * | TAB | A | R | S | T | D |-------. ,-------| H | N | E | I | O | ' | * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------| * |LShift| Z | X | C | V | B |-------| |-------| K | M | , | . | / |RShift| * `-----------------------------------------/ / \ \-----------------------------------------' * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI | * | | | | |/ / \ \ | | | | | * `----------------------------------' '------''---------------------------' */ [_COLEMAK] = LAYOUT( KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV, KC_ESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, KC_TAB, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, 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, KC_LGUI,KC_LALT,KC_LCTRL,KC_LOWER, KC_ENT, KC_SPC, KC_RAISE, KC_RCTRL, KC_RALT, KC_RGUI ), /* LOWER * ,-----------------------------------------. ,-----------------------------------------. * | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 | * |------+------+------+------+------+------| |------+------+------+------+------+------| * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | F12 | * |------+------+------+------+------+------| |------+------+------+------+------+------| * | Tab | ! | @ | # | $ | % |-------. ,-------| ^ | & | * | ( | ) | | | * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------| * | Shift| = | - | + | { | } |-------| |-------| [ | ] | ; | : | \ | Shift| * `-----------------------------------------/ / \ \-----------------------------------------' * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI | * | | | | |/ / \ \ | | | | | * `----------------------------------' '------''---------------------------' */ [_LOWER] = LAYOUT( _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_NUBS, _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PIPE, _______, KC_EQL, KC_MINS, KC_PLUS, KC_LCBR, KC_RCBR, _______, _______, KC_LBRC, KC_RBRC, KC_SCLN, KC_COLN, KC_BSLS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), /* RAISE * ,----------------------------------------. ,-----------------------------------------. * | | | | | | | | | | | | | | * |------+------+------+------+------+------| |------+------+------+------+------+------| * | Esc | Ins | Pscr | Menu | | | | | PWrd | Up | NWrd | DLine| Bspc | * |------+------+------+------+------+------| |------+------+------+------+------+------| * | Tab | LAt | LCtl |LShift| | Caps |-------. ,-------| | Left | Down | Rigth| Del | Bspc | * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------| * |Shift | Undo | Cut | Copy | Paste| |-------| |-------| | LStr | | LEnd | | Shift| * `-----------------------------------------/ / \ \-----------------------------------------' * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI | * | | | | |/ / \ \ | | | | | * `----------------------------------' '------''---------------------------' */ [_RAISE] = LAYOUT( _______, _______ , _______ , _______ , _______ , _______, _______, _______ , _______, _______ , _______ ,_______, _______, KC_INS, KC_PSCR, KC_APP, XXXXXXX, XXXXXXX, KC_PGUP, KC_PRVWD, KC_UP, KC_NXTWD, KC_DLINE, KC_BSPC, _______, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_CAPS, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, KC_BSPC, _______, KC_UNDO, KC_CUT, KC_COPY, KC_PASTE, XXXXXXX, _______, _______, XXXXXXX, KC_LSTRT, XXXXXXX, KC_LEND, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), /* ADJUST * ,-----------------------------------------. ,-----------------------------------------. * | | | | | | | | | | | | | | * |------+------+------+------+------+------| |------+------+------+------+------+------| * | RESET| |QWERTY|COLEMAK| | | | | | | | | | * |------+------+------+------+------+------| |------+------+------+------+------+------| * | | |MACWIN| | | |-------. ,-------| | VOLDO| MUTE | VOLUP| | | * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------| * | | | | | | |-------| |-------| | PREV | PLAY | NEXT | | | * `-----------------------------------------/ / \ \-----------------------------------------' * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI | * | | | | |/ / \ \ | | | | | * `----------------------------------' '------''---------------------------' */ [_ADJUST] = LAYOUT( XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_MOD, RGB_VAI, RGB_SAI, RGB_HUI, XXXXXXX, RGB_TOG, RESET , XXXXXXX, KC_QWERTY,KC_COLEMAK,CG_TOGG, XXXXXXX, RGB_RMOD, RGB_VAD, RGB_SAD, RGB_HUD, XXXXXXX, XXXXXXX, XXXXXXX , XXXXXXX, CG_TOGG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, XXXXXXX, XXXXXXX, XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) }; bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case KC_QWERTY: if (record->event.pressed) { set_single_persistent_default_layer(_QWERTY); } return false; case KC_COLEMAK: if (record->event.pressed) { set_single_persistent_default_layer(_COLEMAK); } return false; case KC_LOWER: if (record->event.pressed) { layer_on(_LOWER); update_tri_layer(_LOWER, _RAISE, _ADJUST); } else { layer_off(_LOWER); update_tri_layer(_LOWER, _RAISE, _ADJUST); } return false; case KC_RAISE: if (record->event.pressed) { layer_on(_RAISE); update_tri_layer(_LOWER, _RAISE, _ADJUST); } else { layer_off(_RAISE); update_tri_layer(_LOWER, _RAISE, _ADJUST); } return false; case KC_ADJUST: if (record->event.pressed) { layer_on(_ADJUST); } else { layer_off(_ADJUST); } return false; case KC_PRVWD: if (record->event.pressed) { if (keymap_config.swap_lctl_lgui) { register_mods(mod_config(MOD_LALT)); register_code(KC_LEFT); } else { register_mods(mod_config(MOD_LCTL)); register_code(KC_LEFT); } } else { if (keymap_config.swap_lctl_lgui) { unregister_mods(mod_config(MOD_LALT)); unregister_code(KC_LEFT); } else { unregister_mods(mod_config(MOD_LCTL)); unregister_code(KC_LEFT); } } break; case KC_NXTWD: if (record->event.pressed) { if (keymap_config.swap_lctl_lgui) { register_mods(mod_config(MOD_LALT)); register_code(KC_RIGHT); } else { register_mods(mod_config(MOD_LCTL)); register_code(KC_RIGHT); } } else { if (keymap_config.swap_lctl_lgui) { unregister_mods(mod_config(MOD_LALT)); unregister_code(KC_RIGHT); } else { unregister_mods(mod_config(MOD_LCTL)); unregister_code(KC_RIGHT); } } break; case KC_LSTRT: if (record->event.pressed) { if (keymap_config.swap_lctl_lgui) { //CMD-arrow on Mac, but we have CTL and GUI swapped register_mods(mod_config(MOD_LCTL)); register_code(KC_LEFT); } else { register_code(KC_HOME); } } else { if (keymap_config.swap_lctl_lgui) { unregister_mods(mod_config(MOD_LCTL)); unregister_code(KC_LEFT); } else { unregister_code(KC_HOME); } } break; case KC_LEND: if (record->event.pressed) { if (keymap_config.swap_lctl_lgui) { //CMD-arrow on Mac, but we have CTL and GUI swapped register_mods(mod_config(MOD_LCTL)); register_code(KC_RIGHT); } else { register_code(KC_END); } } else { if (keymap_config.swap_lctl_lgui) { unregister_mods(mod_config(MOD_LCTL)); unregister_code(KC_RIGHT); } else { unregister_code(KC_END); } } break; case KC_DLINE: if (record->event.pressed) { register_mods(mod_config(MOD_LCTL)); register_code(KC_BSPC); } else { unregister_mods(mod_config(MOD_LCTL)); unregister_code(KC_BSPC); } break; case KC_COPY: if (record->event.pressed) { register_mods(mod_config(MOD_LCTL)); register_code(KC_C); } else { unregister_mods(mod_config(MOD_LCTL)); unregister_code(KC_C); } return false; case KC_PASTE: if (record->event.pressed) { register_mods(mod_config(MOD_LCTL)); register_code(KC_V); } else { unregister_mods(mod_config(MOD_LCTL)); unregister_code(KC_V); } return false; case KC_CUT: if (record->event.pressed) { register_mods(mod_config(MOD_LCTL)); register_code(KC_X); } else { unregister_mods(mod_config(MOD_LCTL)); unregister_code(KC_X); } return false; break; case KC_UNDO: if (record->event.pressed) { register_mods(mod_config(MOD_LCTL)); register_code(KC_Z); } else { unregister_mods(mod_config(MOD_LCTL)); unregister_code(KC_Z); } return false; case KC_TEAMS: if (record->event.pressed) { register_mods(mod_config(MOD_LCTL)); register_mods(mod_config(MOD_LSFT)); register_code(KC_M); } else { unregister_mods(mod_config(MOD_LCTL)); unregister_mods(mod_config(MOD_LSFT)); unregister_code(KC_M); } return false; } return true; } #ifdef OLED_ENABLE static void render_logo(void) { static const char PROGMEM my_logo[] = { // 'protea', 128x32px 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x38, 0x1c, 0x0c, 0x06, 0x82, 0x80, 0xc0, 0xc0, 0x40, 0x00, 0x80, 0x90, 0xd0, 0xd8, 0xc8, 0xc8, 0x44, 0x44, 0x00, 0x88, 0xb8, 0xb8, 0xd8, 0xd8, 0xc0, 0xc0, 0x80, 0x20, 0x60, 0x60, 0x50, 0xd0, 0xb0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x30, 0x30, 0x30, 0x30, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x08, 0x07, 0x01, 0x90, 0x90, 0x90, 0x99, 0x99, 0x90, 0x84, 0x22, 0x6b, 0xe9, 0xf5, 0xf5, 0xf5, 0xe5, 0xc5, 0x10, 0x1e, 0x1e, 0x4e, 0x60, 0xf1, 0xf9, 0xf9, 0xf9, 0xf8, 0x78, 0x7a, 0x7b, 0x33, 0x37, 0xc6, 0xee, 0xcc, 0x19, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0c, 0x30, 0xc0, 0x80, 0x00, 0x06, 0x0c, 0x18, 0x31, 0x71, 0x61, 0x69, 0x40, 0x42, 0x86, 0x0d, 0x1d, 0x19, 0x39, 0x31, 0x76, 0x67, 0x6f, 0x4f, 0x0f, 0x0e, 0xce, 0xc0, 0xc0, 0xd2, 0xd6, 0xd7, 0xb7, 0x37, 0x3b, 0xda, 0xc0, 0xcb, 0x08, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x06, 0x0e, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1c, 0x38, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x06, 0x04, 0x05, 0x01, 0x01, 0x01, 0x01, 0x05, 0x04, 0x06, 0x06, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; oled_write_raw_P(my_logo, sizeof(my_logo)); } static void print_status_narrow(void) { // Print current mode oled_write_P(PSTR("\n\n"), false); oled_write_ln_P(PSTR("MODE"), false); oled_write_ln_P(PSTR("\n"), false); if (keymap_config.swap_lctl_lgui) { oled_write_ln_P(PSTR("MAC\n"), false); } else { oled_write_ln_P(PSTR("WIN\n"), false); } switch (get_highest_layer(default_layer_state)) { case _QWERTY: oled_write_ln_P(PSTR("Qwrt"), false); break; case _COLEMAK: oled_write_ln_P(PSTR("Clmk"), false); break; default: oled_write_P(PSTR("Undef"), false); } oled_write_P(PSTR("\n\n"), false); // Print current layer oled_write_ln_P(PSTR("LAYER"), false); switch (get_highest_layer(layer_state)) { case _COLEMAK: case _QWERTY: oled_write_P(PSTR("Base\n"), false); break; case _RAISE: oled_write_P(PSTR("Raise"), false); break; case _LOWER: oled_write_P(PSTR("Lower"), false); break; case _ADJUST: oled_write_P(PSTR("Adj\n"), false); break; default: oled_write_ln_P(PSTR("Undef"), false); } oled_write_P(PSTR("\n\n"), false); led_t led_usb_state = host_keyboard_led_state(); oled_write_ln_P(PSTR("CPSLK"), led_usb_state.caps_lock); oled_write_P(PSTR("\n\n"), false); } bool oled_task_user(void) { if (is_keyboard_master()) { print_status_narrow(); } else { render_logo(); } return false; } oled_rotation_t oled_init_user(oled_rotation_t rotation) { if (is_keyboard_master()) { return OLED_ROTATION_270; } else { return rotation; } } #endif #ifdef ENCODER_ENABLE bool encoder_update_user(uint8_t index, bool clockwise){ if (index == 0) { switch (get_highest_layer(layer_state)) { case _QWERTY: // Move whole words. Hold shift to select while moving. if (clockwise) { tap_code(KC_VOLU); } else { tap_code(KC_VOLD); } break; default: // History scrubbing. For Adobe products, hold shift while moving // backward to go forward instead. if (clockwise) { tap_code16(C(KC_Z)); } else { tap_code16(C(KC_Y)); } break; } } else if (index == 1) { switch (get_highest_layer(layer_state)) { case _QWERTY: // Scrolling with PageUp and PgDn. if (!clockwise) { tap_code16(KC_PGDN); } else { tap_code16(KC_PGUP); } break; default: if (clockwise) { tap_code16(A(KC_TAB)); } else { tap_code16(A(S(KC_TAB))); } break; } } return true; } #endif