aboutsummaryrefslogtreecommitdiff
path: root/src/dbus
diff options
context:
space:
mode:
Diffstat (limited to 'src/dbus')
-rw-r--r--src/dbus/mod.rs11
-rw-r--r--src/dbus/mutter_service_channel.rs25
2 files changed, 22 insertions, 14 deletions
diff --git a/src/dbus/mod.rs b/src/dbus/mod.rs
index f69dc1d9..09d973ad 100644
--- a/src/dbus/mod.rs
+++ b/src/dbus/mod.rs
@@ -45,7 +45,16 @@ impl DBusServers {
let mut dbus = Self::default();
if is_session_instance {
- let service_channel = ServiceChannel::new(niri.display_handle.clone());
+ let (to_niri, from_service_channel) = calloop::channel::channel();
+ let service_channel = ServiceChannel::new(to_niri);
+ niri.event_loop
+ .insert_source(from_service_channel, move |event, _, state| match event {
+ calloop::channel::Event::Msg(new_client) => {
+ state.niri.insert_client(new_client);
+ }
+ calloop::channel::Event::Closed => (),
+ })
+ .unwrap();
dbus.conn_service_channel = try_start(service_channel);
}
diff --git a/src/dbus/mutter_service_channel.rs b/src/dbus/mutter_service_channel.rs
index 6480aa1c..e226acb1 100644
--- a/src/dbus/mutter_service_channel.rs
+++ b/src/dbus/mutter_service_channel.rs
@@ -1,14 +1,12 @@
use std::os::unix::net::UnixStream;
-use std::sync::Arc;
-use smithay::reexports::wayland_server::DisplayHandle;
use zbus::{fdo, interface, zvariant};
use super::Start;
-use crate::niri::ClientState;
+use crate::niri::NewClient;
pub struct ServiceChannel {
- display: DisplayHandle,
+ to_niri: calloop::channel::Sender<NewClient>,
}
#[interface(name = "org.gnome.Mutter.ServiceChannel")]
@@ -24,23 +22,24 @@ impl ServiceChannel {
}
let (sock1, sock2) = UnixStream::pair().unwrap();
- let data = Arc::new(ClientState {
- compositor_state: Default::default(),
- // Would be nice to thread config here but for now it's fine.
- can_view_decoration_globals: false,
- primary_selection_disabled: false,
+ let client = NewClient {
+ client: sock2,
restricted: false,
// FIXME: maybe you can get the PID from D-Bus somehow?
credentials_unknown: true,
- });
- self.display.insert_client(sock2, data).unwrap();
+ };
+ if let Err(err) = self.to_niri.send(client) {
+ warn!("error sending message to niri: {err:?}");
+ return Err(fdo::Error::Failed("internal error".to_owned()));
+ }
+
Ok(zvariant::OwnedFd::from(std::os::fd::OwnedFd::from(sock1)))
}
}
impl ServiceChannel {
- pub fn new(display: DisplayHandle) -> Self {
- Self { display }
+ pub fn new(to_niri: calloop::channel::Sender<NewClient>) -> Self {
+ Self { to_niri }
}
}