diff --git a/src/greeter.rs b/src/greeter.rs index 68d96d7..9de876f 100644 --- a/src/greeter.rs +++ b/src/greeter.rs @@ -213,25 +213,29 @@ pub fn main() -> Result<(), Box> { } }; - let mut command = match session_type { + let mut command = Vec::new(); + let mut env = Vec::new(); + match session_type { SessionType::X11 => { //TODO: xinit may be better, but more complicated to set up - vec![ - "startx".to_string(), - "/usr/bin/env".to_string(), - "XDG_SESSION_TYPE=x11".to_string(), - ] + command.push("startx".to_string()); + env.push("XDG_SESSION_TYPE=x11".to_string()); } SessionType::Wayland => { - vec![ - "/usr/bin/env".to_string(), - "XDG_SESSION_TYPE=wayland".to_string(), - ] + env.push("XDG_SESSION_TYPE=wayland".to_string()); } }; if let Some(desktop_names) = entry.section("Desktop Entry").attr("DesktopNames") { - command.push(format!("XDG_CURRENT_DESKTOP={desktop_names}")); + env.push(format!("XDG_CURRENT_DESKTOP={desktop_names}")); + } + + // Session exec may contain environmental variables + command.push("/usr/bin/env".to_string()); + + // To ensure the env is set correctly, we also set it in the session command + for arg in env.iter() { + command.push(arg.clone()); } match shlex::split(exec) { @@ -250,8 +254,8 @@ pub fn main() -> Result<(), Box> { } }; - log::warn!("session {} using command {:?}", name, command); - match sessions.insert(name.to_string(), command) { + log::info!("session {} using command {:?} env {:?}", name, command, env); + match sessions.insert(name.to_string(), (command, env)) { Some(some) => { log::warn!("session {} overwrote old command {:?}", name, some); } @@ -368,7 +372,7 @@ fn request_command(socket: Arc>, request: Request) -> Command< #[derive(Clone)] pub struct Flags { user_datas: Vec, - sessions: HashMap>, + sessions: HashMap, Vec)>, layouts_opt: Option>, comp_config_handler: Option, fallback_background: widget::image::Handle, @@ -845,12 +849,12 @@ impl cosmic::Application for App { self.prompt_opt = None; self.error_opt = None; match self.flags.sessions.get(&self.selected_session).cloned() { - Some(cmd) => { + Some((cmd, env)) => { return request_command( socket, Request::StartSession { cmd, - env: Vec::new(), + env, }, ); }