Add prompt for input at launch
This commit is contained in:
+55
-4
@@ -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> {
|
fn enumerate_keyboards() -> Vec<PathBuf> {
|
||||||
evdev::enumerate()
|
evdev::enumerate()
|
||||||
.filter_map(|(path, device)| {
|
.filter_map(|(path, device)| {
|
||||||
@@ -35,7 +50,7 @@ fn enumerate_keyboards() -> Vec<PathBuf> {
|
|||||||
.collect()
|
.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 (tx, mut rx): (Sender<PathBuf>, Receiver<PathBuf>) = channel(1);
|
||||||
|
|
||||||
let mut handles = vec![];
|
let mut handles = vec![];
|
||||||
@@ -56,7 +71,43 @@ async fn find_target_keyboard(device_paths: &Vec<PathBuf>) -> Option<Device> {
|
|||||||
handle.abort();
|
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")]
|
#[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;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -78,7 +129,7 @@ async fn main() {
|
|||||||
return;
|
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() {
|
if !kb.device_mut().grab().is_ok() {
|
||||||
println!("Failed to grab device");
|
println!("Failed to grab device");
|
||||||
|
|||||||
+15
-14
@@ -28,7 +28,7 @@ pub struct VirtualGamepad {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl VirtualGamepad {
|
impl VirtualGamepad {
|
||||||
pub fn new(name: &str) -> VirtualGamepad {
|
pub fn new(name: &str, keybinds: &[KeyCode; 14]) -> VirtualGamepad {
|
||||||
let mut keys = AttributeSet::<KeyCode>::new();
|
let mut keys = AttributeSet::<KeyCode>::new();
|
||||||
keys.insert(KeyCode::BTN_SOUTH);
|
keys.insert(KeyCode::BTN_SOUTH);
|
||||||
keys.insert(KeyCode::BTN_EAST);
|
keys.insert(KeyCode::BTN_EAST);
|
||||||
@@ -49,22 +49,23 @@ impl VirtualGamepad {
|
|||||||
|
|
||||||
let mut btn_bindings = HashMap::new();
|
let mut btn_bindings = HashMap::new();
|
||||||
|
|
||||||
btn_bindings.insert(KeyCode::KEY_J.code(), KeyCode::BTN_SOUTH);
|
btn_bindings.insert(keybinds[0].code(), KeyCode::BTN_SOUTH);
|
||||||
btn_bindings.insert(KeyCode::KEY_I.code(), KeyCode::BTN_EAST);
|
btn_bindings.insert(keybinds[1].code(), KeyCode::BTN_EAST);
|
||||||
btn_bindings.insert(KeyCode::KEY_O.code(), KeyCode::BTN_NORTH);
|
btn_bindings.insert(keybinds[2].code(), KeyCode::BTN_NORTH);
|
||||||
btn_bindings.insert(KeyCode::KEY_L.code(), KeyCode::BTN_WEST);
|
btn_bindings.insert(keybinds[3].code(), KeyCode::BTN_WEST);
|
||||||
btn_bindings.insert(KeyCode::KEY_M.code(), KeyCode::BTN_TR);
|
btn_bindings.insert(keybinds[4].code(), KeyCode::BTN_TR);
|
||||||
btn_bindings.insert(KeyCode::KEY_K.code(), KeyCode::BTN_THUMBL);
|
btn_bindings.insert(keybinds[5].code(), KeyCode::BTN_TL);
|
||||||
btn_bindings.insert(KeyCode::KEY_SEMICOLON.code(), KeyCode::BTN_TL);
|
btn_bindings.insert(keybinds[6].code(), KeyCode::BTN_THUMBR);
|
||||||
btn_bindings.insert(KeyCode::KEY_ENTER.code(), KeyCode::BTN_START);
|
btn_bindings.insert(keybinds[7].code(), KeyCode::BTN_THUMBL);
|
||||||
btn_bindings.insert(KeyCode::KEY_ESC.code(), KeyCode::BTN_SELECT);
|
btn_bindings.insert(keybinds[8].code(), KeyCode::BTN_START);
|
||||||
|
btn_bindings.insert(keybinds[9].code(), KeyCode::BTN_SELECT);
|
||||||
|
|
||||||
let mut dpad_bindings = HashMap::new();
|
let mut dpad_bindings = HashMap::new();
|
||||||
|
|
||||||
dpad_bindings.insert(KeyCode::KEY_SPACE.code(), Direction::Up);
|
dpad_bindings.insert(keybinds[10].code(), Direction::Up);
|
||||||
dpad_bindings.insert(KeyCode::KEY_E.code(), Direction::Down);
|
dpad_bindings.insert(keybinds[11].code(), Direction::Down);
|
||||||
dpad_bindings.insert(KeyCode::KEY_F.code(), Direction::Right);
|
dpad_bindings.insert(keybinds[12].code(), Direction::Right);
|
||||||
dpad_bindings.insert(KeyCode::KEY_W.code(), Direction::Left);
|
dpad_bindings.insert(keybinds[13].code(), Direction::Left);
|
||||||
|
|
||||||
let ui = VirtualDevice::builder()
|
let ui = VirtualDevice::builder()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
|||||||
Reference in New Issue
Block a user