Skip to content

Commit e1c7c04

Browse files
committed
input: Fix SDL gamepad lifetime management
1 parent f6ffe1e commit e1c7c04

File tree

2 files changed

+11
-8
lines changed

2 files changed

+11
-8
lines changed

engine/modules/input/src/gamepad.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use lazy_static::lazy_static;
88
use num_enum::IntoPrimitive;
99
use std::cmp::min;
1010
use std::collections::HashMap;
11-
11+
use fragile::Fragile;
1212
use argus_wm::WindowManager;
1313
use sdl3::event::Event as SdlEvent;
1414
use sdl3::gamepad::Axis as SdlGamepadAxis;
@@ -251,14 +251,14 @@ fn normalize_axis(val: i16) -> f64 {
251251
}
252252
}
253253

254-
fn poll_gamepad(devices_state: &mut GamepadDevicesState, id: HidDeviceInstanceId) {
254+
fn poll_gamepad(devices_state: &GamepadDevicesState, id: HidDeviceInstanceId) {
255255
let Ok(gamepad) = InputManager::instance().get_sdl_gamepad_ss().unwrap().open(id) else {
256256
warn!(LOGGER, "Failed to get SDL controller from instance ID {}", id);
257257
return;
258258
};
259259

260260
let controller_opt = devices_state.mapped_gamepads.get(&id)
261-
.map(|name| InputManager::instance().get_controller(name));
261+
.map(|(_, name)| InputManager::instance().get_controller(name));
262262

263263
let mut new_button_state: GamepadButtonState = 0;
264264
let mut i = 0;
@@ -499,7 +499,7 @@ fn handle_gamepad_events(devices_state: &mut GamepadDevicesState) {
499499

500500
let mut devices_state =
501501
InputManager::instance().gamepad_devices_state.write();
502-
if let Some(controller_name) =
502+
if let Some((_, controller_name)) =
503503
devices_state.mapped_gamepads.get(&instance_id) {
504504
match InputManager::instance().controllers.get_mut(controller_name) {
505505
Some(mut controller) => {
@@ -554,8 +554,8 @@ pub(crate) fn update_gamepads() {
554554
poll_gamepad(&mut devices_state, gamepad_id);
555555
}
556556

557-
for (gamepad_id, _) in devices_state.mapped_gamepads.clone() {
558-
poll_gamepad(&mut devices_state, gamepad_id);
557+
for (&gamepad_id, _) in &devices_state.mapped_gamepads {
558+
poll_gamepad(&devices_state, gamepad_id);
559559
}
560560
}
561561

@@ -578,7 +578,9 @@ pub(crate) fn assoc_gamepad(id: HidDeviceInstanceId, controller_name: impl Into<
578578
};
579579

580580
gamepads.remove(pos);
581-
devices_state.mapped_gamepads.insert(id, controller_name.into());
581+
let gamepad = InputManager::instance().get_sdl_gamepad_ss().unwrap().open(id)
582+
.map_err(|e| e.to_string())?;
583+
devices_state.mapped_gamepads.insert(id, (Fragile::new(gamepad), controller_name.into()));
582584

583585
Ok(())
584586
}

engine/modules/input/src/input_manager.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ pub(crate) struct MouseState {
4646
#[derive(Default)]
4747
pub(crate) struct GamepadDevicesState {
4848
pub(crate) available_gamepads: Vec<HidDeviceInstanceId>,
49-
pub(crate) mapped_gamepads: HashMap<HidDeviceInstanceId, String>,
49+
pub(crate) mapped_gamepads:
50+
HashMap<HidDeviceInstanceId, (Fragile<sdl3::gamepad::Gamepad>, String)>,
5051
pub(crate) are_gamepads_initted: bool,
5152
}
5253

0 commit comments

Comments
 (0)