Add prompt for input at launch

This commit is contained in:
2026-10-04 14:55:44 +02:00
parent e4a8f24f1c
commit 75cdf34731
2 changed files with 70 additions and 18 deletions
+55 -4
View File
@@ -23,6 +23,21 @@ async fn watch_keyboard(path: PathBuf, target: KeyCode, tx: Sender<PathBuf>) {
}
}
async fn fill_keyboard(path: PathBuf, tx: Sender<u16>) {
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<PathBuf> {
evdev::enumerate()
.filter_map(|(path, device)| {
@@ -35,7 +50,7 @@ fn enumerate_keyboards() -> Vec<PathBuf> {
.collect()
}
async fn find_target_keyboard(device_paths: &Vec<PathBuf>) -> Option<Device> {
async fn find_target_keyboard(device_paths: &Vec<PathBuf>) -> Option<(Device, [KeyCode;14])> {
let (tx, mut rx): (Sender<PathBuf>, Receiver<PathBuf>) = channel(1);
let mut handles = vec![];
@@ -56,7 +71,43 @@ async fn find_target_keyboard(device_paths: &Vec<PathBuf>) -> Option<Device> {
handle.abort();
}
Device::open(path).ok()
let (tx, mut rx): (Sender<u16>, Receiver<u16>) = 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");
+15 -14
View File
@@ -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::<KeyCode>::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()