Skip to content

Commit f7fe555

Browse files
committed
fix: Avoid clearing macro 'up' events, leaving buttons stuck on
PR #623 introduced a bug where macros that were implemented on the target device would have their 'up' events cleared by mistake if the event arrived quickly. This would happen because the queed 'down' event would fire after the up events were unqueued if the up event arrived sooner than the down event fired. That would trigger the debounce and no later up event would fire, leaving the button stuck 'down'. Avoid the race by triggering the second event to land 1 frame after the first event. While at it, since the delayed ordering is no longer necessary, treat up and down events the same for enqueueing.
1 parent ad45e12 commit f7fe555

5 files changed

Lines changed: 36 additions & 61 deletions

File tree

src/input/composite_device/mod.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -728,14 +728,16 @@ impl CompositeDevice {
728728
// Check if the event needs to be translated based on the
729729
// capability map. Translated events will be re-enqueued, so this will
730730
// return early.
731-
log::trace!(
732-
"Translatable capabilities: {:?}",
733-
self.translatable_capabilities
734-
);
735-
if self.capability_map.is_some() && self.translatable_capabilities.contains(&cap) {
736-
log::trace!("Capability mapping found for event");
737-
self.translate_capability(&event).await?;
738-
return Ok(());
731+
if !self.translatable_capabilities.is_empty() {
732+
log::trace!(
733+
"Translatable capabilities: {:?}",
734+
self.translatable_capabilities
735+
);
736+
if self.capability_map.is_some() && self.translatable_capabilities.contains(&cap) {
737+
log::trace!("Capability mapping found for event");
738+
self.translate_capability(&event).await?;
739+
return Ok(());
740+
}
739741
}
740742
self.handle_event(event).await?;
741743

src/input/target/horipad_steam.rs

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -122,27 +122,21 @@ impl HoripadSteamDevice {
122122
event.get_value(),
123123
);
124124
// triggers at 128 exactly
125-
let trigv = if pressed { 0.5 } else { 0.0 };
126-
let trigr = NativeEvent::new(
125+
let trigger_value = if pressed { 0.5 } else { 0.0 };
126+
let trigger = NativeEvent::new(
127127
Capability::Gamepad(Gamepad::Trigger(GamepadTrigger::RightTrigger)),
128-
InputValue::Float(trigv),
128+
InputValue::Float(trigger_value),
129129
);
130130

131-
let (guide, trigr) = if pressed {
131+
let (guide, trigger) = {
132132
let guide = ScheduledNativeEvent::new(guide, Duration::from_millis(0));
133-
let trigr =
134-
ScheduledNativeEvent::new(trigr, Duration::from_millis(160));
135-
(guide, trigr)
136-
} else {
137-
let guide =
138-
ScheduledNativeEvent::new(guide, Duration::from_millis(240));
139-
let trigr =
140-
ScheduledNativeEvent::new(trigr, Duration::from_millis(160));
141-
(guide, trigr)
133+
let trigger =
134+
ScheduledNativeEvent::new(trigger, Duration::from_millis(8));
135+
(guide, trigger)
142136
};
143137

144138
self.queued_events.push(guide);
145-
self.queued_events.push(trigr);
139+
self.queued_events.push(trigger);
146140
}
147141
_ => (),
148142
},

src/input/target/steam_deck.rs

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -548,31 +548,24 @@ impl SteamDeckDevice {
548548
GamepadButton::RightStickTouch => self.state.r_stick_touch = event.pressed(),
549549
// TODO: Remove this once we add target device profiles
550550
GamepadButton::Screenshot => {
551-
let pressed = event.pressed();
552551
let guide = NativeEvent::new(
553552
Capability::Gamepad(Gamepad::Button(GamepadButton::Guide)),
554553
event.get_value(),
555554
);
556-
let bumpr = NativeEvent::new(
555+
let bumper = NativeEvent::new(
557556
Capability::Gamepad(Gamepad::Button(GamepadButton::RightBumper)),
558557
event.get_value(),
559558
);
560559

561-
let (guide, bumpr) = if pressed {
560+
let (guide, bumper) = {
562561
let guide = ScheduledNativeEvent::new(guide, Duration::from_millis(0));
563-
let bumpr =
564-
ScheduledNativeEvent::new(bumpr, Duration::from_millis(160));
565-
(guide, bumpr)
566-
} else {
567-
let guide =
568-
ScheduledNativeEvent::new(guide, Duration::from_millis(240));
569-
let bumpr =
570-
ScheduledNativeEvent::new(bumpr, Duration::from_millis(160));
571-
(guide, bumpr)
562+
let bumper =
563+
ScheduledNativeEvent::new(bumper, Duration::from_millis(1));
564+
(guide, bumper)
572565
};
573566

574567
self.queued_events.push(guide);
575-
self.queued_events.push(bumpr);
568+
self.queued_events.push(bumper);
576569
}
577570
_ => (),
578571
},

src/input/target/steam_deck_uhid.rs

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -152,31 +152,24 @@ impl SteamDeckUhidDevice {
152152
GamepadButton::RightStickTouch => self.state.r_stick_touch = event.pressed(),
153153
// TODO: Remove this once we add target device profiles
154154
GamepadButton::Screenshot => {
155-
let pressed = event.pressed();
156155
let guide = NativeEvent::new(
157156
Capability::Gamepad(Gamepad::Button(GamepadButton::Guide)),
158157
event.get_value(),
159158
);
160-
let bumpr = NativeEvent::new(
159+
let bumper = NativeEvent::new(
161160
Capability::Gamepad(Gamepad::Button(GamepadButton::RightBumper)),
162161
event.get_value(),
163162
);
164163

165-
let (guide, bumpr) = if pressed {
164+
let (guide, bumper) = {
166165
let guide = ScheduledNativeEvent::new(guide, Duration::from_millis(0));
167-
let bumpr =
168-
ScheduledNativeEvent::new(bumpr, Duration::from_millis(160));
169-
(guide, bumpr)
170-
} else {
171-
let guide =
172-
ScheduledNativeEvent::new(guide, Duration::from_millis(240));
173-
let bumpr =
174-
ScheduledNativeEvent::new(bumpr, Duration::from_millis(160));
175-
(guide, bumpr)
166+
let bumper =
167+
ScheduledNativeEvent::new(bumper, Duration::from_millis(8));
168+
(guide, bumper)
176169
};
177170

178171
self.queued_events.push(guide);
179-
self.queued_events.push(bumpr);
172+
self.queued_events.push(bumper);
180173
}
181174
_ => (),
182175
},

src/input/target/ulitmate_2.rs

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -303,33 +303,26 @@ impl TargetInputDevice for Ultimate2WirelessDevice {
303303
return Ok(());
304304
}
305305

306-
// Screenshot maps to Guide+RightTrigger combo (press: Guide@0ms RightTrigger@160ms,
307-
// release: RightTrigger@160ms Guide@240ms), same timing as horipad target.
308306
if event.as_capability() == Capability::Gamepad(Gamepad::Button(GamepadButton::Screenshot))
309307
{
310308
let pressed = event.pressed();
311309
let guide = NativeEvent::new(
312310
Capability::Gamepad(Gamepad::Button(GamepadButton::Guide)),
313311
event.get_value(),
314312
);
315-
let trigv = if pressed { 0.5 } else { 0.0 };
316-
let trigr = NativeEvent::new(
313+
let trigger_value = if pressed { 0.5 } else { 0.0 };
314+
let trigger = NativeEvent::new(
317315
Capability::Gamepad(Gamepad::Trigger(GamepadTrigger::RightTrigger)),
318-
InputValue::Float(trigv),
316+
InputValue::Float(trigger_value),
319317
);
320-
let (guide, trigr) = if pressed {
318+
let (guide, trigger) = {
321319
(
322320
ScheduledNativeEvent::new(guide, Duration::from_millis(0)),
323-
ScheduledNativeEvent::new(trigr, Duration::from_millis(160)),
324-
)
325-
} else {
326-
(
327-
ScheduledNativeEvent::new(guide, Duration::from_millis(240)),
328-
ScheduledNativeEvent::new(trigr, Duration::from_millis(160)),
321+
ScheduledNativeEvent::new(trigger, Duration::from_millis(1)),
329322
)
330323
};
331324
self.queued_events.push(guide);
332-
self.queued_events.push(trigr);
325+
self.queued_events.push(trigger);
333326
return Ok(());
334327
}
335328

0 commit comments

Comments
 (0)