qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

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 }