summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorChristoph Cullmann <cullmann@kde.org>2023-10-02 20:51:37 +0200
committerChristoph Cullmann <cullmann@kde.org>2023-10-02 20:51:37 +0200
commit7d775436673a635231c4d068a9197a0d654755c5 (patch)
treea5f3b2c8f39b21234075703d9f56426d66b0a3ae /common
parentd1f1e184f54f2488893a6b18e0b5a956c838db6c (diff)
add achordion config
Diffstat (limited to 'common')
-rw-r--r--common/config.h4
-rw-r--r--common/keymap.h40
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);
}