use std::io::Write; #[macro_use] extern crate lazy_static; fn main() -> () { lazy_static! { static ref D: evdev::Device = { let d = pick_device(); d }; } println!("{}", D.name().unwrap_or("Unknown device")); let pedals = vec![ Pedal { key: evdev::Key::BTN_SIDE, action: Box::new(|| println!("BTN_SIDE")), }, Pedal { key: evdev::Key::BTN_EXTRA, action: Box::new(|| println!("BTN_EXTRA")), }, ]; let side_handle = std::thread::spawn(|| { let pedal = Pedal { key: evdev::Key::BTN_SIDE, action: Box::new(|| println!("BTN_SIDE")), }; loop { if D.get_key_state().unwrap().contains(pedal.key) { (*pedal.action)(); } std::thread::sleep(std::time::Duration::from_millis(100)); } }); let extra_handle = std::thread::spawn(|| loop { if D.get_key_state().unwrap().contains(evdev::Key::BTN_EXTRA) { println!("BTN_EXTRA"); } std::thread::sleep(std::time::Duration::from_millis(100)); }); extra_handle.join().expect("Couldn't join"); side_handle.join().expect("Couldn't join"); } fn pick_device() -> evdev::Device { let mut args = std::env::args_os(); args.next(); if let Some(dev_file) = args.next() { evdev::Device::open(dev_file).unwrap() } else { let mut devices = evdev::enumerate().collect::>(); devices.reverse(); for (i, d) in devices.iter().enumerate() { println!("{}: {}", i, d.name().unwrap_or("Unnamed device")); } print!("Select the device [0-{}]: ", devices.len()); let _ = std::io::stdout().flush(); let mut chosen = String::new(); std::io::stdin().read_line(&mut chosen).unwrap(); let n = chosen.trim().parse::().unwrap(); devices.into_iter().nth(n).unwrap() } } struct Pedal { key: evdev::Key, action: Box ()>, }