Instead of handling resumed key events in a deep stack, buffer them
until the next main loop iteration. New resume events that may be emitted
during handling of old resumes are prepended to that buffer, i.e. take
precedence over events that happen deeper into the buffer/event stack.
Logical replay order is thus preserved.
- stricter timeouts: Instead of adding an entire millisecond, use a list
of timeouts that are supposed to be handled on the same tick. This
reduces the delay between target tick and actual tick, especially for
many timeouts issued to the same tick, i.e. combos.
- consistent timeouts: Timeouts are now guaranteed to be handled in the
order they were issued. Timer rollover is handled properly.
caveat / change to the interface: the returned `timeout_key` is a tuple
of the target timeout tick and the index of the timeout at that tick.
* extract tapdance logic into a module
* clean out old tapdance code
* canonicalize key variable names
* split _process_tap_dance into td_pressed and td_released
* implement consistent argument order
* update documentation
* implement Module.process_key for key interception and modification
* fix tapdance realesing instead of pressing
* fix: default parameters in key handler
* cleanup holdtap
* add error handling to modules process_key
* fix: key released too late
Tapped keys didn't release on a "key released" event, but waited for a
timeout. Resulted in, for example, modifiers applying to keys after the
modifier was released.
* fix lint/formatting
* fix tap_time reference in modtap + minimal documentation
* fix lint
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.