keymap.c (8010B)
1 /* Copyright 2020 marksard 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 #include "./common/oled_helper.h" 18 19 enum layer_number { 20 _BASE, 21 _LOWER, 22 _RAISE, 23 _ADJUST, 24 }; 25 26 enum custom_keycodes { 27 LOWER = SAFE_RANGE, 28 RAISE, 29 ADJUST, 30 KANJI, 31 RGBRST 32 }; 33 34 // Base layer mod tap 35 #define KC_Z_SF LSFT_T(KC_Z) 36 #define KC_SLSF RSFT_T(KC_SLSH) 37 38 // Lower layer mod tap 39 #define KC_11SF LSFT_T(KC_F11) 40 #define KC_GRSF RSFT_T(KC_GRV) 41 42 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 43 [_BASE] = LAYOUT_ortho_4x10( 44 //,---------------------------------------------------------------------------------------------------. 45 KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, 46 //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| 47 KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT, 48 //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| 49 KC_Z_SF, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSF, 50 //`---------+---------+---------+---------+---------+---------+---------+---------+---------+---------' 51 KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_BSPC, KC_SPC, RAISE, KC_RGUI, KC_APP, KC_RCTL 52 //,---------------------------------------------------------------------------------------------------. 53 ), 54 55 [_LOWER] = LAYOUT_ortho_4x10( 56 //,---------------------------------------------------------------------------------------------------. 57 KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, 58 //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| 59 KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, XXXXXXX, XXXXXXX, KC_SCLN, KC_QUOT, 60 //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| 61 KC_11SF, KC_F12, KC_ESC, KC_TAB, KANJI, KC_DEL, XXXXXXX, XXXXXXX, KC_INT1, KC_GRSF, 62 //`---------+---------+---------+---------+---------+---------+---------+---------+---------+---------' 63 _______, _______, _______, _______, KC_DEL, _______, _______, _______, _______, _______ 64 //,---------------------------------------------------------------------------------------------------. 65 ), 66 67 [_RAISE] = LAYOUT_ortho_4x10( 68 //,---------------------------------------------------------------------------------------------------. 69 KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, 70 //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| 71 KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_RSFT, 72 //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| 73 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MINS, KC_INT1, KC_COMM, KC_DOT, KC_SLSF, 74 //`---------+---------+---------+---------+---------+---------+---------+---------+---------+---------' 75 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ 76 //,---------------------------------------------------------------------------------------------------. 77 ), 78 79 [_ADJUST] = LAYOUT_ortho_4x10( 80 //,---------------------------------------------------------------------------------------------------. 81 QK_BOOT, RGBRST, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_INS, KC_PSCR, 82 //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| 83 UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, XXXXXXX, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, KC_NUM, 84 //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| 85 UG_NEXT, UG_HUED, UG_SATD, UG_VALD, XXXXXXX, MS_BTN1, MS_BTN2, XXXXXXX, XXXXXXX, XXXXXXX, 86 //`---------+---------+---------+---------+---------+---------+---------+---------+---------+---------' 87 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ 88 //,---------------------------------------------------------------------------------------------------. 89 ) 90 }; 91 92 #define L_BASE _BASE 93 #define L_LOWER (1<<_LOWER) 94 #define L_RAISE (1<<_RAISE) 95 #define L_ADJUST (1<<_ADJUST) 96 #define L_ADJUST_TRI (L_ADJUST|L_RAISE|L_LOWER) 97 98 #ifdef OLED_ENABLE 99 #include <stdio.h> 100 #include <string.h> 101 102 typedef struct { 103 uint8_t state; 104 char name[8]; 105 }LAYER_DISPLAY_NAME; 106 107 #define LAYER_DISPLAY_MAX 5 108 const LAYER_DISPLAY_NAME layer_display_name[LAYER_DISPLAY_MAX] = { 109 {L_BASE, "Base"}, 110 {L_BASE + 1, "Base"}, 111 {L_LOWER, "Lower"}, 112 {L_RAISE, "Raise"}, 113 {L_ADJUST_TRI, "Adjust"} 114 }; 115 116 static inline const char* get_leyer_status(void) { 117 118 for (uint8_t i = 0; i < LAYER_DISPLAY_MAX; ++i) { 119 if (layer_state == 0 && layer_display_name[i].state == default_layer_state) { 120 121 return layer_display_name[i].name; 122 } else if (layer_state != 0 && layer_display_name[i].state == layer_state) { 123 124 return layer_display_name[i].name; 125 } 126 } 127 128 return "?"; 129 } 130 131 static char layer_status_buf[24] = "Layer state ready.\n"; 132 static inline void update_keymap_status(void) { 133 134 snprintf(layer_status_buf, sizeof(layer_status_buf) - 1, "OS:%s Layer:%s\n", 135 keymap_config.swap_lalt_lgui? "win" : "mac", get_leyer_status()); 136 } 137 138 static inline void render_keymap_status(void) { 139 140 oled_write(layer_status_buf, false); 141 } 142 143 #define UPDATE_KEYMAP_STATUS() update_keymap_status() 144 145 static inline void render_status(void) { 146 147 UPDATE_LED_STATUS(); 148 RENDER_LED_STATUS(); 149 render_keymap_status(); 150 RENDER_LOCK_STATUS(); 151 RENDER_KEY_STATUS(); 152 } 153 154 oled_rotation_t oled_init_user(oled_rotation_t rotation) { 155 156 if (is_keyboard_master()) 157 return OLED_ROTATION_180; // flips the display 180 degrees if offhand 158 return rotation; 159 } 160 161 bool oled_task_user(void) { 162 163 if (is_keyboard_master()) { 164 render_status(); 165 } else { 166 render_logo(); 167 } 168 return false; 169 } 170 171 #else 172 173 #define UPDATE_KEYMAP_STATUS() 174 175 #endif 176 177 bool process_record_user(uint16_t keycode, keyrecord_t *record) { 178 179 UPDATE_KEY_STATUS(keycode, record); 180 181 bool result = false; 182 switch (keycode) { 183 case LOWER: 184 if (record->event.pressed) { 185 layer_on(_LOWER); 186 } else { 187 layer_off(_LOWER); 188 } 189 190 update_tri_layer(_LOWER, _RAISE, _ADJUST); 191 break; 192 case RAISE: 193 if (record->event.pressed) { 194 layer_on(_RAISE); 195 } else { 196 layer_off(_RAISE); 197 } 198 199 update_tri_layer(_LOWER, _RAISE, _ADJUST); 200 break; 201 case KANJI: 202 if (record->event.pressed) { 203 if (keymap_config.swap_lalt_lgui == false) { 204 register_code(KC_LNG2); 205 } else { 206 register_code16(A(KC_GRV)); 207 } 208 } else { 209 unregister_code(KC_LNG2); 210 } 211 break; 212 #ifdef RGBLIGHT_ENABLE 213 case RGBRST: 214 if (record->event.pressed) { 215 eeconfig_update_rgblight_default(); 216 rgblight_enable(); 217 } 218 break; 219 #endif 220 default: 221 result = true; 222 break; 223 } 224 225 UPDATE_KEYMAP_STATUS(); 226 return result; 227 }