From 7d775436673a635231c4d068a9197a0d654755c5 Mon Sep 17 00:00:00 2001 From: Christoph Cullmann Date: Mon, 2 Oct 2023 20:51:37 +0200 Subject: [PATCH] add achordion config --- common/config.h | 4 ++-- common/keymap.h | 40 ++++++++++++++++++++++++++++------------ 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/common/config.h b/common/config.h index d23086e..aa3d506 100644 --- a/common/config.h +++ b/common/config.h @@ -35,5 +35,5 @@ // Enable rapid switch from tap to hold, disables double tap hold auto-repeat. #define QUICK_TAP_TERM 0 -// allow that thumb buttons have permissive hold, see keymap.h -#define PERMISSIVE_HOLD_PER_KEY +// use permissive hold together with achordion +#define PERMISSIVE_HOLD diff --git a/common/keymap.h b/common/keymap.h index 8b5fa46..051aef9 100644 --- a/common/keymap.h +++ b/common/keymap.h @@ -71,16 +71,32 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -bool get_permissive_hold(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case LT(_SYM, KC_SCLN): - case LT(_NUM, KC_SPC): - case LT(_NAV, KC_E): - case LT(_FN, KC_MINS): - // Immediately select the hold action when another key is tapped. - return true; - default: - // Do not select the hold action when another key is tapped. - return false; - } +#include "achordion.h" + +bool process_record_user(uint16_t keycode, keyrecord_t* record) { + if (!process_achordion(keycode, record)) { return false; } + return true; +} + +void matrix_scan_user(void) { + achordion_task(); +} + +// Returns true if `pos` on the left hand of the keyboard, false if right. +static bool on_left_hand(keypos_t pos) { + // works not really on planck for bottom row, but we handle that differently + return pos.row < MATRIX_ROWS / 2; +} + +bool achordion_chord(uint16_t tap_hold_keycode, + keyrecord_t* tap_hold_record, + uint16_t other_keycode, + keyrecord_t* other_record) { + // Also allow same-hand holds when the other key is in the rows below the + // alphas. I need the `% (MATRIX_ROWS / 2)` because my keyboard is split. + if (other_record->event.key.row % (MATRIX_ROWS / 2) >= 3) { return true; } + + // Otherwise, follow the opposite hands rule. + return on_left_hand(tap_hold_record->event.key) != + on_left_hand(other_record->event.key); }