Skip to content

Commit c46f9cf

Browse files
committed
fix(Target DBus): implement clear state for dbus devices
1 parent e0a89cd commit c46f9cf

File tree

1 file changed

+49
-1
lines changed

1 file changed

+49
-1
lines changed

src/input/target/dbus.rs

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)