@@ -11,7 +11,7 @@ use crate::{
1111 DBusInterfaceManager ,
1212 } ,
1313 input:: {
14- capability:: { Capability , Gamepad , GamepadButton } ,
14+ capability:: { Capability , Gamepad , GamepadAxis , GamepadButton , GamepadTrigger } ,
1515 composite_device:: client:: CompositeDeviceClient ,
1616 event:: {
1717 dbus:: { Action , DBusEvent } ,
@@ -379,6 +379,54 @@ impl TargetInputDevice for DBusDevice {
379379 Ok ( ( ) )
380380 }
381381
382+ fn clear_state ( & mut self ) {
383+ let mut release_events = vec ! [ ] ;
384+
385+ // Release any "pressed" buttons
386+ for ( capability, value) in self . state . buttons . iter ( ) {
387+ if !* value {
388+ continue ;
389+ }
390+ let event = NativeEvent :: new ( capability. clone ( ) , InputValue :: Bool ( false ) ) ;
391+ release_events. push ( event) ;
392+ }
393+
394+ // Release any axis directions
395+ if self . state . pressed_up
396+ || self . state . pressed_down
397+ || self . state . pressed_left
398+ || self . state . pressed_right
399+ {
400+ let capability = Capability :: Gamepad ( Gamepad :: Axis ( GamepadAxis :: LeftStick ) ) ;
401+ let value = InputValue :: Vector2 {
402+ x : Some ( 0.0 ) ,
403+ y : Some ( 0.0 ) ,
404+ } ;
405+ let event = NativeEvent :: new ( capability, value) ;
406+ release_events. push ( event) ;
407+ }
408+
409+ // Release any triggers
410+ if self . state . pressed_l2 {
411+ let capability = Capability :: Gamepad ( Gamepad :: Trigger ( GamepadTrigger :: LeftTrigger ) ) ;
412+ let value = InputValue :: Float ( 0.0 ) ;
413+ let event = NativeEvent :: new ( capability, value) ;
414+ release_events. push ( event) ;
415+ }
416+ if self . state . pressed_r2 {
417+ let capability = Capability :: Gamepad ( Gamepad :: Trigger ( GamepadTrigger :: RightTrigger ) ) ;
418+ let value = InputValue :: Float ( 0.0 ) ;
419+ let event = NativeEvent :: new ( capability, value) ;
420+ release_events. push ( event) ;
421+ }
422+
423+ for event in release_events {
424+ if let Err ( e) = self . write_event ( event) {
425+ log:: trace!( "Failed to write release event: {e}" ) ;
426+ }
427+ }
428+ }
429+
382430 fn get_capabilities ( & self ) -> Result < Vec < crate :: input:: capability:: Capability > , InputError > {
383431 let capabilities = vec ! [
384432 Capability :: DBus ( Action :: Guide ) ,
0 commit comments