2021-08-13 16:00:57 -04:00
|
|
|
from typing import Any, Optional
|
|
|
|
|
2020-10-21 12:19:42 -07:00
|
|
|
from kmk.key_validators import mod_tap_validator
|
2021-08-13 16:00:57 -04:00
|
|
|
from kmk.keys import Key, make_argumented_key
|
|
|
|
from kmk.kmk_keyboard import KMKKeyboard
|
2020-10-21 12:19:42 -07:00
|
|
|
from kmk.kmktime import accurate_ticks, accurate_ticks_diff
|
|
|
|
from kmk.modules import Module
|
|
|
|
|
|
|
|
|
|
|
|
class ModTap(Module):
|
2021-08-13 16:00:57 -04:00
|
|
|
def __init__(self) -> None:
|
|
|
|
self._mod_tap_timer: Optional[int] = None
|
2020-10-21 12:19:42 -07:00
|
|
|
make_argumented_key(
|
|
|
|
validator=mod_tap_validator,
|
|
|
|
names=('MT',),
|
|
|
|
on_press=self.mt_pressed,
|
|
|
|
on_release=self.mt_released,
|
|
|
|
)
|
|
|
|
|
2021-08-13 16:00:57 -04:00
|
|
|
def during_bootup(self, keyboard: KMKKeyboard) -> None:
|
2020-10-21 12:19:42 -07:00
|
|
|
return
|
|
|
|
|
2021-08-13 16:00:57 -04:00
|
|
|
def before_matrix_scan(self, keyboard: KMKKeyboard) -> None:
|
2020-10-21 12:19:42 -07:00
|
|
|
return
|
|
|
|
|
2021-08-13 16:00:57 -04:00
|
|
|
def after_matrix_scan(self, keyboard: KMKKeyboard) -> None:
|
2020-10-21 12:19:42 -07:00
|
|
|
return
|
|
|
|
|
2021-08-13 16:00:57 -04:00
|
|
|
def before_hid_send(self, keyboard: KMKKeyboard) -> None:
|
2020-10-21 12:19:42 -07:00
|
|
|
return
|
|
|
|
|
2021-08-13 16:00:57 -04:00
|
|
|
def after_hid_send(self, keyboard: KMKKeyboard) -> None:
|
2020-10-21 12:19:42 -07:00
|
|
|
return
|
|
|
|
|
2021-08-13 16:00:57 -04:00
|
|
|
def on_powersave_enable(self, keyboard: KMKKeyboard) -> None:
|
2020-10-21 12:19:42 -07:00
|
|
|
return
|
|
|
|
|
2021-08-13 16:00:57 -04:00
|
|
|
def on_powersave_disable(self, keyboard: KMKKeyboard) -> None:
|
2020-10-21 12:19:42 -07:00
|
|
|
return
|
|
|
|
|
2021-08-16 00:18:35 +00:00
|
|
|
def mt_pressed(
|
2021-08-16 10:33:05 +00:00
|
|
|
self,
|
|
|
|
key: Key,
|
|
|
|
keyboard: KMKKeyboard,
|
|
|
|
*args: Any,
|
|
|
|
**kwargs: Any,
|
2021-08-16 00:18:35 +00:00
|
|
|
) -> KMKKeyboard:
|
2020-10-21 12:19:42 -07:00
|
|
|
'''Sets the timer start and acts like a modifier otherwise'''
|
|
|
|
keyboard.keys_pressed.add(key.meta.mods)
|
|
|
|
|
|
|
|
self._mod_tap_timer = accurate_ticks()
|
|
|
|
return keyboard
|
|
|
|
|
2021-08-16 00:18:35 +00:00
|
|
|
def mt_released(
|
2021-08-16 10:33:05 +00:00
|
|
|
self,
|
|
|
|
key: Key,
|
|
|
|
keyboard: KMKKeyboard,
|
|
|
|
*args: Any,
|
|
|
|
**kwargs: Any,
|
2021-08-16 00:18:35 +00:00
|
|
|
) -> KMKKeyboard:
|
2021-06-20 13:59:59 -07:00
|
|
|
'''On keyup, check timer, and press key if needed.'''
|
2020-10-21 12:19:42 -07:00
|
|
|
keyboard.keys_pressed.discard(key.meta.mods)
|
|
|
|
if self._mod_tap_timer and (
|
|
|
|
accurate_ticks_diff(
|
|
|
|
accurate_ticks(), self._mod_tap_timer, keyboard.tap_time
|
|
|
|
)
|
|
|
|
):
|
|
|
|
keyboard.hid_pending = True
|
|
|
|
keyboard.tap_key(key.meta.kc)
|
|
|
|
|
|
|
|
self._mod_tap_timer = None
|
|
|
|
return keyboard
|