diff --git a/data/cosmic.portal b/data/cosmic.portal index 01bdd79..123564c 100644 --- a/data/cosmic.portal +++ b/data/cosmic.portal @@ -1,4 +1,4 @@ [portal] DBusName=org.freedesktop.impl.portal.desktop.cosmic -Interfaces=org.freedesktop.impl.portal.Access;org.freedesktop.impl.portal.FileChooser;org.freedesktop.impl.portal.Screenshot;org.freedesktop.impl.portal.Settings;org.freedesktop.impl.portal.ScreenCast +Interfaces=org.freedesktop.impl.portal.Access;org.freedesktop.impl.portal.FileChooser;org.freedesktop.impl.portal.RemoteDesktop;org.freedesktop.impl.portal.Screenshot;org.freedesktop.impl.portal.Settings;org.freedesktop.impl.portal.ScreenCast UseIn=COSMIC diff --git a/src/main.rs b/src/main.rs index 167375f..8553879 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,6 +11,7 @@ mod buffer; mod documents; mod file_chooser; mod localize; +mod remote_desktop; mod screencast; mod screencast_dialog; mod screencast_thread; diff --git a/src/remote_desktop.rs b/src/remote_desktop.rs new file mode 100644 index 0000000..061ef0f --- /dev/null +++ b/src/remote_desktop.rs @@ -0,0 +1,115 @@ +use crate::{PortalResponse, Session}; +use std::{ + collections::HashMap, + env, + os::{fd::OwnedFd, unix::net::UnixStream}, +}; +use zbus::zvariant; + +#[derive(zvariant::SerializeDict, zvariant::Type)] +#[zvariant(signature = "a{sv}")] +struct CreateSessionResult { + session_id: String, +} + +#[derive(zvariant::DeserializeDict, zvariant::Type)] +#[zvariant(signature = "a{sv}")] +struct SelectDevicesOptions { + // Default: all + types: Option, + restore_data: Option<(String, u32, zvariant::OwnedValue)>, + // Default: 0 + persist_mode: Option, +} + +#[derive(zvariant::SerializeDict, zvariant::Type)] +#[zvariant(signature = "a{sv}")] +struct StartResult { + devices: u32, + clipboard_enabled: bool, + streams: Vec<(u32, HashMap)>, +} + +struct SessionData {} + +pub struct RemoteDesktop; + +#[zbus::interface(name = "org.freedesktop.impl.portal.RemoteDesktop")] +impl RemoteDesktop { + async fn create_session( + &self, + #[zbus(connection)] connection: &zbus::Connection, + handle: zvariant::ObjectPath<'_>, + session_handle: zvariant::ObjectPath<'_>, + app_id: String, + options: HashMap, + ) -> PortalResponse { + connection + .object_server() + .at(&session_handle, Session::new(SessionData {}, |_| {})) + .await + .unwrap(); // XXX unwrap + PortalResponse::Success(CreateSessionResult { + session_id: "foo".to_string(), // XXX + }) + } + + // CreateSession + async fn select_devices( + &self, + #[zbus(connection)] connection: &zbus::Connection, + handle: zvariant::ObjectPath<'_>, + session_handle: zvariant::ObjectPath<'_>, + app_id: String, + options: SelectDevicesOptions, // XXX + ) -> PortalResponse> { + PortalResponse::Success(HashMap::new()) + } + + async fn start( + &self, + #[zbus(connection)] connection: &zbus::Connection, + handle: zvariant::ObjectPath<'_>, + session_handle: zvariant::ObjectPath<'_>, + app_id: String, + parent_window: String, + options: HashMap, + ) -> PortalResponse { + PortalResponse::Success(StartResult { + devices: 7, + clipboard_enabled: false, + streams: Vec::new(), + }) + } + + async fn connect_to_EIS( + &self, + #[zbus(connection)] connection: &zbus::Connection, + session_handle: zvariant::ObjectPath<'_>, + app_id: String, + options: HashMap, + ) -> zvariant::Fd { + println!("Connect"); + // TODO Dedicated mechanism to get fd, for specific "devices" + if let Ok(path) = env::var("LIBEI_SOCKET") { + if let Ok(socket) = UnixStream::connect(path) { + return OwnedFd::from(socket).into(); + } + } + + todo!() + //PortalResponse::Other + } + + // TODO: Notify* + + #[zbus(property)] + async fn available_device_types(&self) -> u32 { + 7 // XXX + } + + #[zbus(property, name = "version")] + async fn version(&self) -> u32 { + 2 + } +} diff --git a/src/subscription.rs b/src/subscription.rs index a62313b..58c6c72 100644 --- a/src/subscription.rs +++ b/src/subscription.rs @@ -8,9 +8,9 @@ use tokio::sync::mpsc::Receiver; use zbus::{zvariant, Connection}; use crate::{ - access::Access, config, file_chooser::FileChooser, screencast::ScreenCast, - screenshot::Screenshot, wayland, ColorScheme, Contrast, Settings, ACCENT_COLOR_KEY, - APPEARANCE_NAMESPACE, COLOR_SCHEME_KEY, CONTRAST_KEY, DBUS_NAME, DBUS_PATH, + access::Access, config, file_chooser::FileChooser, remote_desktop::RemoteDesktop, + screencast::ScreenCast, screenshot::Screenshot, wayland, ColorScheme, Contrast, Settings, + ACCENT_COLOR_KEY, APPEARANCE_NAMESPACE, COLOR_SCHEME_KEY, CONTRAST_KEY, DBUS_NAME, DBUS_PATH, }; #[derive(Clone, Debug)] @@ -78,6 +78,7 @@ pub(crate) async fn process_changes( .name(DBUS_NAME)? .serve_at(DBUS_PATH, Access::new(wayland_helper.clone(), tx.clone()))? .serve_at(DBUS_PATH, FileChooser::new(tx.clone()))? + .serve_at(DBUS_PATH, RemoteDesktop)? .serve_at( DBUS_PATH, Screenshot::new(wayland_helper.clone(), tx.clone()),