Added L/RSTICK_ACTIVATION_MODIFIERS parameter to control cursor and scroll activation through modifiers
This commit is contained in:
parent
373954cc38
commit
aa1e6d66e2
2 changed files with 64 additions and 18 deletions
|
@ -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",
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue