diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2025-01-27 07:55:32 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2025-01-27 08:06:33 +0300 |
| commit | ec43493522b82907943b4f5371d2c24d238f2c3c (patch) | |
| tree | 436fb0f54d3e5e9de6119a7391069c2b18e8c3ee /src/dbus | |
| parent | baa051891237054f2d4db86d7bcfe0f17440c35f (diff) | |
| download | niri-ec43493522b82907943b4f5371d2c24d238f2c3c.tar.gz niri-ec43493522b82907943b4f5371d2c24d238f2c3c.tar.bz2 niri-ec43493522b82907943b4f5371d2c24d238f2c3c.zip | |
Extract Niri::insert_client()
Diffstat (limited to 'src/dbus')
| -rw-r--r-- | src/dbus/mod.rs | 11 | ||||
| -rw-r--r-- | src/dbus/mutter_service_channel.rs | 25 |
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 } } } |
