keymap.c (8881B)
1 // Copyright 2022 zzeneg (@zzeneg) 2 // SPDX-License-Identifier: GPL-2.0-or-later 3 4 #include QMK_KEYBOARD_H 5 6 #include "hid_display.h" 7 #include "raw_hid.h" 8 #include "transactions.h" 9 10 // Left-hand home row mods 11 #define HOME_A LGUI_T(KC_A) 12 #define HOME_S LALT_T(KC_S) 13 #define HOME_D LCTL_T(KC_D) 14 #define HOME_F LSFT_T(KC_F) 15 16 // Right-hand home row mods 17 #define HOME_J RSFT_T(KC_J) 18 #define HOME_K RCTL_T(KC_K) 19 #define HOME_L LALT_T(KC_L) 20 #define HOME_SCLN RGUI_T(KC_SCLN) 21 22 // bottom mods 23 #define SYM_SPC LT(_SYMBOL, KC_SPC) 24 #define NUM_TAB LT(_NUMBER, KC_TAB) 25 #define FUNC_ESC LT(_FUNC, KC_ESC) 26 #define FUNC_ENT LT(_FUNC, KC_ENT) 27 #define NAV_BSPC LT(_NAV, KC_BSPC) 28 #define RALT_DEL LALT_T(KC_DEL) 29 30 // game layer mods 31 #define LALT_Q LALT_T(KC_Q) 32 #define LSFT_MINS LSFT_T(KC_MINS) 33 #define LCTL_ESC LCTL_T(KC_ESC) 34 #define LGUI_QUOT LGUI_T(KC_QUOT) 35 36 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 37 /* QWERTY 38 * .---------------------------. .---------------------------. 39 * | W | E | R | T | | Y | U | I | O | 40 * .------+------+------+------+------+------| |------+------+------+------+------+------. 41 * | Q | A | S | D | F | G | | H | J | K | L | P | ; | 42 * |------+------+------+------+------+------| |------+------+------+------+------+------| 43 * | - | Z | X | C | V | B |--------. .--------| N | M | , | . | / | ' | 44 * '-----------------------------------------/ / \ \-----------------------------------------' 45 * | Esc | Tab | / Space / \ Enter \ | Bsps | Del | 46 * |_FUNC | _NUM | /_SYMBOL/ \ _FUNC \ | _NAV | RAlt | 47 * `-------------''-------' '-------''-------------' 48 */ 49 // clang-format off 50 [_QWERTY] = LAYOUT( 51 KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, 52 KC_Q, HOME_A, HOME_S, HOME_D, HOME_F, KC_G, KC_H, HOME_J, HOME_K, HOME_L, HOME_SCLN, KC_P, 53 KC_MINS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT, 54 FUNC_ESC, NUM_TAB, SYM_SPC, FUNC_ENT, NAV_BSPC, RALT_DEL 55 ), 56 57 [_GAME] = LAYOUT( 58 KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, 59 LALT_Q, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_P, 60 LSFT_MINS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, LGUI_QUOT, 61 LCTL_ESC, NUM_TAB, SYM_SPC, FUNC_ENT, NAV_BSPC, RALT_DEL 62 ), 63 64 [_NAV] = LAYOUT( 65 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PGDN, KC_PGUP, 66 XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_PAUS, 67 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME, KC_END, KC_INS, KC_APP, XXXXXXX, 68 FUNC_ESC, NUM_TAB, SYM_SPC, XXXXXXX, _______, RALT_DEL 69 ), 70 71 [_NUMBER] = LAYOUT( 72 KC_7, KC_8, KC_9, KC_GRV, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, 73 KC_EQL, KC_0, KC_4, KC_5, KC_6, KC_LBRC, XXXXXXX, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, XXXXXXX, 74 KC_MINS, KC_BSLS, KC_1, KC_2, KC_3, KC_RBRC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, 75 KC_ENT, _______, TG(_GAME), FUNC_ENT, NAV_BSPC, RALT_DEL 76 ), 77 78 [_SYMBOL] = LAYOUT( 79 LSFT(KC_7), LSFT(KC_8), LSFT(KC_9), LSFT(KC_GRV), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, 80 LSFT(KC_EQL), LSFT(KC_0), LSFT(KC_4), LSFT(KC_5), LSFT(KC_6), LSFT(KC_LBRC), XXXXXXX, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, XXXXXXX, 81 LSFT(KC_MINS), LSFT(KC_BSLS), LSFT(KC_1), LSFT(KC_2), LSFT(KC_3), LSFT(KC_RBRC), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, 82 MO(_SYS), KC_BSPC, _______, FUNC_ENT, NAV_BSPC, RALT_DEL 83 ), 84 85 [_FUNC] = LAYOUT( 86 KC_F7, KC_F8, KC_F9, KC_CAPS, XXXXXXX, KC_PSCR, KC_SCRL, KC_NUM, 87 KC_F12, KC_F11, KC_F4, KC_F5, KC_F6, KC_F12, XXXXXXX, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, XXXXXXX, 88 XXXXXXX, KC_F10, KC_F1, KC_F2, KC_F3, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, 89 _______, KC_MNXT, KC_MPLY, _______, XXXXXXX, MO(_SYS) 90 ), 91 92 [_SYS] = LAYOUT( 93 BL_DOWN, BL_UP, BL_TOGG, XXXXXXX, XXXXXXX, RM_TOGG, RM_NEXT, RM_PREV, 94 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, RGB_M_P, 95 EH_LEFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, EH_RGHT, EH_RGHT, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, EH_LEFT, 96 _______, QK_BOOT, _______, _______, QK_BOOT, _______ 97 ) 98 // clang-format on 99 }; 100 101 bool process_record_user(uint16_t keycode, keyrecord_t *record) { 102 dprintf("process_record_user %u %s %s %d\n", keycode, record->event.pressed ? "pressed" : "depressed", record->tap.interrupted ? "interrupted" : "not interrupted", record->tap.count); 103 104 if (record->event.pressed) { 105 uint8_t data[32]; 106 data[0] = 0; 107 108 switch (keycode) { 109 // send hid commands 110 case KC_VOLU: 111 case KC_VOLD: 112 data[0] = _VOLUME; 113 break; 114 } 115 116 if (data[0]) { 117 dprintf("raw_hid_send %u\n", data[0]); 118 raw_hid_send(data, sizeof(data)); 119 } 120 } 121 122 return true; 123 } 124 125 /* Caps Word processing */ 126 #ifdef CAPS_WORD_ENABLE 127 void caps_word_set_user(bool active) { 128 if (is_display_enabled()) { 129 display_process_caps_word(active); 130 } else if (is_keyboard_master() && !is_keyboard_left()) { 131 dprintf("RPC_ID_USER_CAPS_WORD_SYNC: %s\n", active ? "active" : "inactive"); 132 transaction_rpc_send(RPC_ID_USER_CAPS_WORD_SYNC, 1, &active); 133 } 134 } 135 #endif 136 137 /* Active Layer processing */ 138 layer_state_t layer_state_set_user(layer_state_t state) { 139 if (is_display_enabled()) { 140 display_process_layer_state(get_highest_layer(state)); 141 } else if (is_keyboard_master() && !is_keyboard_left()) { 142 uint8_t layer = get_highest_layer(state); 143 dprintf("RPC_ID_USER_LAYER_SYNC: %u\n", layer); 144 transaction_rpc_send(RPC_ID_USER_LAYER_SYNC, 1, &layer); 145 } 146 147 return state; 148 } 149 150 /* Raw HID processing*/ 151 void raw_hid_receive(uint8_t *data, uint8_t length) { 152 dprintf("raw_hid_receive - received %u bytes \n", length); 153 154 if (is_display_enabled()) { 155 display_process_raw_hid_data(data, length); 156 } else if (is_keyboard_master() && !is_keyboard_left()) { 157 dprint("RPC_ID_USER_HID_SYNC \n"); 158 transaction_rpc_send(RPC_ID_USER_HID_SYNC, length, data); 159 } 160 } 161 162 void hid_sync(uint8_t initiator2target_buffer_size, const void *initiator2target_buffer, uint8_t target2initiator_buffer_size, void *target2initiator_buffer) { 163 if (is_display_enabled()) { 164 display_process_raw_hid_data((uint8_t *)initiator2target_buffer, initiator2target_buffer_size); 165 } 166 } 167 168 void layer_sync(uint8_t initiator2target_buffer_size, const void *initiator2target_buffer, uint8_t target2initiator_buffer_size, void *target2initiator_buffer) { 169 if (is_display_enabled()) { 170 display_process_layer_state(*(uint8_t *)initiator2target_buffer); 171 } 172 } 173 174 void caps_word_sync(uint8_t initiator2target_buffer_size, const void *initiator2target_buffer, uint8_t target2initiator_buffer_size, void *target2initiator_buffer) { 175 if (is_display_enabled()) { 176 display_process_caps_word(*(bool *)initiator2target_buffer); 177 } 178 } 179 180 void keyboard_post_init_user() { 181 // sync received hid data 182 transaction_register_rpc(RPC_ID_USER_HID_SYNC, hid_sync); 183 // sync highest layer (a bit more performant than standard SPLIT_LAYER_STATE_ENABLE) 184 transaction_register_rpc(RPC_ID_USER_LAYER_SYNC, layer_sync); 185 // sync caps word state 186 transaction_register_rpc(RPC_ID_USER_CAPS_WORD_SYNC, caps_word_sync); 187 }