No more shelling out to grep, parse /proc/bus/input/devices manually
This commit is contained in:
parent
0e58664f67
commit
966cebf42a
34
src/main.rs
34
src/main.rs
@ -8,7 +8,7 @@ use rusty_keys::{KeyMaps, Device, InputDevice, Result};
|
|||||||
|
|
||||||
use ffi::*;
|
use ffi::*;
|
||||||
use libc::input_event;
|
use libc::input_event;
|
||||||
use std::process::{exit, Command};
|
use std::process::exit;
|
||||||
use std::{env, thread};
|
use std::{env, thread};
|
||||||
use std::sync::mpsc;
|
use std::sync::mpsc;
|
||||||
use std::sync::mpsc::Sender;
|
use std::sync::mpsc::Sender;
|
||||||
@ -199,18 +199,32 @@ fn parse_args() -> Config {
|
|||||||
// Detects and returns the name of the keyboard device file. This function uses
|
// Detects and returns the name of the keyboard device file. This function uses
|
||||||
// the fact that all device information is shown in /proc/bus/input/devices and
|
// the fact that all device information is shown in /proc/bus/input/devices and
|
||||||
// the keyboard device file should always have an EV of 120013
|
// the keyboard device file should always have an EV of 120013
|
||||||
|
// grep -E 'Handlers|EV' /proc/bus/input/devices | grep -B1 120013 | grep -Eo event[0-9]+
|
||||||
fn get_keyboard_device_filenames() -> Vec<String> {
|
fn get_keyboard_device_filenames() -> Vec<String> {
|
||||||
let command_str = "grep -E 'Handlers|EV' /proc/bus/input/devices | grep -B1 120013 | grep -Eo event[0-9]+".to_string();
|
use std::io::BufReader;
|
||||||
let res = Command::new("sh").arg("-c").arg(command_str).output();
|
use std::io::prelude::*;
|
||||||
if res.is_err() {
|
use std::fs::File;
|
||||||
|
|
||||||
|
let f = File::open("/proc/bus/input/devices");
|
||||||
|
if f.is_err() {
|
||||||
return Vec::new();
|
return Vec::new();
|
||||||
}
|
}
|
||||||
let res = res.unwrap();
|
let f = BufReader::new(f.unwrap());
|
||||||
let res_str = std::str::from_utf8(&res.stdout).unwrap_or("");
|
let mut filename = None;
|
||||||
|
|
||||||
let mut filenames = Vec::new();
|
let mut filenames = Vec::new();
|
||||||
for file in res_str.trim().split('\n') {
|
for line in f.lines() {
|
||||||
filenames.push(file.to_string());
|
if let Ok(line) = line {
|
||||||
|
if line.starts_with("H: Handlers=") {
|
||||||
|
if let Some(event_index) = line.find("event") {
|
||||||
|
let last_index = line[event_index..line.len()-1].find(" ").and_then(|i| Some(i + event_index)).unwrap_or(line.len() - 1);
|
||||||
|
filename = Some(line[event_index..last_index].to_owned());
|
||||||
|
}
|
||||||
|
} else if line == "B: EV=120013" {
|
||||||
|
if let Some(filename) = filename.clone() {
|
||||||
|
filenames.push(filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
filenames
|
filenames
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user