@@ -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