From 1bde64392e859736514b55bc46f9aaed3ed84324 Mon Sep 17 00:00:00 2001 From: Kyle Brown Date: Fri, 13 Nov 2020 02:01:26 -0800 Subject: [PATCH] state to keyboard and hid switching --- kmk/handlers/sequences.py | 44 +++++++------- kmk/handlers/stock.py | 119 +++++++++++++++++++++----------------- kmk/keys.py | 1 + kmk/kmk_keyboard.py | 4 +- 4 files changed, 91 insertions(+), 77 deletions(-) diff --git a/kmk/handlers/sequences.py b/kmk/handlers/sequences.py index d7f61ac..5ac5028 100644 --- a/kmk/handlers/sequences.py +++ b/kmk/handlers/sequences.py @@ -13,21 +13,21 @@ def get_wide_ordinal(char): return 0x10000 + (ord(char[0]) - 0xD800) * 0x400 + (ord(char[1]) - 0xDC00) -def sequence_press_handler(key, state, KC, *args, **kwargs): - oldkeys_pressed = state.keys_pressed - state.keys_pressed = set() +def sequence_press_handler(key, keyboard, KC, *args, **kwargs): + oldkeys_pressed = keyboard.keys_pressed + keyboard.keys_pressed = set() for ikey in key.meta.seq: if not getattr(ikey, 'no_press', None): - state.process_key(ikey, True) - state._send_hid() + keyboard.process_key(ikey, True) + keyboard._send_hid() if not getattr(ikey, 'no_release', None): - state.process_key(ikey, False) - state._send_hid() + keyboard.process_key(ikey, False) + keyboard._send_hid() - state.keys_pressed = oldkeys_pressed + keyboard.keys_pressed = oldkeys_pressed - return state + return keyboard def simple_key_sequence(seq): @@ -110,38 +110,38 @@ def unicode_codepoint_sequence(codepoints): kc_macros = [simple_key_sequence(kc_seq) for kc_seq in kc_seqs] - def _unicode_sequence(key, state, *args, **kwargs): - if state.unicode_mode == UnicodeMode.IBUS: - state.process_key( - simple_key_sequence(_ibus_unicode_sequence(kc_macros, state)), True + def _unicode_sequence(key, keyboard, *args, **kwargs): + if keyboard.unicode_mode == UnicodeMode.IBUS: + keyboard.process_key( + simple_key_sequence(_ibus_unicode_sequence(kc_macros, keyboard)), True ) - elif state.unicode_mode == UnicodeMode.RALT: - state.process_key( - simple_key_sequence(_ralt_unicode_sequence(kc_macros, state)), True + elif keyboard.unicode_mode == UnicodeMode.RALT: + keyboard.process_key( + simple_key_sequence(_ralt_unicode_sequence(kc_macros, keyboard)), True ) - elif state.unicode_mode == UnicodeMode.WINC: - state.process_key( - simple_key_sequence(_winc_unicode_sequence(kc_macros, state)), True + elif keyboard.unicode_mode == UnicodeMode.WINC: + keyboard.process_key( + simple_key_sequence(_winc_unicode_sequence(kc_macros, keyboard)), True ) return make_key(on_press=_unicode_sequence) -def _ralt_unicode_sequence(kc_macros, state): +def _ralt_unicode_sequence(kc_macros, keyboard): for kc_macro in kc_macros: yield RALT_DOWN_NO_RELEASE yield kc_macro yield RALT_UP_NO_PRESS -def _ibus_unicode_sequence(kc_macros, state): +def _ibus_unicode_sequence(kc_macros, keyboard): for kc_macro in kc_macros: yield IBUS_KEY_COMBO yield kc_macro yield ENTER_KEY -def _winc_unicode_sequence(kc_macros, state): +def _winc_unicode_sequence(kc_macros, keyboard): ''' Send unicode sequence using WinCompose: diff --git a/kmk/handlers/stock.py b/kmk/handlers/stock.py index c85b063..73069b8 100644 --- a/kmk/handlers/stock.py +++ b/kmk/handlers/stock.py @@ -1,30 +1,32 @@ from kmk.kmktime import sleep_ms -def passthrough(key, state, *args, **kwargs): - return state +def passthrough(key, keyboard, *args, **kwargs): + return keyboard -def default_pressed(key, state, KC, coord_int=None, coord_raw=None, *args, **kwargs): - state.hid_pending = True +def default_pressed(key, keyboard, KC, coord_int=None, coord_raw=None, *args, **kwargs): + keyboard.hid_pending = True if coord_int is not None: - state._coordkeys_pressed[coord_int] = key + keyboard._coordkeys_pressed[coord_int] = key - state.keys_pressed.add(key) + keyboard.keys_pressed.add(key) - return state + return keyboard -def default_released(key, state, KC, coord_int=None, coord_raw=None, *args, **kwargs): - state.hid_pending = True - state.keys_pressed.discard(key) +def default_released( + key, keyboard, KC, coord_int=None, coord_raw=None, *args, **kwargs # NOQA +): + keyboard.hid_pending = True + keyboard.keys_pressed.discard(key) if coord_int is not None: - state.keys_pressed.discard(state._coordkeys_pressed.get(coord_int, None)) - state._coordkeys_pressed[coord_int] = None + keyboard.keys_pressed.discard(keyboard._coordkeys_pressed.get(coord_int, None)) + keyboard._coordkeys_pressed[coord_int] = None - return state + return keyboard def reset(*args, **kwargs): @@ -40,79 +42,88 @@ def bootloader(*args, **kwargs): microcontroller.reset() -def debug_pressed(key, state, KC, *args, **kwargs): - if state.debug_enabled: +def debug_pressed(key, keyboard, KC, *args, **kwargs): + if keyboard.debug_enabled: print('DebugDisable()') else: print('DebugEnable()') - state.debug_enabled = not state.debug_enabled + keyboard.debug_enabled = not keyboard.debug_enabled - return state + return keyboard -def gesc_pressed(key, state, KC, *args, **kwargs): +def gesc_pressed(key, keyboard, KC, *args, **kwargs): GESC_TRIGGERS = {KC.LSHIFT, KC.RSHIFT, KC.LGUI, KC.RGUI} - if GESC_TRIGGERS.intersection(state.keys_pressed): + if GESC_TRIGGERS.intersection(keyboard.keys_pressed): # First, release GUI if already pressed - state._send_hid() + keyboard._send_hid() # if Shift is held, KC_GRAVE will become KC_TILDE on OS level - state.keys_pressed.add(KC.GRAVE) - state.hid_pending = True - return state + keyboard.keys_pressed.add(KC.GRAVE) + keyboard.hid_pending = True + return keyboard # else return KC_ESC - state.keys_pressed.add(KC.ESCAPE) - state.hid_pending = True + keyboard.keys_pressed.add(KC.ESCAPE) + keyboard.hid_pending = True - return state + return keyboard -def gesc_released(key, state, KC, *args, **kwargs): - state.keys_pressed.discard(KC.ESCAPE) - state.keys_pressed.discard(KC.GRAVE) - state.hid_pending = True - return state +def gesc_released(key, keyboard, KC, *args, **kwargs): + keyboard.keys_pressed.discard(KC.ESCAPE) + keyboard.keys_pressed.discard(KC.GRAVE) + keyboard.hid_pending = True + return keyboard -def bkdl_pressed(key, state, KC, *args, **kwargs): +def bkdl_pressed(key, keyboard, KC, *args, **kwargs): BKDL_TRIGGERS = {KC.LGUI, KC.RGUI} - if BKDL_TRIGGERS.intersection(state.keys_pressed): - state._send_hid() - state.keys_pressed.add(KC.DEL) - state.hid_pending = True - return state + if BKDL_TRIGGERS.intersection(keyboard.keys_pressed): + keyboard._send_hid() + keyboard.keys_pressed.add(KC.DEL) + keyboard.hid_pending = True + return keyboard # else return KC_ESC - state.keys_pressed.add(KC.BKSP) - state.hid_pending = True + keyboard.keys_pressed.add(KC.BKSP) + keyboard.hid_pending = True - return state + return keyboard -def bkdl_released(key, state, KC, *args, **kwargs): - state.keys_pressed.discard(KC.BKSP) - state.keys_pressed.discard(KC.DEL) - state.hid_pending = True - return state +def bkdl_released(key, keyboard, KC, *args, **kwargs): + keyboard.keys_pressed.discard(KC.BKSP) + keyboard.keys_pressed.discard(KC.DEL) + keyboard.hid_pending = True + return keyboard -def sleep_pressed(key, state, KC, *args, **kwargs): +def sleep_pressed(key, keyboard, KC, *args, **kwargs): sleep_ms(key.meta.ms) - return state + return keyboard -def uc_mode_pressed(key, state, *args, **kwargs): - state.unicode_mode = key.meta.mode +def uc_mode_pressed(key, keyboard, *args, **kwargs): + keyboard.unicode_mode = key.meta.mode - return state + return keyboard -def td_pressed(key, state, *args, **kwargs): - return state._process_tap_dance(key, True) +def td_pressed(key, keyboard, *args, **kwargs): + return keyboard._process_tap_dance(key, True) -def td_released(key, state, *args, **kwargs): - return state._process_tap_dance(key, False) +def td_released(key, keyboard, *args, **kwargs): + return keyboard._process_tap_dance(key, False) + + +def hid_switch(key, keyboard, *args, **kwargs): + keyboard.hid_type, keyboard.secondary_hid_type = ( + keyboard.secondary_hid_type, + keyboard.hid_type, + ) + keyboard._init_hid() + return keyboard diff --git a/kmk/keys.py b/kmk/keys.py index 0e32283..068c854 100644 --- a/kmk/keys.py +++ b/kmk/keys.py @@ -649,3 +649,4 @@ make_argumented_key( on_press=handlers.td_pressed, on_release=handlers.td_released, ) +make_key(names=('HID_SWITCH', 'HID'), on_press=handlers.hid_switch) diff --git a/kmk/kmk_keyboard.py b/kmk/kmk_keyboard.py index 915b2aa..9fe08da 100644 --- a/kmk/kmk_keyboard.py +++ b/kmk/kmk_keyboard.py @@ -39,6 +39,7 @@ class KMKKeyboard: keys_pressed = set() _coordkeys_pressed = {} hid_type = HIDModes.USB + secondary_hid_type = None _hid_helper = None hid_pending = False state_layer_key = None @@ -429,8 +430,9 @@ class KMKKeyboard: if self.debug_enabled: print('Failed to run post hid function in extension: ', err, ext) - def go(self, hid_type=HIDModes.USB, **kwargs): + def go(self, hid_type=HIDModes.USB, secondary_hid_type=None, **kwargs): self.hid_type = hid_type + self.secondary_hid_type = secondary_hid_type self._init_sanity_check() self._init_coord_mapping()