From 75cdf347311620b7e95c77c17acaf4ec1a26e8c0 Mon Sep 17 00:00:00 2001 From: Pimpest <82343504+pimpest@users.noreply.github.com> Date: Sun, 4 Oct 2026 14:55:44 +0200 Subject: [PATCH] Add prompt for input at launch --- src/main.rs | 59 +++++++++++++++++++++++++++++++++++++++--- src/virtual_gamepad.rs | 29 +++++++++++---------- 2 files changed, 70 insertions(+), 18 deletions(-) diff --git a/src/main.rs b/src/main.rs index b119a45..3c341b9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -23,6 +23,21 @@ async fn watch_keyboard(path: PathBuf, target: KeyCode, tx: Sender) { } } +async fn fill_keyboard(path: PathBuf, tx: Sender) { + let device = Device::open(path.clone()).unwrap(); + let Ok(mut stream) = device.into_event_stream() else { + return; + }; + + while let Ok(event) = stream.next_event().await { + if event.event_type() == EventType::KEY + && event.value() == 0 + { + let _ = tx.send(event.code()).await; + } + } +} + fn enumerate_keyboards() -> Vec { evdev::enumerate() .filter_map(|(path, device)| { @@ -35,7 +50,7 @@ fn enumerate_keyboards() -> Vec { .collect() } -async fn find_target_keyboard(device_paths: &Vec) -> Option { +async fn find_target_keyboard(device_paths: &Vec) -> Option<(Device, [KeyCode;14])> { let (tx, mut rx): (Sender, Receiver) = channel(1); let mut handles = vec![]; @@ -56,7 +71,43 @@ async fn find_target_keyboard(device_paths: &Vec) -> Option { handle.abort(); } - Device::open(path).ok() + let (tx, mut rx): (Sender, Receiver) = channel(1); + let handle = tokio::spawn(fill_keyboard( + path.clone(), + tx.clone(),)); + + let mut keys : [KeyCode;14] = [KeyCode::KEY_SPACE; 14]; + let key_names = [ + "A", + "B", + "Y", + "X", + "TRIGER_R", + "TRIGER_L", + "THUMB_L", + "THUMB_R", + "START", + "SELECT", + "UP", + "DOWN", + "RIGT", + "LEFT", + ]; + + for i in 0..14 { + println!("Enter key: {}", key_names[i]); + keys[i] = evdev::KeyCode(rx.recv().await?); + } + + + handle.abort(); + + if let Some(dev) = Device::open(path).ok() { + + Some((dev, keys)) + } else { + None + } } #[tokio::main(flavor = "local")] @@ -70,7 +121,7 @@ async fn main() { } } - let Some(kb) = find_target_keyboard(&devices_paths).await else { + let Some((kb, keybinds)) = find_target_keyboard(&devices_paths).await else { return; }; @@ -78,7 +129,7 @@ async fn main() { return; }; - let mut gamepad = VirtualGamepad::new("Virtual Gamepad 1"); + let mut gamepad = VirtualGamepad::new("Virtual Gamepad 1", &keybinds); if !kb.device_mut().grab().is_ok() { println!("Failed to grab device"); diff --git a/src/virtual_gamepad.rs b/src/virtual_gamepad.rs index 5df1492..e4ce694 100644 --- a/src/virtual_gamepad.rs +++ b/src/virtual_gamepad.rs @@ -28,7 +28,7 @@ pub struct VirtualGamepad { } impl VirtualGamepad { - pub fn new(name: &str) -> VirtualGamepad { + pub fn new(name: &str, keybinds: &[KeyCode; 14]) -> VirtualGamepad { let mut keys = AttributeSet::::new(); keys.insert(KeyCode::BTN_SOUTH); keys.insert(KeyCode::BTN_EAST); @@ -49,22 +49,23 @@ impl VirtualGamepad { let mut btn_bindings = HashMap::new(); - btn_bindings.insert(KeyCode::KEY_J.code(), KeyCode::BTN_SOUTH); - btn_bindings.insert(KeyCode::KEY_I.code(), KeyCode::BTN_EAST); - btn_bindings.insert(KeyCode::KEY_O.code(), KeyCode::BTN_NORTH); - btn_bindings.insert(KeyCode::KEY_L.code(), KeyCode::BTN_WEST); - btn_bindings.insert(KeyCode::KEY_M.code(), KeyCode::BTN_TR); - btn_bindings.insert(KeyCode::KEY_K.code(), KeyCode::BTN_THUMBL); - btn_bindings.insert(KeyCode::KEY_SEMICOLON.code(), KeyCode::BTN_TL); - btn_bindings.insert(KeyCode::KEY_ENTER.code(), KeyCode::BTN_START); - btn_bindings.insert(KeyCode::KEY_ESC.code(), KeyCode::BTN_SELECT); + btn_bindings.insert(keybinds[0].code(), KeyCode::BTN_SOUTH); + btn_bindings.insert(keybinds[1].code(), KeyCode::BTN_EAST); + btn_bindings.insert(keybinds[2].code(), KeyCode::BTN_NORTH); + btn_bindings.insert(keybinds[3].code(), KeyCode::BTN_WEST); + btn_bindings.insert(keybinds[4].code(), KeyCode::BTN_TR); + btn_bindings.insert(keybinds[5].code(), KeyCode::BTN_TL); + btn_bindings.insert(keybinds[6].code(), KeyCode::BTN_THUMBR); + btn_bindings.insert(keybinds[7].code(), KeyCode::BTN_THUMBL); + btn_bindings.insert(keybinds[8].code(), KeyCode::BTN_START); + btn_bindings.insert(keybinds[9].code(), KeyCode::BTN_SELECT); let mut dpad_bindings = HashMap::new(); - dpad_bindings.insert(KeyCode::KEY_SPACE.code(), Direction::Up); - dpad_bindings.insert(KeyCode::KEY_E.code(), Direction::Down); - dpad_bindings.insert(KeyCode::KEY_F.code(), Direction::Right); - dpad_bindings.insert(KeyCode::KEY_W.code(), Direction::Left); + dpad_bindings.insert(keybinds[10].code(), Direction::Up); + dpad_bindings.insert(keybinds[11].code(), Direction::Down); + dpad_bindings.insert(keybinds[12].code(), Direction::Right); + dpad_bindings.insert(keybinds[13].code(), Direction::Left); let ui = VirtualDevice::builder() .unwrap()