Added L/RSTICK_ACTIVATION_MODIFIERS parameter to control cursor and scroll activation through modifiers

This commit is contained in:
cyber-sushi 2024-05-13 18:26:10 +02:00
parent 373954cc38
commit aa1e6d66e2
2 changed files with 64 additions and 18 deletions

View file

@ -116,7 +116,23 @@ fn parse_raw_config(raw_config: RawConfig) -> (Bindings, Combinations, HashMap<S
}, },
None => Vec::new(), None => Vec::new(),
}; };
let lstick_activation_modifiers: Vec<Key> = match settings.get(&"LSTICK_ACTIVATION_MODIFIERS".to_string()) {
Some(modifiers) => {
modifiers.split("-").collect::<Vec<&str>>().iter()
.map(|key_str| Key::from_str(key_str).expect("Invalid KEY value used as modifier in LSTICK_ACTIVATION_MODIFIERS.")).collect()
},
None => Vec::new(),
};
let rstick_activation_modifiers: Vec<Key> = match settings.get(&"RSTICK_ACTIVATION_MODIFIERS".to_string()) {
Some(modifiers) => {
modifiers.split("-").collect::<Vec<&str>>().iter()
.map(|key_str| Key::from_str(key_str).expect("Invalid KEY value used as modifier in RSTICK_ACTIVATION_MODIFIERS.")).collect()
},
None => Vec::new(),
};
mapped_modifiers.custom.extend(custom_modifiers); mapped_modifiers.custom.extend(custom_modifiers);
mapped_modifiers.custom.extend(lstick_activation_modifiers);
mapped_modifiers.custom.extend(rstick_activation_modifiers);
let abs = [ let abs = [
"BTN_DPAD_UP", "BTN_DPAD_UP",

View file

@ -3,6 +3,7 @@ use tokio::sync::Mutex;
use tokio_stream::StreamExt; use tokio_stream::StreamExt;
use fork::{fork, Fork}; use fork::{fork, Fork};
use evdev::{EventStream, Key, RelativeAxisType, AbsoluteAxisType, EventType, InputEvent}; use evdev::{EventStream, Key, RelativeAxisType, AbsoluteAxisType, EventType, InputEvent};
use std::str::FromStr;
use crate::virtual_devices::VirtualDevices; use crate::virtual_devices::VirtualDevices;
use crate::Config; use crate::Config;
use crate::active_client::*; use crate::active_client::*;
@ -12,6 +13,7 @@ struct Stick {
function: String, function: String,
sensitivity: u64, sensitivity: u64,
deadzone: i32, deadzone: i32,
activation_modifiers: Vec<Key>,
} }
struct Settings { struct Settings {
@ -55,10 +57,21 @@ impl EventReader {
.settings.get("LSTICK_SENSITIVITY").unwrap_or(&"0".to_string()).parse::<u64>().expect("Invalid value for LSTICK_SENSITIVITY, please use an integer value >= 0"); .settings.get("LSTICK_SENSITIVITY").unwrap_or(&"0".to_string()).parse::<u64>().expect("Invalid value for LSTICK_SENSITIVITY, please use an integer value >= 0");
let lstick_deadzone: i32 = config.get(&"default".to_string()).unwrap() let lstick_deadzone: i32 = config.get(&"default".to_string()).unwrap()
.settings.get("LSTICK_DEADZONE").unwrap_or(&"5".to_string()).parse::<i32>().expect("Invalid value for LSTICK_DEADZONE, please use an integer between 0 and 128."); .settings.get("LSTICK_DEADZONE").unwrap_or(&"5".to_string()).parse::<i32>().expect("Invalid value for LSTICK_DEADZONE, please use an integer between 0 and 128.");
let lstick_activation_modifiers: Vec<Key> = match config.get(&"default".to_string()).unwrap().settings.get(&"LSTICK_ACTIVATION_MODIFIERS".to_string()) {
Some(modifiers) => {
let mut parsed_modifiers: Vec<Key> = modifiers.split("-").collect::<Vec<&str>>().iter()
.map(|key_str| Key::from_str(key_str).expect("Invalid KEY value used as modifier in LSTICK_ACTIVATION_MODIFIERS.")).collect();
parsed_modifiers.sort();
parsed_modifiers.dedup();
parsed_modifiers
},
None => Vec::new(),
};
let lstick = Stick { let lstick = Stick {
function: lstick_function, function: lstick_function,
sensitivity: lstick_sensitivity, sensitivity: lstick_sensitivity,
deadzone: lstick_deadzone, deadzone: lstick_deadzone,
activation_modifiers: lstick_activation_modifiers,
}; };
let rstick_function: String = config.get(&"default".to_string()).unwrap() let rstick_function: String = config.get(&"default".to_string()).unwrap()
@ -67,10 +80,21 @@ impl EventReader {
.settings.get("RSTICK_SENSITIVITY").unwrap_or(&"0".to_string()).parse::<u64>().expect("Invalid value for RSTICK_SENSITIVITY, please use an integer value >= 0"); .settings.get("RSTICK_SENSITIVITY").unwrap_or(&"0".to_string()).parse::<u64>().expect("Invalid value for RSTICK_SENSITIVITY, please use an integer value >= 0");
let rstick_deadzone: i32 = config.get(&"default".to_string()).unwrap() let rstick_deadzone: i32 = config.get(&"default".to_string()).unwrap()
.settings.get("RSTICK_DEADZONE").unwrap_or(&"5".to_string()).parse::<i32>().expect("Invalid value for RSTICK_DEADZONE, please use an integer between 0 and 128."); .settings.get("RSTICK_DEADZONE").unwrap_or(&"5".to_string()).parse::<i32>().expect("Invalid value for RSTICK_DEADZONE, please use an integer between 0 and 128.");
let rstick_activation_modifiers: Vec<Key> = match config.get(&"default".to_string()).unwrap().settings.get(&"RSTICK_ACTIVATION_MODIFIERS".to_string()) {
Some(modifiers) => {
let mut parsed_modifiers: Vec<Key> = modifiers.split("-").collect::<Vec<&str>>().iter()
.map(|key_str| Key::from_str(key_str).expect("Invalid KEY value used as modifier in RSTICK_ACTIVATION_MODIFIERS.")).collect();
parsed_modifiers.sort();
parsed_modifiers.dedup();
parsed_modifiers
},
None => Vec::new(),
};
let rstick = Stick { let rstick = Stick {
function: rstick_function, function: rstick_function,
sensitivity: rstick_sensitivity, sensitivity: rstick_sensitivity,
deadzone: rstick_deadzone, deadzone: rstick_deadzone,
activation_modifiers: rstick_activation_modifiers,
}; };
let axis_16_bit: bool = config.get(&"default".to_string()).unwrap() let axis_16_bit: bool = config.get(&"default".to_string()).unwrap()
@ -514,12 +538,12 @@ impl EventReader {
} }
pub async fn cursor_loop(&self) { pub async fn cursor_loop(&self) {
let (cursor, sensitivity) = if self.settings.lstick.function.as_str() == "cursor" { let (cursor, sensitivity, activation_modifiers) = if self.settings.lstick.function.as_str() == "cursor" {
("left", self.settings.lstick.sensitivity) ("left", self.settings.lstick.sensitivity, self.settings.lstick.activation_modifiers.clone())
} else if self.settings.rstick.function.as_str() == "cursor" { } else if self.settings.rstick.function.as_str() == "cursor" {
("right", self.settings.rstick.sensitivity) ("right", self.settings.rstick.sensitivity, self.settings.rstick.activation_modifiers.clone())
} else { } else {
("disabled", 0) ("disabled", 0, vec![])
}; };
if sensitivity != 0 { if sensitivity != 0 {
while *self.device_is_connected.lock().await { while *self.device_is_connected.lock().await {
@ -532,11 +556,14 @@ impl EventReader {
break break
}; };
if stick_position[0] != 0 || stick_position[1] != 0 { if stick_position[0] != 0 || stick_position[1] != 0 {
let virtual_event_x: InputEvent = InputEvent::new_now(EventType::RELATIVE, 0, stick_position[0]); let modifiers = self.modifiers.lock().await;
let virtual_event_y: InputEvent = InputEvent::new_now(EventType::RELATIVE, 1, stick_position[1]); if activation_modifiers.len() == 0 || activation_modifiers == *modifiers {
let mut virt_dev = self.virt_dev.lock().await; let virtual_event_x: InputEvent = InputEvent::new_now(EventType::RELATIVE, 0, stick_position[0]);
virt_dev.axis.emit(&[virtual_event_x]).unwrap(); let virtual_event_y: InputEvent = InputEvent::new_now(EventType::RELATIVE, 1, stick_position[1]);
virt_dev.axis.emit(&[virtual_event_y]).unwrap(); let mut virt_dev = self.virt_dev.lock().await;
virt_dev.axis.emit(&[virtual_event_x]).unwrap();
virt_dev.axis.emit(&[virtual_event_y]).unwrap();
}
} }
} }
tokio::time::sleep(std::time::Duration::from_millis(sensitivity)).await; tokio::time::sleep(std::time::Duration::from_millis(sensitivity)).await;
@ -547,12 +574,12 @@ impl EventReader {
} }
pub async fn scroll_loop(&self) { pub async fn scroll_loop(&self) {
let (scroll, sensitivity) = if self.settings.lstick.function.as_str() == "scroll" { let (scroll, sensitivity, activation_modifiers) = if self.settings.lstick.function.as_str() == "scroll" {
("left", self.settings.lstick.sensitivity) ("left", self.settings.lstick.sensitivity, self.settings.lstick.activation_modifiers.clone())
} else if self.settings.rstick.function.as_str() == "scroll" { } else if self.settings.rstick.function.as_str() == "scroll" {
("right", self.settings.rstick.sensitivity) ("right", self.settings.rstick.sensitivity, self.settings.rstick.activation_modifiers.clone())
} else { } else {
("disabled", 0) ("disabled", 0, vec![])
}; };
if sensitivity != 0 { if sensitivity != 0 {
while *self.device_is_connected.lock().await { while *self.device_is_connected.lock().await {
@ -565,11 +592,14 @@ impl EventReader {
break break
}; };
if stick_position[0] != 0 || stick_position[1] != 0 { if stick_position[0] != 0 || stick_position[1] != 0 {
let virtual_event_x: InputEvent = InputEvent::new_now(EventType::RELATIVE, 12, stick_position[0]); let modifiers = self.modifiers.lock().await;
let virtual_event_y: InputEvent = InputEvent::new_now(EventType::RELATIVE, 11, stick_position[1]); if activation_modifiers.len() == 0 || activation_modifiers == *modifiers {
let mut virt_dev = self.virt_dev.lock().await; let virtual_event_x: InputEvent = InputEvent::new_now(EventType::RELATIVE, 12, stick_position[0]);
virt_dev.axis.emit(&[virtual_event_x]).unwrap(); let virtual_event_y: InputEvent = InputEvent::new_now(EventType::RELATIVE, 11, stick_position[1]);
virt_dev.axis.emit(&[virtual_event_y]).unwrap(); let mut virt_dev = self.virt_dev.lock().await;
virt_dev.axis.emit(&[virtual_event_x]).unwrap();
virt_dev.axis.emit(&[virtual_event_y]).unwrap();
}
} }
} }
tokio::time::sleep(std::time::Duration::from_millis(sensitivity)).await; tokio::time::sleep(std::time::Duration::from_millis(sensitivity)).await;