Parse associated layout from config file name

This commit is contained in:
cyber-sushi 2024-05-29 06:05:33 +02:00
parent b4dd6a8989
commit 7c3da30404

View file

@ -1,15 +1,16 @@
use std::{collections::HashMap, sync::Arc, path::Path, process::Command, env}; use std::{sync::Arc, path::Path, process::Command, env};
use tokio::sync::Mutex; use tokio::sync::Mutex;
use tokio::task::JoinHandle; use tokio::task::JoinHandle;
use tokio_stream::StreamExt; use tokio_stream::StreamExt;
use evdev::{Device, EventStream}; use evdev::{Device, EventStream};
use crate::Config; use crate::Config;
use crate::config::Event; use crate::config::{Event, Associations};
use crate::event_reader::EventReader; use crate::event_reader::EventReader;
#[derive(Eq, PartialEq, Hash, Clone)] #[derive(Debug, Default, Eq, PartialEq, Hash, Clone)]
pub enum Client { pub enum Client {
#[default]
Default, Default,
Class(String), Class(String),
} }
@ -73,26 +74,40 @@ pub fn launch_tasks(config_files: &Vec<Config>, tasks: &mut Vec<JoinHandle<()>>,
let devices: evdev::EnumerateDevices = evdev::enumerate(); let devices: evdev::EnumerateDevices = evdev::enumerate();
let mut devices_found = 0; let mut devices_found = 0;
for device in devices { for device in devices {
let mut config_map: HashMap<Client, Config> = HashMap::new(); let mut config_list: Vec<Config> = Vec::new();
for config in config_files { for mut config in config_files.clone() {
let split_config_name = config.name.split("::").collect::<Vec<&str>>(); let split_config_name = config.name.split("::").collect::<Vec<&str>>();
let associated_device_name = split_config_name[0]; let associated_device_name = split_config_name[0];
if associated_device_name == device.1.name().unwrap().replace("/", "") { if associated_device_name == device.1.name().unwrap().replace("/", "") {
let window_class = if split_config_name.len() == 1 { let (window_class, layout) = if split_config_name.len() == 1 {
Client::Default (Client::Default, 0)
} else if split_config_name.len() == 2 {
if split_config_name[1].len() == 1 {
(Client::Default, split_config_name[1].parse::<u16>().unwrap_or(1))
} else {
(Client::Class(split_config_name[1].to_string()), 0)
}
} else if split_config_name.len() == 3 {
if split_config_name[1].len() == 1 {
(Client::Class(split_config_name[2].to_string()), split_config_name[1].parse::<u16>().unwrap_or(1))
} else {
(Client::Class(split_config_name[1].to_string()), split_config_name[2].parse::<u16>().unwrap_or(1))
}
} else { } else {
Client::Class(split_config_name[1].to_string()) (Client::Default, 0)
}; };
config_map.insert(window_class, config.clone()); config.associations.client = window_class;
config.associations.layout = layout;
config_list.push(config.clone());
}; };
} }
if config_map.len() > 0 && !config_map.contains_key(&Client::Default) { if config_list.len() > 0 && !config_list.iter().any(|x| x.associations == Associations::default()) {
config_map.insert(Client::Default, Config::new_empty(device.1.name().unwrap().replace("/", ""))); config_list.push(Config::new_empty(device.1.name().unwrap().replace("/", "")));
} }
let event_device = device.0.as_path().to_str().unwrap().to_string(); let event_device = device.0.as_path().to_str().unwrap().to_string();
if !config_map.is_empty() { if config_list.len() != 0 {
let stream = Arc::new(Mutex::new(get_event_stream(Path::new(&event_device), config_map.clone()))); let stream = Arc::new(Mutex::new(get_event_stream(Path::new(&event_device), config_list.clone())));
let reader = EventReader::new(config_map.clone(), stream, modifiers.clone(), modifier_was_activated.clone(), environment.clone()); let reader = EventReader::new(config_list.clone(), stream, modifiers.clone(), modifier_was_activated.clone(), environment.clone());
tasks.push(tokio::spawn(start_reader(reader))); tasks.push(tokio::spawn(start_reader(reader)));
devices_found += 1 devices_found += 1
} }
@ -193,9 +208,9 @@ fn set_environment() -> Environment {
} }
} }
pub fn get_event_stream(path: &Path, config: HashMap<Client, Config>) -> EventStream { pub fn get_event_stream(path: &Path, config: Vec<Config>) -> EventStream {
let mut device: Device = Device::open(path).expect("Couldn't open device path."); let mut device: Device = Device::open(path).expect("Couldn't open device path.");
match config.get(&Client::Default).unwrap().settings.get("GRAB_DEVICE") { match config.iter().find(|&x| x.associations == Associations::default()).unwrap().settings.get("GRAB_DEVICE") {
Some(value) => { Some(value) => {
if value == &true.to_string() { if value == &true.to_string() {
device.grab().expect("Unable to grab device. Is another instance of Makima running?") device.grab().expect("Unable to grab device. Is another instance of Makima running?")