From 089910ceefcf96faa38a31efdbf644fd818049c9 Mon Sep 17 00:00:00 2001 From: Julian Schuler Date: Thu, 24 Apr 2025 21:11:31 +0200 Subject: [PATCH 1/2] Add unit test for single key combo pressed twice --- tests/combo/test_combo.cpp | 15 +++++++++++++++ tests/combo/test_combos.c | 6 ++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/tests/combo/test_combo.cpp b/tests/combo/test_combo.cpp index d78ec55990b..cc6425a94cc 100644 --- a/tests/combo/test_combo.cpp +++ b/tests/combo/test_combo.cpp @@ -54,3 +54,18 @@ TEST_F(Combo, combo_osmshift_tapped) { tap_key(key_i); VERIFY_AND_CLEAR(driver); } + +TEST_F(Combo, combo_single_key_twice) { + TestDriver driver; + KeymapKey key_a(0, 0, 1, KC_A); + set_keymap({key_a}); + + EXPECT_REPORT(driver, (KC_B)); + tap_combo({key_a}); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_B)); + EXPECT_EMPTY_REPORT(driver); + tap_combo({key_a}); + VERIFY_AND_CLEAR(driver); +} diff --git a/tests/combo/test_combos.c b/tests/combo/test_combos.c index 8dcb364c6e5..9a0465a9b47 100644 --- a/tests/combo/test_combos.c +++ b/tests/combo/test_combos.c @@ -4,14 +4,16 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "quantum.h" -enum combos { modtest, osmshift }; +enum combos { modtest, osmshift, single_key }; uint16_t const modtest_combo[] = {KC_Y, KC_U, COMBO_END}; uint16_t const osmshift_combo[] = {KC_Z, KC_X, COMBO_END}; +uint16_t const single_key_combo[] = {KC_A, COMBO_END}; // clang-format off combo_t key_combos[] = { [modtest] = COMBO(modtest_combo, RSFT_T(KC_SPACE)), - [osmshift] = COMBO(osmshift_combo, OSM(MOD_LSFT)) + [osmshift] = COMBO(osmshift_combo, OSM(MOD_LSFT)), + [single_key] = COMBO(single_key_combo, KC_B), }; // clang-format on From 1366509a6bb0ff82dfdf82dc52a0a3651d99b148 Mon Sep 17 00:00:00 2001 From: Julian Schuler Date: Thu, 24 Apr 2025 21:12:44 +0200 Subject: [PATCH 2/2] Fix single key chords not being released --- quantum/process_keycode/process_combo.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/quantum/process_keycode/process_combo.c b/quantum/process_keycode/process_combo.c index c99a66a74b0..b02b7f54330 100644 --- a/quantum/process_keycode/process_combo.c +++ b/quantum/process_keycode/process_combo.c @@ -347,6 +347,10 @@ void apply_combo(uint16_t combo_index, combo_t *combo) { qrecord->combo_index = combo_index; ACTIVATE_COMBO(combo); + if (key_count == 1) { + release_combo(combo_index, combo); + } + break; } else { // key was part of the combo but not the last one, "disable" it