//! D-Bus-Relay für die GNOME-Extension: Show()/Hide() steuern das //! Popup-Fenster. Die Extension ruft Show() beim Panel-Klick und positioniert //! das Fenster selbst (Anchor::Managed) — unter Wayland darf nur der //! Compositor fremde Fenster platzieren. use crate::platform::{Anchor, TrayCallbacks}; struct PopupService { app: tauri::AppHandle, cb: TrayCallbacks, } #[zbus::interface(name = "com.aicontrol.Popup1")] impl PopupService { fn show(&self) { (self.cb.show)(&self.app, Anchor::Managed); } fn hide(&self) { (self.cb.hide)(&self.app); } } /// Hält den D-Bus-Namen com.aicontrol.Popup, solange die App läuft — die /// Extension zeigt ihren Panel-Button nur, wenn der Name präsent ist. pub(super) fn spawn_dbus_service(app: tauri::AppHandle, cb: TrayCallbacks) { std::thread::spawn(move || { let serve = move || -> zbus::Result<()> { let _conn = zbus::blocking::connection::Builder::session()? .name("com.aicontrol.Popup")? .serve_at("/com/aicontrol/Popup", PopupService { app, cb })? .build()?; loop { std::thread::park(); } }; if let Err(e) = serve() { eprintln!("D-Bus-Popup-Dienst: {e}"); } }); }