from kmk.keys import make_argumented_key from kmk.modules import Module class StickyModMeta: def __init__(self, kc, mod): self.kc = kc self.mod = mod class StickyMod(Module): def __init__(self): self._active = False self._active_key = None make_argumented_key( names=('SM',), validator=StickyModMeta, on_press=self.sm_pressed, on_release=self.sm_released, ) def during_bootup(self, keyboard): return def before_matrix_scan(self, keyboard): return def process_key(self, keyboard, key, is_pressed, int_coord): # release previous key if any other key is pressed if self._active and self._active_key is not None: self.release_key(keyboard, self._active_key) return key def before_hid_send(self, keyboard): return def after_hid_send(self, keyboard): return def on_powersave_enable(self, keyboard): return def on_powersave_disable(self, keyboard): return def after_matrix_scan(self, keyboard): return def release_key(self, keyboard, key): keyboard.process_key(key.meta.mod, False) self._active = False self._active_key = None def sm_pressed(self, key, keyboard, *args, **kwargs): keyboard.process_key(key.meta.mod, True) keyboard.process_key(key.meta.kc, True) self._active_key = key def sm_released(self, key, keyboard, *args, **kwargs): keyboard.process_key(key.meta.kc, False) self._active_key = key self._active = True