-static inline void send_combo(uint16_t action, bool pressed)
-{
- if (action) {
- if (pressed) {
- register_code16(action);
- } else {
- unregister_code16(action);
- }
- } else {
- process_combo_event(current_combo_index, pressed);
- }
-}
-
-#define ALL_COMBO_KEYS_ARE_DOWN (((1<<count)-1) == combo->state)
-#define NO_COMBO_KEYS_ARE_DOWN (0 == combo->state)
-#define KEY_STATE_DOWN(key) do{ combo->state |= (1<<key); } while(0)
-#define KEY_STATE_UP(key) do{ combo->state &= ~(1<<key); } while(0)
-static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t *record)
-{
- uint8_t count = 0;
- uint8_t index = -1;
- /* Find index of keycode and number of combo keys */
- for (const uint16_t *keys = combo->keys; ;++count) {
- uint16_t key = pgm_read_word(&keys[count]);
- if (keycode == key) index = count;
- if (COMBO_END == key) break;
- }
-
- /* Return if not a combo key */
- 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;
-
- if (record->event.pressed) {
- KEY_STATE_DOWN(index);
-
- if (is_combo_active) {
- if (ALL_COMBO_KEYS_ARE_DOWN) { /* Combo was pressed */
- send_combo(combo->keycode, true);
- combo->timer = COMBO_TIMER_ELAPSED;
- } else { /* Combo key was pressed */
- combo->timer = timer_read();