X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;f=common%2Faction_util.c;h=99a3adaab63fc2cf8f61fc17c49557d742932622;hb=4ab0ebb199601c37b5fd542d8425247b626bac6d;hp=50d686a07dc31035cf4aceaee4b70b89dbf478b0;hpb=d52d554360d3bf06189bfd4f386fa99348d8a0a8;p=max%2Ftmk_keyboard.git diff --git a/common/action_util.c b/common/action_util.c index 50d686a0..99a3adaa 100644 --- a/common/action_util.c +++ b/common/action_util.c @@ -18,6 +18,7 @@ along with this program. If not, see . #include "report.h" #include "debug.h" #include "action_util.h" +#include "timer.h" static inline void add_key_byte(uint8_t code); static inline void del_key_byte(uint8_t code); @@ -35,17 +36,28 @@ static uint8_t weak_mods = 0; report_keyboard_t *keyboard_report = &(report_keyboard_t){}; #ifndef NO_ACTION_ONESHOT -static bool oneshot_enabled = true; static int8_t oneshot_mods = 0; +#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) +static int16_t oneshot_time = 0; #endif +#endif + void send_keyboard_report(void) { keyboard_report->mods = real_mods; keyboard_report->mods |= weak_mods; #ifndef NO_ACTION_ONESHOT - keyboard_report->mods |= oneshot_mods; - if (has_anykey()) { - clear_oneshot_mods(); + if (oneshot_mods) { +#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) + if (TIMER_DIFF_16(timer_read(), oneshot_time) >= ONESHOT_TIMEOUT) { + dprintf("Oneshot: timeout\n"); + clear_oneshot_mods(); + } +#endif + keyboard_report->mods |= oneshot_mods; + if (has_anykey()) { + clear_oneshot_mods(); + } } #endif host_keyboard_send(keyboard_report); @@ -99,11 +111,20 @@ void clear_weak_mods(void) { weak_mods = 0; } /* Oneshot modifier */ #ifndef NO_ACTION_ONESHOT -void set_oneshot_mods(uint8_t mods) { oneshot_mods = mods; } -void clear_oneshot_mods(void) { oneshot_mods = 0; } -void oneshot_toggle(void) { oneshot_enabled = !oneshot_enabled; } -void oneshot_enable(void) { oneshot_enabled = true; } -void oneshot_disable(void) { oneshot_enabled = false; } +void set_oneshot_mods(uint8_t mods) +{ + oneshot_mods = mods; +#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) + oneshot_time = timer_read(); +#endif +} +void clear_oneshot_mods(void) +{ + oneshot_mods = 0; +#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) + oneshot_time = 0; +#endif +} #endif