From 56651d275205eb9d12dd3098431724a933449ddc Mon Sep 17 00:00:00 2001 From: Vineet Kumar Date: Thu, 26 Mar 2026 11:24:52 -0400 Subject: keyboards/ferris: add current keymap --- keyboards/ferris/keymaps/mine/config.h | 17 +++++ keyboards/ferris/keymaps/mine/keymap.c | 109 +++++++++++++++++++++++++++++++++ keyboards/ferris/keymaps/mine/rules.mk | 1 + 3 files changed, 127 insertions(+) create mode 100644 keyboards/ferris/keymaps/mine/config.h create mode 100644 keyboards/ferris/keymaps/mine/keymap.c create mode 100644 keyboards/ferris/keymaps/mine/rules.mk diff --git a/keyboards/ferris/keymaps/mine/config.h b/keyboards/ferris/keymaps/mine/config.h new file mode 100644 index 0000000000..c0369f2af6 --- /dev/null +++ b/keyboards/ferris/keymaps/mine/config.h @@ -0,0 +1,17 @@ +#pragma once + +/* Handedness */ +#define MASTER_LEFT + +/* Home Row Mods Configuration */ +#define TAPPING_TERM 200 +#define QUICK_TAP_TERM 0 // auto repeat isn't good for HRM + +/* don't enable yet until I get more comfortable with HRM */ +//#define PERMISSIVE_HOLD + +/* Native QMK Chordal Hold Logic (previously the acchordion extension) */ +#define CHORDAL_HOLD // enables the opposite hands rule + +/* caps word is a better caps lock */ +#define BOTH_SHIFTS_TURNS_ON_CAPS_WORD diff --git a/keyboards/ferris/keymaps/mine/keymap.c b/keyboards/ferris/keymaps/mine/keymap.c new file mode 100644 index 0000000000..d8eab15f64 --- /dev/null +++ b/keyboards/ferris/keymaps/mine/keymap.c @@ -0,0 +1,109 @@ +#include QMK_KEYBOARD_H + +// Layer Definitions +enum layers { + _BASE, + _NUM, + _SYM, + _NAV, + _ADJ +}; + +// --- Workman Home Row Mods (GACS) --- +// Left Hand +#define MT_A_GUI LGUI_T(KC_A) +#define MT_S_ALT LALT_T(KC_S) +#define MT_H_CTL LCTL_T(KC_H) +#define MT_T_SFT LSFT_T(KC_T) + +// Right Hand +#define MT_N_SFT RSFT_T(KC_N) +#define MT_E_CTL RCTL_T(KC_E) +#define MT_O_ALT RALT_T(KC_O) +#define MT_I_GUI RGUI_T(KC_I) + +// --- Keymap --- +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT( + KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_SCLN, + 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, + KC_Z, KC_X, KC_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, + KC_BSPC, LT(_NAV, KC_SPC), LT(_SYM, KC_ENT), LT(_NUM, KC_TAB) + ), + + [_NUM] = LAYOUT( + XXXXXXX, KC_7, KC_8, KC_9, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_DOT, KC_4, KC_5, KC_6, KC_0, XXXXXXX, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, + KC_COMM, KC_1, KC_2, KC_3, KC_ASTR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, _______, _______, _______ + ), + + /* symbol layer is for those not accessed by shift+num */ + [_SYM] = LAYOUT( + XXXXXXX, KC_BSLS, KC_QUOT, KC_LPRN, KC_RPRN, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_GRV, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, XXXXXXX, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, + KC_TILD, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, _______, _______, _______ + ), + + [_NAV] = LAYOUT( + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PGUP, KC_HOME, KC_END, XXXXXXX, XXXXXXX, + KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_PGDN, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, + _______, _______, _______, _______ + ), + + [_ADJ] = LAYOUT( + KC_F12, KC_F7, KC_F8, KC_F9, QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_F11, KC_F4, KC_F5, KC_F6, KC_DEL, XXXXXXX, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, + KC_F10, KC_F1, KC_F2, KC_F3, KC_PSCR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, _______, _______, _______ + ) +}; + +// --- Layer Logic --- +layer_state_t layer_state_set_user(layer_state_t state) { + return update_tri_layer_state(state, _NAV, _NUM, _ADJ); +} + +// --- Chordal Hold Implementation (Replaces Achordion) --- + +/** * Define Handedness: + * Sweep usually has 5 columns per side. + * Cols 0-4 are Left, 5-9 are Right. + */ +char chordal_hold_handedness(keypos_t key) { + return key.col < 5 ? 'L' : 'R'; +} + +/** + * Define Logic: + * Return true = Allow Hold (Logic is satisfied, or exception granted) + * Return false = Force Tap (Same hand detected, deny hold) + */ +bool get_chordal_hold(uint16_t tap_hold_keycode, keyrecord_t* tap_hold_record, + uint16_t other_keycode, keyrecord_t* other_record) { + + // 1. Emacs M-DEL Exception + // Left Alt (Ring) + Backspace (Outer Thumb) + // Both are on Left hand, but we return TRUE to allow the hold. + if (tap_hold_keycode == MT_S_ALT && other_keycode == KC_BSPC) { + return true; + } + + // 2. Emacs C-w Exception (Kill Region) + // Left Ctrl (Middle) + W (Index Top) + if (tap_hold_keycode == MT_H_CTL && other_keycode == KC_W) { + return true; + } + + // 3. Emacs C-g Exception (Quit/Cancel) + // Left Ctrl (Middle) + G (Index Inner) + if (tap_hold_keycode == MT_H_CTL && other_keycode == KC_G) { + return true; + } + + // Default: Defer to the standard Opposite Hands rule + // (If same hand -> Tap. If opposite hand -> Hold). + return get_chordal_hold_default(tap_hold_record, other_record); +} diff --git a/keyboards/ferris/keymaps/mine/rules.mk b/keyboards/ferris/keymaps/mine/rules.mk new file mode 100644 index 0000000000..9617c1460e --- /dev/null +++ b/keyboards/ferris/keymaps/mine/rules.mk @@ -0,0 +1 @@ +CONVERT_TO = rp2040_ce -- cgit v1.2.3