From 02f37c8573afb8cce9f38e8d4a809ea58ca3eae8 Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Tue, 10 Oct 2023 09:55:44 +0400 Subject: Extract dbus server startup --- src/niri.rs | 137 +++++------------------------------------------------------- 1 file changed, 11 insertions(+), 126 deletions(-) (limited to 'src/niri.rs') diff --git a/src/niri.rs b/src/niri.rs index ad5973e7..5d121b07 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -36,7 +36,7 @@ use smithay::output::Output; use smithay::reexports::calloop::generic::Generic; use smithay::reexports::calloop::timer::{TimeoutAction, Timer}; use smithay::reexports::calloop::{ - self, Idle, Interest, LoopHandle, LoopSignal, Mode, PostAction, RegistrationToken, + Idle, Interest, LoopHandle, LoopSignal, Mode, PostAction, RegistrationToken, }; use smithay::reexports::nix::libc::CLOCK_MONOTONIC; use smithay::reexports::wayland_protocols::xdg::shell::server::xdg_toplevel::WmCapabilities; @@ -70,16 +70,14 @@ use smithay::wayland::socket::ListeningSocketSource; use smithay::wayland::tablet_manager::TabletManagerState; use smithay::wayland::text_input::TextInputManagerState; use smithay::wayland::virtual_keyboard::VirtualKeyboardManagerState; -use zbus::fdo::RequestNameFlags; use crate::backend::{Backend, Tty, Winit}; use crate::config::Config; use crate::cursor::Cursor; -use crate::dbus::gnome_shell_screenshot::{self, NiriToScreenshot, ScreenshotToNiri}; -use crate::dbus::mutter_display_config::DisplayConfig; +use crate::dbus::gnome_shell_screenshot::{NiriToScreenshot, ScreenshotToNiri}; #[cfg(feature = "xdp-gnome-screencast")] -use crate::dbus::mutter_screen_cast::{self, ScreenCast, ScreenCastToNiri}; -use crate::dbus::mutter_service_channel::ServiceChannel; +use crate::dbus::mutter_screen_cast::{self, ScreenCastToNiri}; +use crate::dbus::DBusServers; use crate::frame_clock::FrameClock; use crate::layout::{output_size, Layout, MonitorRenderElement}; use crate::pw_utils::{Cast, PipeWire}; @@ -136,7 +134,7 @@ pub struct Niri { pub cursor_image: CursorImageStatus, pub dnd_icon: Option, - pub zbus_conn: Option, + pub dbus: Option, pub inhibit_power_key_fd: Option, // Casts are dropped before PipeWire to prevent a double-free (yay). @@ -308,9 +306,9 @@ impl State { } #[cfg(feature = "xdp-gnome-screencast")] - fn on_screen_cast_msg( + pub fn on_screen_cast_msg( &mut self, - to_niri: &calloop::channel::Sender, + to_niri: &smithay::reexports::calloop::channel::Sender, msg: ScreenCastToNiri, ) { match msg { @@ -354,7 +352,7 @@ impl State { } } - fn on_screen_shot_msg( + pub fn on_screen_shot_msg( &mut self, to_screenshot: &async_channel::Sender, msg: ScreenshotToNiri, @@ -535,127 +533,13 @@ impl Niri { cursor_image: CursorImageStatus::default_named(), dnd_icon: None, - zbus_conn: None, + dbus: None, inhibit_power_key_fd: None, pipewire, casts: vec![], } } - pub fn start_dbus(&mut self, backend: &Backend, is_session_instance: bool) { - let config = self.config.borrow(); - - #[cfg(feature = "xdp-gnome-screencast")] - let (to_niri, from_screen_cast) = calloop::channel::channel(); - #[cfg(feature = "xdp-gnome-screencast")] - self.event_loop - .insert_source(from_screen_cast, { - let to_niri = to_niri.clone(); - move |event, _, state| match event { - calloop::channel::Event::Msg(msg) => state.on_screen_cast_msg(&to_niri, msg), - calloop::channel::Event::Closed => (), - } - }) - .unwrap(); - #[cfg(feature = "xdp-gnome-screencast")] - let screen_cast = ScreenCast::new(backend.connectors(), to_niri); - - let (to_niri, from_screenshot) = calloop::channel::channel(); - let (to_screenshot, from_niri) = async_channel::unbounded(); - self.event_loop - .insert_source(from_screenshot, move |event, _, state| match event { - calloop::channel::Event::Msg(msg) => state.on_screen_shot_msg(&to_screenshot, msg), - calloop::channel::Event::Closed => (), - }) - .unwrap(); - let screenshot = gnome_shell_screenshot::Screenshot::new(to_niri, from_niri); - - let mut zbus_conn = None; - if is_session_instance { - let conn = zbus::blocking::ConnectionBuilder::session() - .unwrap() - .name("org.gnome.Mutter.ServiceChannel") - .unwrap() - .serve_at( - "/org/gnome/Mutter/ServiceChannel", - ServiceChannel::new(self.display_handle.clone()), - ) - .unwrap() - .build() - .unwrap(); - - { - let server = conn.object_server(); - let flags = RequestNameFlags::AllowReplacement - | RequestNameFlags::ReplaceExisting - | RequestNameFlags::DoNotQueue; - - server - .at("/org/gnome/Shell/Screenshot", screenshot) - .unwrap(); - conn.request_name_with_flags("org.gnome.Shell.Screenshot", flags) - .unwrap(); - - server - .at( - "/org/gnome/Mutter/DisplayConfig", - DisplayConfig::new(backend.connectors()), - ) - .unwrap(); - conn.request_name_with_flags("org.gnome.Mutter.DisplayConfig", flags) - .unwrap(); - - #[cfg(feature = "xdp-gnome-screencast")] - if self.pipewire.is_some() { - server - .at("/org/gnome/Mutter/ScreenCast", screen_cast.clone()) - .unwrap(); - conn.request_name_with_flags("org.gnome.Mutter.ScreenCast", flags) - .unwrap(); - } - } - - zbus_conn = Some(conn); - } else if config.debug.dbus_interfaces_in_non_session_instances { - let conn = zbus::blocking::Connection::session().unwrap(); - let flags = RequestNameFlags::AllowReplacement - | RequestNameFlags::ReplaceExisting - | RequestNameFlags::DoNotQueue; - - { - let server = conn.object_server(); - - server - .at("/org/gnome/Shell/Screenshot", screenshot) - .unwrap(); - conn.request_name_with_flags("org.gnome.Shell.Screenshot", flags) - .unwrap(); - - server - .at( - "/org/gnome/Mutter/DisplayConfig", - DisplayConfig::new(backend.connectors()), - ) - .unwrap(); - conn.request_name_with_flags("org.gnome.Mutter.DisplayConfig", flags) - .unwrap(); - - #[cfg(feature = "xdp-gnome-screencast")] - if self.pipewire.is_some() { - server - .at("/org/gnome/Mutter/ScreenCast", screen_cast.clone()) - .unwrap(); - conn.request_name_with_flags("org.gnome.Mutter.ScreenCast", flags) - .unwrap(); - } - } - - zbus_conn = Some(conn); - } - - self.zbus_conn = zbus_conn; - } - pub fn inhibit_power_key(&mut self) -> anyhow::Result<()> { let conn = zbus::blocking::ConnectionBuilder::system()?.build()?; @@ -1580,7 +1464,8 @@ impl Niri { } } - let server = self.zbus_conn.as_ref().unwrap().object_server(); + let dbus = &self.dbus.as_ref().unwrap(); + let server = dbus.conn_screen_cast.as_ref().unwrap().object_server(); let path = format!("/org/gnome/Mutter/ScreenCast/Session/u{}", session_id); if let Ok(iface) = server.interface::<_, mutter_screen_cast::Session>(path) { let _span = tracy_client::span!("invoking Session::stop"); -- cgit