Skip to content

Commit 3e5c68c

Browse files
committed
fix: small slot sharing issue
1 parent 97d258c commit 3e5c68c

1 file changed

Lines changed: 41 additions & 4 deletions

File tree

cursed_controls/runtime.py

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -607,11 +607,48 @@ def run(self) -> None:
607607
while not self._stop_event.is_set():
608608
self._drain_bind_queue() # fast: O(1) queue check when empty
609609
if self.drain_ready(timeout=0.001): # 1 ms — reduced from 10 ms
610-
sent_slots: set[int] = set()
610+
# Merge all devices on the same slot: OR buttons, MAX axes.
611+
slot_states: dict[int, XboxControllerState] = {}
611612
for bd in self.bound_by_fd.values():
612-
if bd.slot not in sent_slots:
613-
self.sink.send(bd.state, slot=bd.slot)
614-
sent_slots.add(bd.slot)
613+
s = bd.state
614+
if bd.slot not in slot_states:
615+
slot_states[bd.slot] = XboxControllerState(
616+
a=s.a, b=s.b, x=s.x, y=s.y,
617+
lb=s.lb, rb=s.rb, l3=s.l3, r3=s.r3,
618+
start=s.start, options=s.options, xbox=s.xbox,
619+
dpad_up=s.dpad_up, dpad_down=s.dpad_down,
620+
dpad_left=s.dpad_left, dpad_right=s.dpad_right,
621+
left_trigger=s.left_trigger, right_trigger=s.right_trigger,
622+
left_joystick_x=s.left_joystick_x,
623+
left_joystick_y=s.left_joystick_y,
624+
right_joystick_x=s.right_joystick_x,
625+
right_joystick_y=s.right_joystick_y,
626+
)
627+
else:
628+
m = slot_states[bd.slot]
629+
m.a = m.a or s.a
630+
m.b = m.b or s.b
631+
m.x = m.x or s.x
632+
m.y = m.y or s.y
633+
m.lb = m.lb or s.lb
634+
m.rb = m.rb or s.rb
635+
m.l3 = m.l3 or s.l3
636+
m.r3 = m.r3 or s.r3
637+
m.start = m.start or s.start
638+
m.options = m.options or s.options
639+
m.xbox = m.xbox or s.xbox
640+
m.dpad_up = m.dpad_up or s.dpad_up
641+
m.dpad_down = m.dpad_down or s.dpad_down
642+
m.dpad_left = m.dpad_left or s.dpad_left
643+
m.dpad_right = m.dpad_right or s.dpad_right
644+
m.left_trigger = max(m.left_trigger, s.left_trigger)
645+
m.right_trigger = max(m.right_trigger, s.right_trigger)
646+
m.left_joystick_x = max(m.left_joystick_x, s.left_joystick_x, key=abs)
647+
m.left_joystick_y = max(m.left_joystick_y, s.left_joystick_y, key=abs)
648+
m.right_joystick_x = max(m.right_joystick_x, s.right_joystick_x, key=abs)
649+
m.right_joystick_y = max(m.right_joystick_y, s.right_joystick_y, key=abs)
650+
for slot, merged in slot_states.items():
651+
self.sink.send(merged, slot=slot)
615652
self._dispatch_rumble()
616653
finally:
617654
self._stop_all_rumble()

0 commit comments

Comments
 (0)