keymap.c (4310B)
1 #include QMK_KEYBOARD_H 2 3 // Layer Definitions 4 enum layers { 5 _BASE, 6 _NUM, 7 _SYM, 8 _NAV, 9 _ADJ 10 }; 11 12 // --- Workman Home Row Mods (GACS) --- 13 // Left Hand 14 #define MT_A_GUI LGUI_T(KC_A) 15 #define MT_S_ALT LALT_T(KC_S) 16 #define MT_H_CTL LCTL_T(KC_H) 17 #define MT_T_SFT LSFT_T(KC_T) 18 19 // Right Hand 20 #define MT_N_SFT RSFT_T(KC_N) 21 #define MT_E_CTL RCTL_T(KC_E) 22 #define MT_O_ALT RALT_T(KC_O) 23 #define MT_I_GUI RGUI_T(KC_I) 24 25 // --- Keymap --- 26 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 27 [_BASE] = LAYOUT( 28 KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_SCLN, 29 MT_A_GUI, MT_S_ALT, MT_H_CTL, MT_T_SFT, KC_G, KC_Y, MT_N_SFT, MT_E_CTL, MT_O_ALT, MT_I_GUI, 30 KC_Z, KC_X, KC_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, 31 KC_BSPC, LT(_NAV, KC_SPC), LT(_SYM, KC_ENT), LT(_NUM, KC_TAB) 32 ), 33 34 [_NUM] = LAYOUT( 35 XXXXXXX, KC_7, KC_8, KC_9, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, 36 KC_DOT, KC_4, KC_5, KC_6, KC_0, XXXXXXX, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, 37 KC_COMM, KC_1, KC_2, KC_3, KC_ASTR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, 38 _______, _______, _______, _______ 39 ), 40 41 /* symbol layer is for those not accessed by shift+num */ 42 [_SYM] = LAYOUT( 43 XXXXXXX, KC_BSLS, KC_QUOT, KC_LPRN, KC_RPRN, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, 44 KC_GRV, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, XXXXXXX, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, 45 KC_TILD, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, 46 _______, _______, _______, _______ 47 ), 48 49 [_NAV] = LAYOUT( 50 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PGUP, KC_HOME, KC_END, XXXXXXX, XXXXXXX, 51 KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_PGDN, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, 52 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, 53 _______, _______, _______, _______ 54 ), 55 56 [_ADJ] = LAYOUT( 57 KC_F12, KC_F7, KC_F8, KC_F9, QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, 58 KC_F11, KC_F4, KC_F5, KC_F6, KC_DEL, XXXXXXX, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, 59 KC_F10, KC_F1, KC_F2, KC_F3, KC_PSCR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, 60 _______, _______, _______, _______ 61 ) 62 }; 63 64 // --- Layer Logic --- 65 layer_state_t layer_state_set_user(layer_state_t state) { 66 return update_tri_layer_state(state, _NAV, _NUM, _ADJ); 67 } 68 69 // --- Chordal Hold Implementation (Replaces Achordion) --- 70 71 /** * Define Handedness: 72 * Sweep usually has 5 columns per side. 73 * Cols 0-4 are Left, 5-9 are Right. 74 */ 75 char chordal_hold_handedness(keypos_t key) { 76 return key.col < 5 ? 'L' : 'R'; 77 } 78 79 /** 80 * Define Logic: 81 * Return true = Allow Hold (Logic is satisfied, or exception granted) 82 * Return false = Force Tap (Same hand detected, deny hold) 83 */ 84 bool get_chordal_hold(uint16_t tap_hold_keycode, keyrecord_t* tap_hold_record, 85 uint16_t other_keycode, keyrecord_t* other_record) { 86 87 // 1. Emacs M-DEL Exception 88 // Left Alt (Ring) + Backspace (Outer Thumb) 89 // Both are on Left hand, but we return TRUE to allow the hold. 90 if (tap_hold_keycode == MT_S_ALT && other_keycode == KC_BSPC) { 91 return true; 92 } 93 94 // 2. Emacs C-w Exception (Kill Region) 95 // Left Ctrl (Middle) + W (Index Top) 96 if (tap_hold_keycode == MT_H_CTL && other_keycode == KC_W) { 97 return true; 98 } 99 100 // 3. Emacs C-g Exception (Quit/Cancel) 101 // Left Ctrl (Middle) + G (Index Inner) 102 if (tap_hold_keycode == MT_H_CTL && other_keycode == KC_G) { 103 return true; 104 } 105 106 // Default: Defer to the standard Opposite Hands rule 107 // (If same hand -> Tap. If opposite hand -> Hold). 108 return get_chordal_hold_default(tap_hold_record, other_record); 109 }