dbus: Add methods to show or hide

This commit is contained in:
Ian Douglas Scott 2025-09-22 11:49:06 -07:00 committed by Ian Douglas Scott
parent c9a69bdfdb
commit b8780b9911
4 changed files with 66 additions and 4 deletions

15
Cargo.lock generated
View file

@ -1263,6 +1263,7 @@ dependencies = [
"rust-embed", "rust-embed",
"rustix 1.1.2", "rustix 1.1.2",
"tokio", "tokio",
"tokio-stream",
"wayland-protocols", "wayland-protocols",
"zbus 5.11.0", "zbus 5.11.0",
] ]
@ -5492,6 +5493,20 @@ dependencies = [
"futures-core", "futures-core",
"pin-project-lite", "pin-project-lite",
"tokio", "tokio",
"tokio-util",
]
[[package]]
name = "tokio-util"
version = "0.7.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5"
dependencies = [
"bytes",
"futures-core",
"futures-sink",
"pin-project-lite",
"tokio",
] ]
[[package]] [[package]]

View file

@ -36,6 +36,7 @@ calloop-wayland-source = "0.4.1"
aliasable = "0.1.3" aliasable = "0.1.3"
futures-executor = { version = "0.3.31", features = ["thread-pool"] } futures-executor = { version = "0.3.31", features = ["thread-pool"] }
zbus = "5.9.0" zbus = "5.9.0"
tokio-stream = { version = "0.1.17", features = ["sync"] }
[dependencies.i18n-embed] [dependencies.i18n-embed]
version = "0.16" version = "0.16"

View file

@ -1,9 +1,30 @@
struct CosmicWorkspaces; use cosmic::iced::{self, futures::StreamExt};
use tokio::sync::broadcast;
use tokio_stream::wrappers::BroadcastStream;
#[derive(Clone, Debug)]
pub enum Event {
Show,
Hide,
}
struct CosmicWorkspaces {
event_sender: broadcast::Sender<Event>,
}
#[zbus::interface(name = "com.system76.CosmicWorkspaces")] #[zbus::interface(name = "com.system76.CosmicWorkspaces")]
impl CosmicWorkspaces { impl CosmicWorkspaces {
fn show(&self) {
let _ = self.event_sender.send(Event::Show);
}
fn hide(&self) {
let _ = self.event_sender.send(Event::Hide);
}
#[zbus(signal)] #[zbus(signal)]
async fn shown(&self, _emitter: &zbus::object_server::SignalEmitter<'_>) -> zbus::Result<()>; async fn shown(&self, _emitter: &zbus::object_server::SignalEmitter<'_>) -> zbus::Result<()>;
#[zbus(signal)] #[zbus(signal)]
async fn hidden(&self, _emitter: &zbus::object_server::SignalEmitter<'_>) -> zbus::Result<()>; async fn hidden(&self, _emitter: &zbus::object_server::SignalEmitter<'_>) -> zbus::Result<()>;
} }
@ -11,12 +32,19 @@ impl CosmicWorkspaces {
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct Interface { pub struct Interface {
emitter: zbus::object_server::SignalEmitter<'static>, emitter: zbus::object_server::SignalEmitter<'static>,
event_sender: broadcast::Sender<Event>,
} }
impl Interface { impl Interface {
pub async fn new(conn: zbus::Connection) -> zbus::Result<Self> { pub async fn new(conn: zbus::Connection) -> zbus::Result<Self> {
let event_sender = broadcast::Sender::new(8);
conn.object_server() conn.object_server()
.at("/com/system76/CosmicWorkspaces", CosmicWorkspaces) .at(
"/com/system76/CosmicWorkspaces",
CosmicWorkspaces {
event_sender: event_sender.clone(),
},
)
.await?; .await?;
Ok(Interface { Ok(Interface {
emitter: zbus::object_server::SignalEmitter::new( emitter: zbus::object_server::SignalEmitter::new(
@ -24,14 +52,22 @@ impl Interface {
"/com/system76/CosmicWorkspaces", "/com/system76/CosmicWorkspaces",
) )
.unwrap(), .unwrap(),
event_sender,
}) })
} }
pub async fn shown(&self) -> zbus::Result<()> { pub async fn shown(&self) -> zbus::Result<()> {
CosmicWorkspaces.shown(&self.emitter).await self.emitter.shown(&self.emitter).await
} }
pub async fn hidden(&self) -> zbus::Result<()> { pub async fn hidden(&self) -> zbus::Result<()> {
CosmicWorkspaces.hidden(&self.emitter).await self.emitter.hidden(&self.emitter).await
}
pub fn subscription(&self) -> iced::Subscription<Event> {
iced::Subscription::run_with_id(
"workspaces-dbus-sun",
BroadcastStream::new(self.event_sender.subscribe()).filter_map(|x| async { x.ok() }),
)
} }
} }

View file

@ -116,6 +116,7 @@ enum Msg {
TogglePinned(ExtWorkspaceHandleV1), TogglePinned(ExtWorkspaceHandleV1),
EnteredWorkspaceSidebarEntry(ExtWorkspaceHandleV1, bool), EnteredWorkspaceSidebarEntry(ExtWorkspaceHandleV1, bool),
DbusInterface(zbus::Result<dbus::Interface>), DbusInterface(zbus::Result<dbus::Interface>),
DBus(dbus::Event),
Ignore, Ignore,
} }
@ -728,6 +729,12 @@ impl Application for App {
self.dbus_interface = Some(interface); self.dbus_interface = Some(interface);
} }
} }
Msg::DBus(evt) => {
return match evt {
dbus::Event::Show => self.show(),
dbus::Event::Hide => self.hide(),
};
}
Msg::Ignore => {} Msg::Ignore => {}
} }
@ -812,6 +819,9 @@ impl Application for App {
if let Some(conn) = self.conn.clone() { if let Some(conn) = self.conn.clone() {
subscriptions.push(backend::subscription(conn).map(Msg::Wayland)); subscriptions.push(backend::subscription(conn).map(Msg::Wayland));
} }
if let Some(interface) = &self.dbus_interface {
subscriptions.push(interface.subscription().map(Msg::DBus));
}
iced::Subscription::batch(subscriptions) iced::Subscription::batch(subscriptions)
} }