1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#[macro_use]
extern crate serde_derive;
extern crate serde;
pub mod input;
pub mod keys;
use std::process::Command;
use std::str::from_utf8;
use std::fs::{File, OpenOptions};
use std::io::Read;
use input::Input;
#[derive(Debug)]
pub struct InputReader {
file: File
}
impl InputReader {
pub fn new(path: String) -> InputReader {
InputReader{file: OpenOptions::new().read(true).write(false).append(false).open(path).expect("could not open device file")}
}
pub fn current_state(&mut self) -> Input{
let mut buf: [u8; 24] = [0 as u8; 24];
self.file.read(&mut buf).expect("error reading file");
Input::from_read(&buf)
}
}
pub fn get_input_devices() -> Vec<String>{
let command = "grep -E 'Handlers|EV' /proc/bus/input/devices | grep -B1 120013 | grep -Eo event[0-9]+".to_string();
let result = Command::new("sh").arg("-c").arg(command).output().expect("could not execute command to search for input devices");
let result_str = from_utf8(&result.stdout).expect("could not get results");
result_str.trim().split('\n').map(|s| "/dev/input/".to_string() + s).collect()
}