fix tapdance with momentary modifiers; tap-timeout per tap.
Improves handling of momentary modifiers (i.e. different actions on hold or press/release) as tapdance targets. tap_time is reset for each consecutive single tap, instead of being applied to the entire tap sequence.
This commit is contained in:
parent
5aa123b550
commit
3e91f63c88
@ -211,16 +211,21 @@ class KMKKeyboard:
|
|||||||
or not self._tap_dance_counts[changed_key]
|
or not self._tap_dance_counts[changed_key]
|
||||||
):
|
):
|
||||||
self._tap_dance_counts[changed_key] = 1
|
self._tap_dance_counts[changed_key] = 1
|
||||||
self.set_timeout(
|
|
||||||
self.tap_time, lambda: self._end_tap_dance(changed_key)
|
|
||||||
)
|
|
||||||
self._tapping = True
|
self._tapping = True
|
||||||
else:
|
else:
|
||||||
|
self.cancel_timeout(self._tap_timeout)
|
||||||
self._tap_dance_counts[changed_key] += 1
|
self._tap_dance_counts[changed_key] += 1
|
||||||
|
|
||||||
if changed_key not in self._tap_side_effects:
|
if changed_key not in self._tap_side_effects:
|
||||||
self._tap_side_effects[changed_key] = None
|
self._tap_side_effects[changed_key] = None
|
||||||
|
|
||||||
|
self._tap_timeout = self.set_timeout(
|
||||||
|
self.tap_time, lambda: self._end_tap_dance(changed_key, hold=True)
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
|
if not isinstance(changed_key.meta, TapDanceKeyMeta):
|
||||||
|
return self
|
||||||
|
|
||||||
has_side_effects = self._tap_side_effects[changed_key] is not None
|
has_side_effects = self._tap_side_effects[changed_key] is not None
|
||||||
hit_max_defined_taps = self._tap_dance_counts[changed_key] == len(
|
hit_max_defined_taps = self._tap_dance_counts[changed_key] == len(
|
||||||
changed_key.meta.codes
|
changed_key.meta.codes
|
||||||
@ -229,26 +234,37 @@ class KMKKeyboard:
|
|||||||
if has_side_effects or hit_max_defined_taps:
|
if has_side_effects or hit_max_defined_taps:
|
||||||
self._end_tap_dance(changed_key)
|
self._end_tap_dance(changed_key)
|
||||||
|
|
||||||
|
self.cancel_timeout(self._tap_timeout)
|
||||||
|
self._tap_timeout = self.set_timeout(
|
||||||
|
self.tap_time, lambda: self._end_tap_dance(changed_key)
|
||||||
|
)
|
||||||
|
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def _end_tap_dance(self, td_key):
|
def _end_tap_dance(self, td_key, hold=False):
|
||||||
v = self._tap_dance_counts[td_key] - 1
|
v = self._tap_dance_counts[td_key] - 1
|
||||||
|
|
||||||
if v >= 0:
|
if v < 0:
|
||||||
|
return self
|
||||||
|
|
||||||
if td_key in self.keys_pressed:
|
if td_key in self.keys_pressed:
|
||||||
key_to_press = td_key.meta.codes[v]
|
key_to_press = td_key.meta.codes[v]
|
||||||
self.add_key(key_to_press)
|
self.add_key(key_to_press)
|
||||||
self._tap_side_effects[td_key] = key_to_press
|
self._tap_side_effects[td_key] = key_to_press
|
||||||
self.hid_pending = True
|
elif self._tap_side_effects[td_key]:
|
||||||
else:
|
|
||||||
if self._tap_side_effects[td_key]:
|
|
||||||
self.remove_key(self._tap_side_effects[td_key])
|
self.remove_key(self._tap_side_effects[td_key])
|
||||||
self._tap_side_effects[td_key] = None
|
self._tap_side_effects[td_key] = None
|
||||||
self.hid_pending = True
|
|
||||||
self._cleanup_tap_dance(td_key)
|
self._cleanup_tap_dance(td_key)
|
||||||
|
elif hold is False:
|
||||||
|
if td_key.meta.codes[v] in self.keys_pressed:
|
||||||
|
self.remove_key(td_key.meta.codes[v])
|
||||||
else:
|
else:
|
||||||
self.tap_key(td_key.meta.codes[v])
|
self.tap_key(td_key.meta.codes[v])
|
||||||
self._cleanup_tap_dance(td_key)
|
self._cleanup_tap_dance(td_key)
|
||||||
|
else:
|
||||||
|
self.add_key(td_key.meta.codes[v])
|
||||||
|
|
||||||
|
self.hid_pending = True
|
||||||
|
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user