def grab(keyboard: InputDevice) -> None: """ Grab keyboard to become a sole recipient of keyboard events. In case of program exit, keyboard will be ungrabbed. """ debug(f'grabbing keyboard {keyboard}') atexit.register(ungrab, keyboard) keyboard.grab()
def handle(self, ui: UInput, e: InputEvent, *args) -> None: debug('-- handling mod key action --') if e.value == KeyEvent.key_down: for m in self.modifiers: host.write_code(ui, m, e.value) if self.code: host.write_code(ui, self.code, e.value) else: if self.code: host.write_code(ui, self.code, e.value) for m in self.modifiers: host.write_code(ui, m, e.value)
def release_layer_keys(ui: UInput, layer_index: int, config: Config) -> None: """ Release weak keys from specified layer. """ debug(f'releasing layer [{layer_index}] keys') for pos, is_pressed in enumerate(mapper.layers_keys_pressed[layer_index]): if is_pressed: keycode = config.keymaps[layer_index][pos] if keycode != key.KC_TRANSPARENT: debug(f'key {keycode} released') write_release(ui, keycode) mapper.layers_keys_pressed[layer_index][pos] = False
def release_weak_keys(ui: UInput, config: Config) -> None: """ Release weak keys from all layers. Key is weak if it will cause key hold repeat without releasing. """ for layer in range(len(config.keymaps)): for pos, is_pressed in enumerate(mapper.layers_keys_pressed[layer]): if is_pressed: keycode = config.keymaps[layer][pos] if keycode != key.KC_TRANSPARENT and key.is_weak(keycode): debug(f'key {keycode} released') write_release(ui, keycode) mapper.layers_keys_pressed[layer][pos] = False
def handle(self, _, e: InputEvent, *args) -> None: debug('-- handling kbmap toggle action --') if e.value == KeyEvent.key_down: debug( f'now kbmap is {"enabled" if mapper.kbmap_enabled else "disabled"}' ) mapper.kbmap_enabled = not mapper.kbmap_enabled debug( f'toggle kbmap {"enabled" if mapper.kbmap_enabled else "disabled"}' ) else: debug('key release, skipping')
def handle(self, ui: UInput, e: InputEvent, config: Config, *args) -> None: debug('-- handling layer toggle action --') if e.value == KeyEvent.key_down: if mapper.active_layers[self.layer_index]: debug(f'disabling layer [{self.layer_index}]') mapper.disable_layer(ui, self.layer_index, config) else: debug(f'enabling layer [{self.layer_index}]') mapper.enable_layer(self.layer_index, self, config)
def handle(self, ui: UInput, e: InputEvent, config: Config, pos: int, *args) -> None: debug('-- handling mod tap action --') if e.value == KeyEvent.key_down: mapper.active_tap_actions[pos] = self debug('MT is pressed, pressing modifiers') host.write_press(ui, *self.modifiers) else: mapper.active_tap_actions.pop(pos) host.release_weak_keys(ui, config) debug('MT is released, releasing modifiers') host.write_release(ui, *self.modifiers) since_last_press = (e.timestamp() - mapper.last_press_timestamps[pos]) * 1000 debug(f'since last press: {since_last_press}') debug(f'action is used: {self.used}') if not self.used and since_last_press <= config.tapping_term: debug('writing key press') host.write_tap(ui, self.code) self.used = False
def ungrab(keyboard: InputDevice) -> None: """ Ungrab the grabbed keyboard. """ debug(f'ungrabbing keyboard {keyboard}') keyboard.ungrab()
def handle(self, ui: UInput, e: InputEvent, config: Config, pos: int, *args) -> None: debug('-- handling layer tap action --') if e.value == KeyEvent.key_down: mapper.active_tap_actions[pos] = self debug(f'LT is pressed, enabling layer [{self.layer_index}]') mapper.enable_layer(self.layer_index, self, config) else: mapper.active_tap_actions.pop(pos) host.release_weak_keys(ui, config) debug(f'LT is released, disabling layer [{self.layer_index}]') mapper.disable_layer(ui, self.layer_index, config) since_last_press = (e.timestamp() - mapper.last_press_timestamps[pos]) * 1000 debug(f'since last press: {since_last_press}') debug(f'action is used: {self.used}') if not self.used and since_last_press <= config.tapping_term: debug('writing key press') host.write_tap(ui, self.code) self.used = False
def handle(self, ui: UInput, e: InputEvent, config: Config, *args): debug('-- handling layer on action --') if e.value == KeyEvent.key_down: mapper.enable_layer(self.layer_index, self, config) else: mapper.disable_layer(ui, self.layer_index, config)
def handle_layer_key(self, ui: UInput, code: int, e: InputEvent, *args) -> None: debug('-- handling LM layer key --') ModKeyAction(code, *self.modifiers).handle(ui, e)