Implement xremap's VirtualDevice

pull/39/head
Takashi Kokubun 3 years ago
parent d21a3e7650
commit f058c44433
No known key found for this signature in database
GPG Key ID: 6FFC433B12EE23DD

@ -60,8 +60,8 @@ pub fn select_device(device_opts: &Vec<String>) -> Result<Vec<Device>, Box<dyn E
pub fn event_loop(mut input_devices: Vec<Device>, _config: &Config) -> Result<(), Box<dyn Error>> {
let mut input_device = input_devices.remove(0);
let mut output_device = build_device(&input_device)
.map_err(|e| format!("Failed to build an output device: {}", e))?;
let mut output_device =
build_device().map_err(|e| format!("Failed to build an output device: {}", e))?;
input_device
.grab()
.map_err(|e| format!("Failed to grab an input device: {}", e))?;
@ -135,7 +135,7 @@ fn is_keyboard(device: &Device) -> bool {
keys.contains(Key::KEY_SPACE)
&& keys.contains(Key::KEY_A)
&& keys.contains(Key::KEY_Z)
&& !keys.contains(Key::BTN_TOOL_MOUSE)
&& !keys.contains(Key::BTN_LEFT) // BTN_MOUSE
}
None => false,
}

@ -1,13 +1,45 @@
use evdev::uinput::{VirtualDevice, VirtualDeviceBuilder};
use evdev::Device;
use evdev::{AttributeSet, Key, RelativeAxisType};
use std::error::Error;
pub fn build_device(base_device: &Device) -> Result<VirtualDevice, Box<dyn Error>> {
let builder = VirtualDeviceBuilder::new()?.name("xremap");
let device = match base_device.supported_keys() {
Some(keys) => builder.with_keys(keys)?,
None => builder,
static MOUSE_BTNS: [&str; 13] = [
"BTN_0",
"BTN_1",
"BTN_2",
"BTN_3",
"BTN_4",
"BTN_5",
"BTN_6",
"BTN_7",
"BTN_8",
"BTN_9",
"BTN_LEFT",
"BTN_MIDDLE",
"BTN_RIGHT",
];
// Credit: https://github.com/mooz/xkeysnail/blob/master/xkeysnail/output.py#L10-L32
pub fn build_device() -> Result<VirtualDevice, Box<dyn Error>> {
let mut keys: AttributeSet<Key> = AttributeSet::new();
for code in Key::KEY_RESERVED.code()..Key::BTN_TRIGGER_HAPPY40.code() {
let key = Key::new(code);
let name = format!("{:?}", key);
if name.starts_with("KEY_") || MOUSE_BTNS.contains(&&**&name) {
keys.insert(key);
}
}
.build()?;
let mut relative_axes: AttributeSet<RelativeAxisType> = AttributeSet::new();
relative_axes.insert(RelativeAxisType::REL_X);
relative_axes.insert(RelativeAxisType::REL_Y);
relative_axes.insert(RelativeAxisType::REL_HWHEEL);
relative_axes.insert(RelativeAxisType::REL_WHEEL);
relative_axes.insert(RelativeAxisType::REL_MISC);
let device = VirtualDeviceBuilder::new()?
.name("xremap")
.with_keys(&keys)?
.with_relative_axes(&relative_axes)?
.build()?;
Ok(device)
}

Loading…
Cancel
Save