From e5f4911bb69cd1795bb36469b17656d65a5beafb Mon Sep 17 00:00:00 2001 From: Victoria Brekenfeld Date: Tue, 24 Jan 2023 18:08:52 +0100 Subject: [PATCH] xwayland: Expose `DISPLAY` variable to clients --- src/input/mod.rs | 9 +++++++++ src/session.rs | 3 +++ src/systemd.rs | 13 +++++++++++-- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/input/mod.rs b/src/input/mod.rs index b777547e..20af5ac5 100644 --- a/src/input/mod.rs +++ b/src/input/mod.rs @@ -900,6 +900,15 @@ impl State { .arg("-c") .arg(command) .env("WAYLAND_DISPLAY", &self.common.socket) + .env( + "DISPLAY", + &self + .common + .xwayland_state + .values() + .find_map(|s| s.display.map(|v| format!(":{}", v))) + .unwrap_or(String::new()), + ) .env_remove("COSMIC_SESSION_SOCK") .spawn() { diff --git a/src/session.rs b/src/session.rs index 664a1f2c..91a32a44 100644 --- a/src/session.rs +++ b/src/session.rs @@ -77,6 +77,9 @@ pub fn setup_socket(handle: LoopHandle, state: &State) -> Result<()> { .into_string() .map_err(|_| anyhow!("wayland socket is no valid utf-8 string?"))?, ); + if let Some(display) = state.common.xwayland_state.values().find_map(|s| s.display) { + env.insert(String::from("DISPLAY"), format!(":{}", display)); + } let message = serde_json::to_string(&Message::SetEnv { variables: env }) .with_context(|| "Failed to encode environment variables into json")?; let bytes = message.into_bytes(); diff --git a/src/systemd.rs b/src/systemd.rs index 648ccc7b..b304ab9c 100644 --- a/src/systemd.rs +++ b/src/systemd.rs @@ -7,13 +7,22 @@ use std::process::Command; pub fn ready(state: &State) { if booted() { match Command::new("systemctl") - .args(["--user", "import-environment", "WAYLAND_DISPLAY"]) + .args(["--user", "import-environment", "WAYLAND_DISPLAY", "DISPLAY"]) .env("WAYLAND_DISPLAY", &state.common.socket) + .env( + "DISPLAY", + &state + .common + .xwayland_state + .values() + .find_map(|s| s.display.map(|v| format!(":{}", v))) + .unwrap_or(String::new()), + ) .status() { Ok(x) if x.success() => {} Ok(x) => slog_scope::warn!( - "Failed to import WAYLAND_DISPLAY into systemd (exit code {:?})", + "Failed to import WAYLAND_DISPLAY/DISPLAY into systemd (exit code {:?})", x.code() ), Err(err) => slog_scope::error!(