diff options
Diffstat (limited to 'quantum/process_keycode')
| -rw-r--r-- | quantum/process_keycode/process_combo.c | 52 | ||||
| -rw-r--r-- | quantum/process_keycode/process_connection.c | 36 | ||||
| -rw-r--r-- | quantum/process_keycode/process_connection.h | 9 | ||||
| -rw-r--r-- | quantum/process_keycode/process_rgb.c | 226 | ||||
| -rw-r--r-- | quantum/process_keycode/process_rgb.h | 22 | 
5 files changed, 82 insertions, 263 deletions
| diff --git a/quantum/process_keycode/process_combo.c b/quantum/process_keycode/process_combo.c index b0034d136a..c99a66a74b 100644 --- a/quantum/process_keycode/process_combo.c +++ b/quantum/process_keycode/process_combo.c @@ -36,19 +36,19 @@ __attribute__((weak)) uint8_t combo_ref_from_layer(uint8_t layer) {  #endif  #ifdef COMBO_MUST_HOLD_PER_COMBO -__attribute__((weak)) bool get_combo_must_hold(uint16_t index, combo_t *combo) { +__attribute__((weak)) bool get_combo_must_hold(uint16_t combo_index, combo_t *combo) {      return false;  }  #endif  #ifdef COMBO_MUST_TAP_PER_COMBO -__attribute__((weak)) bool get_combo_must_tap(uint16_t index, combo_t *combo) { +__attribute__((weak)) bool get_combo_must_tap(uint16_t combo_index, combo_t *combo) {      return false;  }  #endif  #ifdef COMBO_TERM_PER_COMBO -__attribute__((weak)) uint16_t get_combo_term(uint16_t index, combo_t *combo) { +__attribute__((weak)) uint16_t get_combo_term(uint16_t combo_index, combo_t *combo) {      return COMBO_TERM;  }  #endif @@ -65,12 +65,20 @@ __attribute__((weak)) bool process_combo_key_release(uint16_t combo_index, combo  }  #endif +#ifdef COMBO_PROCESS_KEY_REPRESS +__attribute__((weak)) bool process_combo_key_repress(uint16_t combo_index, combo_t *combo, uint8_t key_index, uint16_t keycode) { +    return false; +} +#endif +  #ifdef COMBO_SHOULD_TRIGGER  __attribute__((weak)) bool combo_should_trigger(uint16_t combo_index, combo_t *combo, uint16_t keycode, keyrecord_t *record) {      return true;  }  #endif +typedef enum { COMBO_KEY_NOT_PRESSED, COMBO_KEY_PRESSED, COMBO_KEY_REPRESSED } combo_key_action_t; +  #ifndef COMBO_NO_TIMER  static uint16_t timer = 0;  #endif @@ -414,14 +422,14 @@ static bool keys_pressed_in_order(uint16_t combo_index, combo_t *combo, uint16_t  }  #endif -static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t *record, uint16_t combo_index) { +static combo_key_action_t process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t *record, uint16_t combo_index) {      uint8_t  key_count = 0;      uint16_t key_index = -1;      _find_key_index_and_count(combo->keys, keycode, &key_index, &key_count);      /* Continue processing if key isn't part of current combo. */      if (-1 == (int16_t)key_index) { -        return false; +        return COMBO_KEY_NOT_PRESSED;      }      bool key_is_part_of_combo = (!COMBO_DISABLED(combo) && is_combo_enabled() @@ -449,7 +457,7 @@ static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t *              /* Don't buffer this combo if its combo term has passed. */              if (timer && timer_elapsed(timer) > time) {                  DISABLE_COMBO(combo); -                return true; +                return COMBO_KEY_PRESSED;              } else  #endif              { @@ -485,6 +493,15 @@ static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t *                  }              } // if timer elapsed end          } +#ifdef COMBO_PROCESS_KEY_REPRESS +    } else if (record->event.pressed) { +        if (COMBO_ACTIVE(combo)) { +            if (process_combo_key_repress(combo_index, combo, key_index, keycode)) { +                KEY_STATE_DOWN(combo->state, key_index); +                return COMBO_KEY_REPRESSED; +            } +        } +#endif      } else {          // chord releases          if (!COMBO_ACTIVE(combo) && ALL_COMBO_KEYS_ARE_DOWN(COMBO_STATE(combo), key_count)) { @@ -531,12 +548,12 @@ static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t *          KEY_STATE_UP(combo->state, key_index);      } -    return key_is_part_of_combo; +    return key_is_part_of_combo ? COMBO_KEY_PRESSED : COMBO_KEY_NOT_PRESSED;  }  bool process_combo(uint16_t keycode, keyrecord_t *record) { -    bool is_combo_key          = false; -    bool no_combo_keys_pressed = true; +    uint8_t is_combo_key          = COMBO_KEY_NOT_PRESSED; +    bool    no_combo_keys_pressed = true;      if (keycode == QK_COMBO_ON && record->event.pressed) {          combo_enable(); @@ -582,12 +599,17 @@ bool process_combo(uint16_t keycode, keyrecord_t *record) {  #    endif  #endif -        if (key_buffer_size < COMBO_KEY_BUFFER_LENGTH) { -            key_buffer[key_buffer_size++] = (queued_record_t){ -                .record      = *record, -                .keycode     = keycode, -                .combo_index = -1, // this will be set when applying combos -            }; +#ifdef COMBO_PROCESS_KEY_REPRESS +        if (is_combo_key == COMBO_KEY_PRESSED) +#endif +        { +            if (key_buffer_size < COMBO_KEY_BUFFER_LENGTH) { +                key_buffer[key_buffer_size++] = (queued_record_t){ +                    .record      = *record, +                    .keycode     = keycode, +                    .combo_index = -1, // this will be set when applying combos +                }; +            }          }      } else {          if (combo_buffer_read != combo_buffer_write) { diff --git a/quantum/process_keycode/process_connection.c b/quantum/process_keycode/process_connection.c new file mode 100644 index 0000000000..b0e230d680 --- /dev/null +++ b/quantum/process_keycode/process_connection.c @@ -0,0 +1,36 @@ +// Copyright 2024 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#include "outputselect.h" +#include "process_connection.h" + +bool process_connection(uint16_t keycode, keyrecord_t *record) { +    if (record->event.pressed) { +        switch (keycode) { +            case QK_OUTPUT_NEXT: +                set_output(OUTPUT_AUTO); // This should cycle through the outputs going forward. Ensure `docs/keycodes.md`, `docs/features/bluetooth.md` are updated when it does. +                return false; +            case QK_OUTPUT_USB: +                set_output(OUTPUT_USB); +                return false; +            case QK_OUTPUT_BLUETOOTH: +                set_output(OUTPUT_BLUETOOTH); +                return false; + +            case QK_OUTPUT_PREV: +            case QK_OUTPUT_NONE: +            case QK_OUTPUT_2P4GHZ: +            case QK_BLUETOOTH_PROFILE_NEXT: +            case QK_BLUETOOTH_PROFILE_PREV: +            case QK_BLUETOOTH_UNPAIR: +            case QK_BLUETOOTH_PROFILE1: +            case QK_BLUETOOTH_PROFILE2: +            case QK_BLUETOOTH_PROFILE3: +            case QK_BLUETOOTH_PROFILE4: +            case QK_BLUETOOTH_PROFILE5: +                // As-yet unimplemented. +                // When implementation is done, ensure `docs/keycodes.md`, `docs/features/bluetooth.md` are updated accordingly. +                return false; +        } +    } +    return true; +} diff --git a/quantum/process_keycode/process_connection.h b/quantum/process_keycode/process_connection.h new file mode 100644 index 0000000000..cc58011bb7 --- /dev/null +++ b/quantum/process_keycode/process_connection.h @@ -0,0 +1,9 @@ +// Copyright 2024 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include <stdint.h> +#include <stdbool.h> +#include "action.h" + +bool process_connection(uint16_t keycode, keyrecord_t *record); diff --git a/quantum/process_keycode/process_rgb.c b/quantum/process_keycode/process_rgb.c deleted file mode 100644 index b113d1c1e7..0000000000 --- a/quantum/process_keycode/process_rgb.c +++ /dev/null @@ -1,226 +0,0 @@ -/* Copyright 2019 - * - * 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 <http://www.gnu.org/licenses/>. - */ -#include "process_rgb.h" -#include "action_util.h" - -#ifdef RGB_MATRIX_ENABLE -#    include "rgb_matrix.h" -#endif -#ifdef RGBLIGHT_ENABLE -#    include "rgblight.h" -#endif - -typedef void (*rgb_func_pointer)(void); - -/** - * Wrapper for inc/dec rgb keycode - * - * noinline to optimise for firmware size not speed (not in hot path) - */ -#if (defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)) || (defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)) -static void __attribute__((noinline)) handleKeycodeRGB(const uint8_t is_shifted, const rgb_func_pointer inc_func, const rgb_func_pointer dec_func) { -    if (is_shifted) { -        dec_func(); -    } else { -        inc_func(); -    } -} -#endif - -/** - * Wrapper for animation mode - *   - if not in animation family -> jump to that animation - *   - otherwise -> wrap round animation speed - * - * noinline to optimise for firmware size not speed (not in hot path) - */ -static void __attribute__((noinline, unused)) handleKeycodeRGBMode(const uint8_t start, const uint8_t end) { -    if ((start <= rgblight_get_mode()) && (rgblight_get_mode() < end)) { -        rgblight_step(); -    } else { -        rgblight_mode(start); -    } -} - -/** - * Handle keycodes for both rgblight and rgbmatrix - */ -bool process_rgb(const uint16_t keycode, const keyrecord_t *record) { -    // need to trigger on key-up for edge-case issue -#ifndef RGB_TRIGGER_ON_KEYDOWN -    if (!record->event.pressed) { -#else -    if (record->event.pressed) { -#endif -#if (defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)) || (defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)) -        uint8_t shifted = get_mods() & MOD_MASK_SHIFT; -#endif -        switch (keycode) { -            case QK_UNDERGLOW_TOGGLE: -#if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES) -                rgblight_toggle(); -#endif -#if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES) -                rgb_matrix_toggle(); -#endif -                return false; -            case QK_UNDERGLOW_MODE_NEXT: -#if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES) -                handleKeycodeRGB(shifted, rgblight_step, rgblight_step_reverse); -#endif -#if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES) -                handleKeycodeRGB(shifted, rgb_matrix_step, rgb_matrix_step_reverse); -#endif -                return false; -            case QK_UNDERGLOW_MODE_PREVIOUS: -#if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES) -                handleKeycodeRGB(shifted, rgblight_step_reverse, rgblight_step); -#endif -#if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES) -                handleKeycodeRGB(shifted, rgb_matrix_step_reverse, rgb_matrix_step); -#endif -                return false; -            case QK_UNDERGLOW_HUE_UP: -#if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES) -                handleKeycodeRGB(shifted, rgblight_increase_hue, rgblight_decrease_hue); -#endif -#if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES) -                handleKeycodeRGB(shifted, rgb_matrix_increase_hue, rgb_matrix_decrease_hue); -#endif -                return false; -            case QK_UNDERGLOW_HUE_DOWN: -#if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES) -                handleKeycodeRGB(shifted, rgblight_decrease_hue, rgblight_increase_hue); -#endif -#if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES) -                handleKeycodeRGB(shifted, rgb_matrix_decrease_hue, rgb_matrix_increase_hue); -#endif -                return false; -            case QK_UNDERGLOW_SATURATION_UP: -#if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES) -                handleKeycodeRGB(shifted, rgblight_increase_sat, rgblight_decrease_sat); -#endif -#if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES) -                handleKeycodeRGB(shifted, rgb_matrix_increase_sat, rgb_matrix_decrease_sat); -#endif -                return false; -            case QK_UNDERGLOW_SATURATION_DOWN: -#if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES) -                handleKeycodeRGB(shifted, rgblight_decrease_sat, rgblight_increase_sat); -#endif -#if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES) -                handleKeycodeRGB(shifted, rgb_matrix_decrease_sat, rgb_matrix_increase_sat); -#endif -                return false; -            case QK_UNDERGLOW_VALUE_UP: -#if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES) -                handleKeycodeRGB(shifted, rgblight_increase_val, rgblight_decrease_val); -#endif -#if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES) -                handleKeycodeRGB(shifted, rgb_matrix_increase_val, rgb_matrix_decrease_val); -#endif -                return false; -            case QK_UNDERGLOW_VALUE_DOWN: -#if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES) -                handleKeycodeRGB(shifted, rgblight_decrease_val, rgblight_increase_val); -#endif -#if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES) -                handleKeycodeRGB(shifted, rgb_matrix_decrease_val, rgb_matrix_increase_val); -#endif -                return false; -            case QK_UNDERGLOW_SPEED_UP: -#if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES) -                handleKeycodeRGB(shifted, rgblight_increase_speed, rgblight_decrease_speed); -#endif -#if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES) -                handleKeycodeRGB(shifted, rgb_matrix_increase_speed, rgb_matrix_decrease_speed); -#endif -                return false; -            case QK_UNDERGLOW_SPEED_DOWN: -#if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES) -                handleKeycodeRGB(shifted, rgblight_decrease_speed, rgblight_increase_speed); -#endif -#if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES) -                handleKeycodeRGB(shifted, rgb_matrix_decrease_speed, rgb_matrix_increase_speed); -#endif -                return false; -            case RGB_MODE_PLAIN: -#if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES) -                rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT); -#endif -#if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES) -                rgb_matrix_mode(RGB_MATRIX_SOLID_COLOR); -#endif -                return false; -            case RGB_MODE_BREATHE: -#if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES) && defined(RGBLIGHT_EFFECT_BREATHING) -                handleKeycodeRGBMode(RGBLIGHT_MODE_BREATHING, RGBLIGHT_MODE_BREATHING_end); -#endif -#if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES) && defined(ENABLE_RGB_MATRIX_BREATHING) -                rgb_matrix_mode(RGB_MATRIX_BREATHING); -#endif -                return false; -            case RGB_MODE_RAINBOW: -#if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES) && defined(RGBLIGHT_EFFECT_RAINBOW_MOOD) -                handleKeycodeRGBMode(RGBLIGHT_MODE_RAINBOW_MOOD, RGBLIGHT_MODE_RAINBOW_MOOD_end); -#endif -#if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES) && defined(ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT) -                rgb_matrix_mode(RGB_MATRIX_CYCLE_LEFT_RIGHT); -#endif -                return false; -            case RGB_MODE_SWIRL: -#if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES) && defined(RGBLIGHT_EFFECT_RAINBOW_SWIRL) -                handleKeycodeRGBMode(RGBLIGHT_MODE_RAINBOW_SWIRL, RGBLIGHT_MODE_RAINBOW_SWIRL_end); -#endif -#if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES) && defined(ENABLE_RGB_MATRIX_CYCLE_PINWHEEL) -                rgb_matrix_mode(RGB_MATRIX_CYCLE_PINWHEEL); -#endif -                return false; -            case RGB_MODE_SNAKE: -#if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES) && defined(RGBLIGHT_EFFECT_SNAKE) -                handleKeycodeRGBMode(RGBLIGHT_MODE_SNAKE, RGBLIGHT_MODE_SNAKE_end); -#endif -                return false; -            case RGB_MODE_KNIGHT: -#if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES) && defined(RGBLIGHT_EFFECT_KNIGHT) -                handleKeycodeRGBMode(RGBLIGHT_MODE_KNIGHT, RGBLIGHT_MODE_KNIGHT_end); -#endif -                return false; -            case RGB_MODE_XMAS: -#if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES) && defined(RGBLIGHT_EFFECT_CHRISTMAS) -                rgblight_mode(RGBLIGHT_MODE_CHRISTMAS); -#endif -                return false; -            case RGB_MODE_GRADIENT: -#if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES) && defined(RGBLIGHT_EFFECT_STATIC_GRADIENT) -                handleKeycodeRGBMode(RGBLIGHT_MODE_STATIC_GRADIENT, RGBLIGHT_MODE_STATIC_GRADIENT_end); -#endif -                return false; -            case RGB_MODE_RGBTEST: -#if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES) && defined(RGBLIGHT_EFFECT_RGB_TEST) -                rgblight_mode(RGBLIGHT_MODE_RGB_TEST); -#endif -                return false; -            case RGB_MODE_TWINKLE: -#if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES) && defined(RGBLIGHT_EFFECT_TWINKLE) -                handleKeycodeRGBMode(RGBLIGHT_MODE_TWINKLE, RGBLIGHT_MODE_TWINKLE_end); -#endif -                return false; -        } -    } - -    return true; -} diff --git a/quantum/process_keycode/process_rgb.h b/quantum/process_keycode/process_rgb.h deleted file mode 100644 index b1069d4bb6..0000000000 --- a/quantum/process_keycode/process_rgb.h +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright 2019 - * - * 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 <http://www.gnu.org/licenses/>. - */ -#pragma once - -#include <stdint.h> -#include <stdbool.h> -#include "action.h" - -bool process_rgb(const uint16_t keycode, const keyrecord_t *record); | 
