summaryrefslogtreecommitdiff
path: root/keyboards
diff options
context:
space:
mode:
authorVineet Kumar <git@vineetk.net>2026-03-26 11:24:52 -0400
committerVineet Kumar <git@vineetk.net>2026-03-26 11:24:52 -0400
commit56651d275205eb9d12dd3098431724a933449ddc (patch)
tree85603d4a5b552f6e19c81a8362ea4408fe74d2ee /keyboards
parent684d31094c664cd9c95b6d91ae2bd5433946610d (diff)
keyboards/ferris: add current keymap
Diffstat (limited to 'keyboards')
-rw-r--r--keyboards/ferris/keymaps/mine/config.h17
-rw-r--r--keyboards/ferris/keymaps/mine/keymap.c109
-rw-r--r--keyboards/ferris/keymaps/mine/rules.mk1
3 files changed, 127 insertions, 0 deletions
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 @@
1#pragma once
2
3/* Handedness */
4#define MASTER_LEFT
5
6/* Home Row Mods Configuration */
7#define TAPPING_TERM 200
8#define QUICK_TAP_TERM 0 // auto repeat isn't good for HRM
9
10/* don't enable yet until I get more comfortable with HRM */
11//#define PERMISSIVE_HOLD
12
13/* Native QMK Chordal Hold Logic (previously the acchordion extension) */
14#define CHORDAL_HOLD // enables the opposite hands rule
15
16/* caps word is a better caps lock */
17#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 @@
1#include QMK_KEYBOARD_H
2
3// Layer Definitions
4enum 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 ---
26const 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 ---
65layer_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 */
75char 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 */
84bool 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}
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