X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=quantum%2Fprocess_keycode%2Fprocess_combo.c;h=13f8bbb331278d746ed95fabf43ab192c83bf749;hb=657d05593491f7d4d1346f0f06f9972fdbde9095;hp=e2189ad98b3636a7be9c4011c228341a425bf015;hpb=6d6b3ee9fb03215d14a4ea0f9a354af1eb0b8575;p=qmk_firmware.git diff --git a/quantum/process_keycode/process_combo.c b/quantum/process_keycode/process_combo.c index e2189ad98..13f8bbb33 100644 --- a/quantum/process_keycode/process_combo.c +++ b/quantum/process_keycode/process_combo.c @@ -1,12 +1,25 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "process_combo.h" #include "print.h" -#define COMBO_TIMER_ELAPSED -1 - - __attribute__ ((weak)) -combo_t key_combos[] = { +combo_t key_combos[COMBO_COUNT] = { }; @@ -49,7 +62,7 @@ static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t * if (-1 == (int8_t)index) return false; /* The combos timer is used to signal whether the combo is active */ - bool is_combo_active = COMBO_TIMER_ELAPSED == combo->timer ? false : true; + bool is_combo_active = combo->is_active; if (record->event.pressed) { KEY_STATE_DOWN(index); @@ -57,9 +70,10 @@ static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t * if (is_combo_active) { if (ALL_COMBO_KEYS_ARE_DOWN) { /* Combo was pressed */ send_combo(combo->keycode, true); - combo->timer = COMBO_TIMER_ELAPSED; + combo->is_active = false; } else { /* Combo key was pressed */ combo->timer = timer_read(); + combo->is_active = true; #ifdef COMBO_ALLOW_ACTION_KEYS combo->prev_record = *record; #else @@ -83,6 +97,7 @@ static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t * send_keyboard_report(); unregister_code16(keycode); #endif + combo->is_active = false; combo->timer = 0; } @@ -90,6 +105,7 @@ static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t * } if (NO_COMBO_KEYS_ARE_DOWN) { + combo->is_active = true; combo->timer = 0; } @@ -111,15 +127,19 @@ bool process_combo(uint16_t keycode, keyrecord_t *record) void matrix_scan_combo(void) { for (int i = 0; i < COMBO_COUNT; ++i) { + // Do not treat the (weak) key_combos too strict. + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Warray-bounds" combo_t *combo = &key_combos[i]; - if (combo->timer && - combo->timer != COMBO_TIMER_ELAPSED && + #pragma GCC diagnostic pop + if (combo->is_active && + combo->timer && timer_elapsed(combo->timer) > COMBO_TERM) { - + /* This disables the combo, meaning key events for this * combo will be handled by the next processors in the chain */ - combo->timer = COMBO_TIMER_ELAPSED; + combo->is_active = false; #ifdef COMBO_ALLOW_ACTION_KEYS process_action(&combo->prev_record,