From b55942731d364272416c3091e06409781a94d5d8 Mon Sep 17 00:00:00 2001 From: James Fitzgerald Date: Mon, 27 Jun 2022 11:36:11 -0400 Subject: [PATCH] Add toggle functionality --- docs/rapidfire.md | 5 +++-- kmk/modules/rapidfire.py | 18 ++++++++++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/docs/rapidfire.md b/docs/rapidfire.md index ba8d02d..7a324cb 100644 --- a/docs/rapidfire.md +++ b/docs/rapidfire.md @@ -28,6 +28,7 @@ The RapidFire keycode has a few different options: | `wait` | `200` | The delay before starting to repeat. Useful if you want to be able to type with keys that have a low `repeat` value. | | `randomize_repeat` | `False` | Randomize the value of `repeat`. Useful for making the repetitive input look human in instances where you may be flagged as a bot otherwise. | | `randomize_magnitude` | `15` | The magnitude of the randomization. If randomization is enabled, the repeat delay will be `repeat` plus or minus a random value up to this amount. | +| `toggle` | `False` | Toggle RapidFire state on keypress rather than needing to be held. | ### Example Code @@ -36,9 +37,9 @@ from kmk.modules.rapidfire import RapidFire keyboard.modules.append(RapidFire()) -# After 200 milliseconds, repeatedly send Shift+A every 75-125 milliseconds while the RapidFire key is held +# After 200 milliseconds, repeatedly send Shift+A every 75-125 milliseconds until the button is pressed again keyboard.keymap = [[ - KC.RF(KC.LSFT(KC.A), wait=200, repeat=100, randomize_repeat=True, randomize_magnitude=25) + KC.RF(KC.LSFT(KC.A), wait=200, repeat=100, randomize_repeat=True, randomize_magnitude=25, toggle=True) ]] ``` diff --git a/kmk/modules/rapidfire.py b/kmk/modules/rapidfire.py index af5a7f0..24b742b 100644 --- a/kmk/modules/rapidfire.py +++ b/kmk/modules/rapidfire.py @@ -6,17 +6,25 @@ from kmk.modules import Module class RapidFireMeta: def __init__( - self, kc, repeat=100, wait=200, randomize_repeat=False, randomize_magnitude=15 + self, + kc, + repeat=100, + wait=200, + randomize_repeat=False, + randomize_magnitude=15, + toggle=False, ): self.kc = kc self.repeat = repeat self.wait = wait self.randomize_repeat = randomize_repeat self.randomize_magnitude = randomize_magnitude + self.toggle = toggle class RapidFire(Module): _active_keys = {} + _toggled_keys = [] def __init__(self): make_argumented_key( @@ -40,13 +48,19 @@ class RapidFire(Module): ) def _rf_pressed(self, key, keyboard, *args, **kwargs): + if key in self._toggled_keys: + self._toggled_keys.remove(key) + self._rf_released(key, keyboard) + return keyboard.tap_key(key.meta.kc) + if key.meta.toggle: + self._toggled_keys.append(key) self._active_keys[key] = keyboard.set_timeout( key.meta.wait, lambda: self._on_timer_timeout(key, keyboard) ) def _rf_released(self, key, keyboard, *args, **kwargs): - if key in self._active_keys: + if key in self._active_keys and key not in self._toggled_keys: keyboard.cancel_timeout(self._active_keys[key]) self._active_keys.pop(key)