Skip to content

Commit b8780b9

Browse files
committed
dbus: Add methods to show or hide
1 parent c9a69bd commit b8780b9

File tree

4 files changed

+66
-4
lines changed

4 files changed

+66
-4
lines changed

Cargo.lock

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ calloop-wayland-source = "0.4.1"
3636
aliasable = "0.1.3"
3737
futures-executor = { version = "0.3.31", features = ["thread-pool"] }
3838
zbus = "5.9.0"
39+
tokio-stream = { version = "0.1.17", features = ["sync"] }
3940

4041
[dependencies.i18n-embed]
4142
version = "0.16"

src/dbus.rs

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,73 @@
1-
struct CosmicWorkspaces;
1+
use cosmic::iced::{self, futures::StreamExt};
2+
use tokio::sync::broadcast;
3+
use tokio_stream::wrappers::BroadcastStream;
4+
5+
#[derive(Clone, Debug)]
6+
pub enum Event {
7+
Show,
8+
Hide,
9+
}
10+
11+
struct CosmicWorkspaces {
12+
event_sender: broadcast::Sender<Event>,
13+
}
214

315
#[zbus::interface(name = "com.system76.CosmicWorkspaces")]
416
impl CosmicWorkspaces {
17+
fn show(&self) {
18+
let _ = self.event_sender.send(Event::Show);
19+
}
20+
21+
fn hide(&self) {
22+
let _ = self.event_sender.send(Event::Hide);
23+
}
24+
525
#[zbus(signal)]
626
async fn shown(&self, _emitter: &zbus::object_server::SignalEmitter<'_>) -> zbus::Result<()>;
27+
728
#[zbus(signal)]
829
async fn hidden(&self, _emitter: &zbus::object_server::SignalEmitter<'_>) -> zbus::Result<()>;
930
}
1031

1132
#[derive(Clone, Debug)]
1233
pub struct Interface {
1334
emitter: zbus::object_server::SignalEmitter<'static>,
35+
event_sender: broadcast::Sender<Event>,
1436
}
1537

1638
impl Interface {
1739
pub async fn new(conn: zbus::Connection) -> zbus::Result<Self> {
40+
let event_sender = broadcast::Sender::new(8);
1841
conn.object_server()
19-
.at("/com/system76/CosmicWorkspaces", CosmicWorkspaces)
42+
.at(
43+
"/com/system76/CosmicWorkspaces",
44+
CosmicWorkspaces {
45+
event_sender: event_sender.clone(),
46+
},
47+
)
2048
.await?;
2149
Ok(Interface {
2250
emitter: zbus::object_server::SignalEmitter::new(
2351
&conn,
2452
"/com/system76/CosmicWorkspaces",
2553
)
2654
.unwrap(),
55+
event_sender,
2756
})
2857
}
2958

3059
pub async fn shown(&self) -> zbus::Result<()> {
31-
CosmicWorkspaces.shown(&self.emitter).await
60+
self.emitter.shown(&self.emitter).await
3261
}
3362

3463
pub async fn hidden(&self) -> zbus::Result<()> {
35-
CosmicWorkspaces.hidden(&self.emitter).await
64+
self.emitter.hidden(&self.emitter).await
65+
}
66+
67+
pub fn subscription(&self) -> iced::Subscription<Event> {
68+
iced::Subscription::run_with_id(
69+
"workspaces-dbus-sun",
70+
BroadcastStream::new(self.event_sender.subscribe()).filter_map(|x| async { x.ok() }),
71+
)
3672
}
3773
}

src/main.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ enum Msg {
116116
TogglePinned(ExtWorkspaceHandleV1),
117117
EnteredWorkspaceSidebarEntry(ExtWorkspaceHandleV1, bool),
118118
DbusInterface(zbus::Result<dbus::Interface>),
119+
DBus(dbus::Event),
119120
Ignore,
120121
}
121122

@@ -728,6 +729,12 @@ impl Application for App {
728729
self.dbus_interface = Some(interface);
729730
}
730731
}
732+
Msg::DBus(evt) => {
733+
return match evt {
734+
dbus::Event::Show => self.show(),
735+
dbus::Event::Hide => self.hide(),
736+
};
737+
}
731738
Msg::Ignore => {}
732739
}
733740

@@ -812,6 +819,9 @@ impl Application for App {
812819
if let Some(conn) = self.conn.clone() {
813820
subscriptions.push(backend::subscription(conn).map(Msg::Wayland));
814821
}
822+
if let Some(interface) = &self.dbus_interface {
823+
subscriptions.push(interface.subscription().map(Msg::DBus));
824+
}
815825
iced::Subscription::batch(subscriptions)
816826
}
817827

0 commit comments

Comments
 (0)