diff --git a/qemu-display/src/display.rs b/qemu-display/src/display.rs index c97360d..b3d2c8b 100644 --- a/qemu-display/src/display.rs +++ b/qemu-display/src/display.rs @@ -209,6 +209,10 @@ impl<'d> Display<'d> { .await } + pub fn inner_proxy(&self) -> &zbus::Proxy<'d> { + self.inner.proxy.inner() + } + pub async fn receive_owner_changed(&self) -> Result> { Ok(self.inner.proxy.inner().receive_owner_changed().await?) } diff --git a/qemu-rdp/Cargo.toml b/qemu-rdp/Cargo.toml index e0528d6..49a700c 100644 --- a/qemu-rdp/Cargo.toml +++ b/qemu-rdp/Cargo.toml @@ -25,3 +25,4 @@ ironrdp = { git = "https://github.com/Devolutions/IronRDP", features = [ "displaycontrol", "rdpsnd" ] } +futures-util = "0.3" diff --git a/qemu-rdp/src/server/mod.rs b/qemu-rdp/src/server/mod.rs index 9b5990b..0ff16dd 100644 --- a/qemu-rdp/src/server/mod.rs +++ b/qemu-rdp/src/server/mod.rs @@ -4,7 +4,10 @@ mod input; mod sound; use anyhow::{anyhow, Context, Error}; -use ironrdp::server::tokio_rustls::{rustls, TlsAcceptor}; +use ironrdp::server::{ + tokio_rustls::{rustls, TlsAcceptor}, + ServerEvent, +}; use qemu_display::{zbus, Display}; use rustls_pemfile::{certs, pkcs8_private_keys}; @@ -61,6 +64,16 @@ impl Server { .with_sound_factory(sound.map(|h| Box::new(h) as _)) .build(); + let ev = server.event_sender().clone(); + let proxy = dbus_display.inner_proxy().clone(); + tokio::spawn(async move { + use futures_util::StreamExt; + + let mut owner_changed = proxy.receive_owner_changed().await.unwrap(); + let _ = owner_changed.next().await; + ev.send(ServerEvent::Quit("org.qemu is gone".to_owned())) + .unwrap(); + }); server.run().await } }