diff --git a/kmk/common/internal_keycodes.py b/kmk/common/internal_keycodes.py index ec34ebc..f197e79 100644 --- a/kmk/common/internal_keycodes.py +++ b/kmk/common/internal_keycodes.py @@ -30,6 +30,8 @@ def process_internal_key_event(state, action_type, changed_key, logger=None): return grave_escape(state, action_type, logger=logger) elif changed_key.code == RawKeycodes.KC_UC_MODE: return unicode_mode(state, action_type, changed_key, logger=logger) + elif changed_key.code == RawKeycodes.KC_MACRO: + return macro(state, action_type, changed_key, logger=logger) else: return state @@ -111,3 +113,15 @@ def unicode_mode(state, action_type, changed_key, logger): state.unicode_mode = changed_key.mode return state + + +def macro(state, action_type, changed_key, logger): + if action_type == KEY_UP_EVENT: + if changed_key.keyup: + state.macro_pending = changed_key.keyup + return state + + elif action_type == KEY_DOWN_EVENT: + if changed_key.keydown: + state.macro_pending = changed_key.keydown + return state diff --git a/kmk/common/internal_state.py b/kmk/common/internal_state.py index 47972de..cc6a946 100644 --- a/kmk/common/internal_state.py +++ b/kmk/common/internal_state.py @@ -8,7 +8,6 @@ from kmk.common.event_defs import (HID_REPORT_EVENT, INIT_FIRMWARE_EVENT, MACRO_COMPLETE_EVENT, NEW_MATRIX_EVENT) from kmk.common.internal_keycodes import process_internal_key_event from kmk.common.keycodes import FIRST_KMK_INTERNAL_KEYCODE, Keycodes -from kmk.common.macros import KMKMacro class ReduxStore: @@ -147,22 +146,12 @@ def kmk_reducer(state=None, action=None, logger=None): for changed_key in released: if not changed_key: continue - - elif isinstance(changed_key, KMKMacro): - if changed_key.keyup: - state.macro_pending = changed_key.keyup - elif changed_key.code >= FIRST_KMK_INTERNAL_KEYCODE: state = process_internal_key_event(state, KEY_UP_EVENT, changed_key, logger=logger) for changed_key in pressed: if not changed_key: continue - - elif isinstance(changed_key, KMKMacro): - if changed_key.keydown: - state.macro_pending = changed_key.keydown - elif changed_key.code >= FIRST_KMK_INTERNAL_KEYCODE: state = process_internal_key_event( state, diff --git a/kmk/common/keycodes.py b/kmk/common/keycodes.py index 0a83005..b6a653a 100644 --- a/kmk/common/keycodes.py +++ b/kmk/common/keycodes.py @@ -40,7 +40,8 @@ class RawKeycodes: KC_UC_MODE = 1109 - KC_MACRO_SLEEP_MS = 1110 + KC_MACRO = 1110 + KC_MACRO_SLEEP_MS = 1111 # These shouldn't have all the fancy shenanigans Keycode allows @@ -99,6 +100,23 @@ class ConsumerKeycode(Keycode): pass +class Macro: + ''' + A special "key" which triggers a macro. + ''' + code = RawKeycodes.KC_MACRO + + def __init__(self, keydown=None, keyup=None): + self.keydown = keydown + self.keyup = keyup + + def on_keydown(self): + return self.keydown() if self.keydown else None + + def on_keyup(self): + return self.keyup() if self.keyup else None + + class KeycodeCategory(type): @classmethod def to_dict(cls): diff --git a/kmk/common/macros/__init__.py b/kmk/common/macros/__init__.py index a6cc1d9..e69de29 100644 --- a/kmk/common/macros/__init__.py +++ b/kmk/common/macros/__init__.py @@ -1,10 +0,0 @@ -class KMKMacro: - def __init__(self, keydown=None, keyup=None): - self.keydown = keydown - self.keyup = keyup - - def on_keydown(self): - return self.keydown() if self.keydown else None - - def on_keyup(self): - return self.keyup() if self.keyup else None diff --git a/kmk/common/macros/simple.py b/kmk/common/macros/simple.py index 128779b..29f6c14 100644 --- a/kmk/common/macros/simple.py +++ b/kmk/common/macros/simple.py @@ -2,8 +2,7 @@ import string from kmk.common.event_defs import (hid_report_event, keycode_down_event, keycode_up_event) -from kmk.common.keycodes import Keycodes, RawKeycodes, char_lookup -from kmk.common.macros import KMKMacro +from kmk.common.keycodes import Keycodes, Macro, RawKeycodes, char_lookup from kmk.common.util import sleep_ms @@ -22,7 +21,7 @@ def simple_key_sequence(seq): yield keycode_up_event(key) yield hid_report_event() - return KMKMacro(keydown=_simple_key_sequence) + return Macro(keydown=_simple_key_sequence) def send_string(message): diff --git a/kmk/common/macros/unicode.py b/kmk/common/macros/unicode.py index ad2cd77..e9d04d5 100644 --- a/kmk/common/macros/unicode.py +++ b/kmk/common/macros/unicode.py @@ -1,8 +1,7 @@ from kmk.common.consts import UnicodeModes from kmk.common.event_defs import (hid_report_event, keycode_down_event, keycode_up_event) -from kmk.common.keycodes import Common, Modifiers -from kmk.common.macros import KMKMacro +from kmk.common.keycodes import Common, Macro, Modifiers from kmk.common.macros.simple import simple_key_sequence IBUS_KEY_COMBO = Modifiers.KC_LCTRL(Modifiers.KC_LSHIFT(Common.KC_U)) @@ -34,7 +33,7 @@ def unicode_sequence(codepoints): elif state.unicode_mode == UnicodeModes.WINC: yield from _winc_unicode_sequence(codepoints, state) - return KMKMacro(keydown=_unicode_sequence) + return Macro(keydown=_unicode_sequence) def _ralt_unicode_sequence(codepoints, state): diff --git a/kmk/micropython/pyb_hid.py b/kmk/micropython/pyb_hid.py index 315fac4..1dfa807 100644 --- a/kmk/micropython/pyb_hid.py +++ b/kmk/micropython/pyb_hid.py @@ -6,7 +6,6 @@ from kmk.common.consts import HID_REPORT_STRUCTURE, HIDReportTypes from kmk.common.event_defs import HID_REPORT_EVENT from kmk.common.keycodes import (FIRST_KMK_INTERNAL_KEYCODE, ConsumerKeycode, ModifierKeycode) -from kmk.common.macros import KMKMacro def generate_pyb_hid_descriptor(): @@ -72,7 +71,7 @@ class HIDHelper: self.add_key(consumer_key) else: for key in state.keys_pressed: - if isinstance(key, KMKMacro) or key.code >= FIRST_KMK_INTERNAL_KEYCODE: + if key.code >= FIRST_KMK_INTERNAL_KEYCODE: continue if isinstance(key, ModifierKeycode):