diff --git a/src/compositor.rs b/src/compositor.rs index dd75f6cd..aba6f1f9 100644 --- a/src/compositor.rs +++ b/src/compositor.rs @@ -290,6 +290,8 @@ fn start_compositor2( use_wire_scale: Default::default(), wire_scale: Default::default(), windows: Default::default(), + client: Default::default(), + display: Default::default(), }, acceptor: Default::default(), serial: Default::default(), diff --git a/src/state.rs b/src/state.rs index 347858f2..bd3a4332 100644 --- a/src/state.rs +++ b/src/state.rs @@ -320,6 +320,8 @@ pub struct XWaylandState { pub use_wire_scale: Cell, pub wire_scale: Cell>, pub windows: CopyHashMap>, + pub client: CloneCell>>, + pub display: CloneCell>>, } pub struct IdleState { diff --git a/src/xwayland.rs b/src/xwayland.rs index fe96464a..a5deb612 100644 --- a/src/xwayland.rs +++ b/src/xwayland.rs @@ -114,9 +114,13 @@ pub async fn manage(state: Rc) { log::error!("Could not listen on the Xwayland socket: {}", ErrorFmt(e)); return; } - let display = format!(":{}", xsocket.id); + let display = Rc::new(format!(":{}", xsocket.id)); forker.setenv(DISPLAY.as_bytes(), display.as_bytes()); - let _unsetenv = on_drop(|| forker.unsetenv(DISPLAY.as_bytes())); + state.xwayland.display.set(Some(display.clone())); + let _unsetenv = on_drop(|| { + forker.unsetenv(DISPLAY.as_bytes()); + state.xwayland.display.take(); + }); log::info!("Allocated display :{} for Xwayland", xsocket.id); log::info!("Waiting for connection attempt"); if state.backend.get().import_environment() { @@ -207,8 +211,10 @@ async fn run( state.ring.readable(&Rc::new(dfdread)).await?; state.xwayland.queue.clear(); state.xwayland.pidfd.set(Some(pidfd.clone())); + state.xwayland.client.set(Some(client.clone())); let _remove_pidfd = on_drop(|| { state.xwayland.pidfd.take(); + state.xwayland.client.take(); }); { let shared = Rc::new(XwmShared::default());