fix combo buffer replay /w layer-switch
This commit is contained in:
@@ -85,11 +85,11 @@ class Combos(Module):
|
||||
|
||||
def process_key(self, keyboard, key, is_pressed, int_coord):
|
||||
if is_pressed:
|
||||
return self.on_press(keyboard, key)
|
||||
return self.on_press(keyboard, key, int_coord)
|
||||
else:
|
||||
return self.on_release(keyboard, key)
|
||||
return self.on_release(keyboard, key, int_coord)
|
||||
|
||||
def on_press(self, keyboard, key):
|
||||
def on_press(self, keyboard, key, int_coord):
|
||||
# refill potential matches from timed-out matches
|
||||
if not self._matching:
|
||||
self._matching = list(self._reset)
|
||||
@@ -108,7 +108,7 @@ class Combos(Module):
|
||||
|
||||
if self._matching:
|
||||
# At least one combo matches current key: append key to buffer.
|
||||
self._key_buffer.append((key, True))
|
||||
self._key_buffer.append((int_coord, key, True))
|
||||
key = None
|
||||
|
||||
# Start or reset individual combo timeouts.
|
||||
@@ -125,10 +125,11 @@ class Combos(Module):
|
||||
# There's no matching combo: send and reset key buffer
|
||||
self.send_key_buffer(keyboard)
|
||||
self._key_buffer = []
|
||||
key = keyboard._find_key_in_map(int_coord)
|
||||
|
||||
return key
|
||||
|
||||
def on_release(self, keyboard, key):
|
||||
def on_release(self, keyboard, key, int_coord):
|
||||
for combo in self._active:
|
||||
if key in combo.match:
|
||||
# Deactivate combo if it matches current key.
|
||||
@@ -140,10 +141,10 @@ class Combos(Module):
|
||||
# Don't propagate key-release events for keys that have been buffered.
|
||||
# Append release events only if corresponding press is in buffer.
|
||||
else:
|
||||
pressed = self._key_buffer.count((key, True))
|
||||
released = self._key_buffer.count((key, False))
|
||||
pressed = self._key_buffer.count((int_coord, key, True))
|
||||
released = self._key_buffer.count((int_coord, key, False))
|
||||
if (pressed - released) > 0:
|
||||
self._key_buffer.append((key, False))
|
||||
self._key_buffer.append((int_coord, key, False))
|
||||
key = None
|
||||
|
||||
return key
|
||||
@@ -156,7 +157,7 @@ class Combos(Module):
|
||||
|
||||
if not combo._remaining:
|
||||
self.activate(keyboard, combo)
|
||||
if any([not pressed for (key, pressed) in self._key_buffer]):
|
||||
if any([not pressed for (int_coord, key, pressed) in self._key_buffer]):
|
||||
# At least one of the combo keys has already been released:
|
||||
# "tap" the combo result.
|
||||
keyboard._send_hid()
|
||||
@@ -171,8 +172,17 @@ class Combos(Module):
|
||||
self.reset_combo(keyboard, combo)
|
||||
|
||||
def send_key_buffer(self, keyboard):
|
||||
for (key, is_pressed) in self._key_buffer:
|
||||
keyboard.process_key(key, is_pressed)
|
||||
for (int_coord, key, is_pressed) in self._key_buffer:
|
||||
try:
|
||||
new_key = keyboard._coordkeys_pressed[int_coord]
|
||||
except KeyError:
|
||||
new_key = None
|
||||
if new_key is None:
|
||||
new_key = keyboard._find_key_in_map(int_coord)
|
||||
|
||||
keyboard._coordkeys_pressed[int_coord] = new_key
|
||||
|
||||
keyboard.process_key(new_key, is_pressed)
|
||||
keyboard._send_hid()
|
||||
|
||||
def activate(self, keyboard, combo):
|
||||
|
Reference in New Issue
Block a user