From 1d2acfb88ec3b3add6dacf0433faf37bc624e0ae Mon Sep 17 00:00:00 2001 From: cyber-sushi Date: Fri, 10 May 2024 01:53:47 +0200 Subject: [PATCH] Automatically import user environment when running as system service --- src/active_client.rs | 1 - src/udev_monitor.rs | 33 ++++++++++++++++++++------------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/active_client.rs b/src/active_client.rs index c88c30b..597fac0 100644 --- a/src/active_client.rs +++ b/src/active_client.rs @@ -17,7 +17,6 @@ pub async fn get_active_window(current_desktop: &Option, config: &HashMa String::from("default") } } else { - println!("Unable to connect to the compositor. Running without user environment?"); String::from("default") } }, diff --git a/src/udev_monitor.rs b/src/udev_monitor.rs index 74fa773..592bb91 100644 --- a/src/udev_monitor.rs +++ b/src/udev_monitor.rs @@ -11,6 +11,7 @@ use crate::event_reader::EventReader; pub struct Environment { pub user: Result, pub sudo_user: Result, + pub session_address: Result, } pub async fn start_monitoring_udev(config_files: Vec, mut tasks: Vec>) { @@ -36,28 +37,35 @@ pub fn launch_tasks(config_files: &Vec, tasks: &mut Vec>) let modifiers: Arc>> = Arc::new(Mutex::new(Default::default())); let modifier_was_activated: Arc> = Arc::new(Mutex::new(true)); match env::var("DBUS_SESSION_BUS_ADDRESS") { - Ok(_) => true, + Ok(_) => { + let command = Command::new("sh").arg("-c").arg("systemctl --user show-environment").output().unwrap(); + let vars = std::str::from_utf8(command.stdout.as_slice()).unwrap().split("\n").collect::>(); + for var in vars { + if var != "" && !var.contains("DBUS_SESSION_BUS_ADDRESS") { + let split_var = var.split("=").collect::>(); + env::set_var(split_var[0], split_var[1]); + } + } + true + }, Err(_) => { println!("Warning: unable to inherit user environment.\n\ - To launch Makima as root, use 'sudo -E makima', otherwise some shell commands won't work.\n"); + Launch Makima with 'sudo -E makima' or add the DBUS_SESSION_BUS_ADDRESS env var to your systemd unit if you're running it through systemd.\n"); false }, }; let environment = Environment { user: env::var("USER"), sudo_user: env::var("SUDO_USER"), + session_address: env::var("DBUS_SESSION_BUS_ADDRESS"), }; - if let Err(env::VarError::NotPresent) = env::var("DISPLAY") { - println!("Setting DISPLAY=:0"); - env::set_var("DISPLAY", ":0"); - } let mut session_var = "WAYLAND_DISPLAY"; - if let Err(_) = env::var(session_var) { + if let Err(env::VarError::NotPresent) = env::var(session_var) { session_var = "XDG_SESSION_TYPE"; } let current_desktop: Option = match (env::var(session_var), env::var("XDG_CURRENT_DESKTOP")) { (Ok(session), Ok(desktop)) if session.contains("wayland") && vec!["Hyprland".to_string(), "sway".to_string()].contains(&desktop) => { - println!("Running on {}, active window detection enabled.\n", desktop); + println!("Running on {}, active window tracking enabled.", desktop); Option::Some(desktop) }, (Ok(session), Ok(desktop)) if session.contains("wayland") => { @@ -66,7 +74,7 @@ pub fn launch_tasks(config_files: &Vec, tasks: &mut Vec>) Option::None }, (Ok(session), _) if session == "x11".to_string() => { - println!("Running on X11, active window detection enabled."); + println!("Running on X11, active window tracking enabled."); Option::Some("x11".to_string()) }, (Ok(session), Err(_)) if session.contains("wayland") => { @@ -83,17 +91,16 @@ pub fn launch_tasks(config_files: &Vec, tasks: &mut Vec>) }; let user_has_access = match Command::new("groups").output() { Ok(groups) if std::str::from_utf8(&groups.stdout.as_slice()).unwrap().contains("input") => { - println!("Running with evdev permissions.\nScanning for event devices with a matching config file...\n"); + println!("Evdev permissions available.\nScanning for event devices with a matching config file...\n"); true }, Ok(groups) if std::str::from_utf8(&groups.stdout.as_slice()).unwrap().contains("root") => { - println!("Running as root.\nScanning for event devices with a matching config file...\n"); + println!("Root permissions available.\nScanning for event devices with a matching config file...\n"); true } - Ok(groups) => { + Ok(_) => { println!("Warning: user has no access to event devices, Makima might not be able to detect all connected devices.\n\ Note: use `sudo usermod -aG input ` and reboot. Alternatively, run Makima as root. Continuing...\n"); - println!("{:?}", &std::str::from_utf8(&groups.stdout.as_slice()).unwrap()); false }, Err(_) => {