diff --git a/kmk/firmware.py b/kmk/firmware.py index e73ba22..a642936 100644 --- a/kmk/firmware.py +++ b/kmk/firmware.py @@ -63,6 +63,15 @@ class Firmware: self._hid_helper_inst.create_report(self._state.keys_pressed).send() self._state.resolve_hid() + def _send_key(self, key): + if not getattr(key, 'no_press', None): + self._state.force_keycode_down(key) + self._send_hid() + + if not getattr(key, 'no_release', None): + self._state.force_keycode_up(key) + self._send_hid() + def go(self): assert self.keymap, 'must define a keymap with at least one row' assert self.row_pins, 'no GPIO pins defined for matrix rows' @@ -95,15 +104,13 @@ class Firmware: if self._state.hid_pending: self._send_hid() + for key in self._state.pending_keys: + self._send_key(key) + self._state.pending_key_handled() + if self._state.macro_pending: for key in self._state.macro_pending(self): - if not getattr(key, 'no_press', None): - self._state.force_keycode_down(key) - self._send_hid() - - if not getattr(key, 'no_release', None): - self._state.force_keycode_up(key) - self._send_hid() + self._send_key(key) self._state.resolve_macro() diff --git a/kmk/internal_state.py b/kmk/internal_state.py index 17dbe42..c2309cc 100644 --- a/kmk/internal_state.py +++ b/kmk/internal_state.py @@ -9,7 +9,7 @@ GESC_TRIGGERS = { class InternalState: keys_pressed = set() - pending_keys = set() + pending_keys = [] macro_pending = None leader_pending = None leader_last_len = 0 @@ -176,10 +176,10 @@ class InternalState: # Sets the timer start and acts like MO otherwise self.start_time['lm'] = ticks_ms() self.keys_pressed.add(changed_key.kc) - return self._layer_mo(changed_key, is_pressed) + else: + self.keys_pressed.discard(changed_key.kc) + self.start_time['lm'] = None - self.keys_pressed.discard(changed_key.kc) - self.start_time['lm'] = None return self._layer_mo(changed_key, is_pressed) def _layer_lt(self, changed_key, is_pressed): @@ -187,17 +187,18 @@ class InternalState: if is_pressed: # Sets the timer start and acts like MO otherwise self.start_time['lt'] = ticks_ms() - return self._layer_mo(changed_key, is_pressed) + self._layer_mo(changed_key, is_pressed) + else: + # On keyup, check timer, and press key if needed. + if self.start_time['lt'] and ( + ticks_diff(ticks_ms(), self.start_time['lt']) < self.config.tap_time + ): + self.hid_pending = True + self.pending_keys.append(changed_key.kc) - # On keyup, check timer, and press key if needed. - if self.start_time['lt'] and ( - ticks_diff(ticks_ms(), self.start_time['lt']) < self.config.tap_time - ): - self.hid_pending = True - self.pending_keys.add(changed_key.kc) - - self.start_time['lt'] = None - return self._layer_mo(changed_key, is_pressed) + self._layer_mo(changed_key, is_pressed) + self.start_time['lt'] = None + return self def _layer_tg(self, changed_key, is_pressed): """Toggles the layer (enables it if not active, and vise versa)"""