Skip to content

Commit

Permalink
Add remote desktop persistence and session restore. (#201)
Browse files Browse the repository at this point in the history
* Add remote desktop persistence and session restore.

* Removed duplicated PersistMode.

* Update src/desktop/mod.rs

Co-authored-by: Bilal Elmoussaoui <[email protected]>

* Update src/desktop/mod.rs

Co-authored-by: Bilal Elmoussaoui <[email protected]>

* Remove re-exported PersistMode in Screencast.

* Removed re-export of PersistMode properly.

* Run cargo fmt.

---------

Co-authored-by: Bilal Elmoussaoui <[email protected]>
  • Loading branch information
Adamskye and bilelmoussaoui authored Mar 21, 2024
1 parent 58d7e61 commit aad9ec1
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 27 deletions.
21 changes: 21 additions & 0 deletions src/desktop/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,24 @@ pub mod secret;
pub mod settings;
pub mod trash;
pub mod wallpaper;

#[cfg_attr(feature = "glib", derive(glib::Enum))]
#[cfg_attr(feature = "glib", enum_type(name = "AshpdPersistMode"))]
#[derive(
Default, serde_repr::Serialize_repr, PartialEq, Eq, Debug, Copy, Clone, zbus::zvariant::Type,
)]
#[doc(alias = "XdpPersistMode")]
#[repr(u32)]
/// Persistence mode for a screencast or remote desktop session.
pub enum PersistMode {
#[doc(alias = "XDP_PERSIST_MODE_NONE")]
#[default]
/// Do not persist.
DoNot = 0,
#[doc(alias = "XDP_PERSIST_MODE_TRANSIENT")]
/// Persist while the application is running.
Application = 1,
#[doc(alias = "XDP_PERSIST_MODE_PERSISTENT")]
/// Persist until explicitly revoked.
ExplicitlyRevoked = 2,
}
49 changes: 43 additions & 6 deletions src/desktop/remote_desktop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,23 @@
//!
//! ```rust,no_run
//! use ashpd::{
//! desktop::remote_desktop::{DeviceType, KeyState, RemoteDesktop},
//! desktop::{
//! remote_desktop::{DeviceType, KeyState, RemoteDesktop},
//! PersistMode,
//! },
//! WindowIdentifier,
//! };
//!
//! async fn run() -> ashpd::Result<()> {
//! let proxy = RemoteDesktop::new().await?;
//! let session = proxy.create_session().await?;
//! proxy
//! .select_devices(&session, DeviceType::Keyboard | DeviceType::Pointer)
//! .select_devices(
//! &session,
//! DeviceType::Keyboard | DeviceType::Pointer,
//! None,
//! PersistMode::DoNot
//! )
//! .await?;
//!
//! let response = proxy
Expand Down Expand Up @@ -38,7 +46,8 @@
//! use ashpd::{
//! desktop::{
//! remote_desktop::{DeviceType, KeyState, RemoteDesktop},
//! screencast::{CursorMode, PersistMode, Screencast, SourceType},
//! screencast::{CursorMode, Screencast, SourceType},
//! PersistMode,
//! },
//! WindowIdentifier,
//! };
Expand All @@ -50,7 +59,12 @@
//! let session = remote_desktop.create_session().await?;
//!
//! remote_desktop
//! .select_devices(&session, DeviceType::Keyboard | DeviceType::Pointer)
//! .select_devices(
//! &session,
//! DeviceType::Keyboard | DeviceType::Pointer,
//! None,
//! PersistMode::DoNot,
//! )
//! .await?;
//! screencast
//! .select_sources(
Expand Down Expand Up @@ -88,7 +102,7 @@ use futures_util::TryFutureExt;
use serde_repr::{Deserialize_repr, Serialize_repr};
use zbus::zvariant::{self, DeserializeDict, SerializeDict, Type, Value};

use super::{screencast::Stream, HandleToken, Request, Session};
use super::{screencast::Stream, HandleToken, PersistMode, Request, Session};
use crate::{proxy::Proxy, Error, WindowIdentifier};

#[cfg_attr(feature = "glib", derive(glib::Enum))]
Expand Down Expand Up @@ -166,6 +180,8 @@ struct SelectDevicesOptions {
handle_token: HandleToken,
/// The device types to request remote controlling of. Default is all.
types: Option<BitFlags<DeviceType>>,
restore_token: Option<String>,
persist_mode: Option<PersistMode>,
}

impl SelectDevicesOptions {
Expand All @@ -174,6 +190,16 @@ impl SelectDevicesOptions {
self.types = types.into();
self
}

pub fn persist_mode(mut self, persist_mode: impl Into<Option<PersistMode>>) -> Self {
self.persist_mode = persist_mode.into();
self
}

pub fn restore_token<'a>(mut self, token: impl Into<Option<&'a str>>) -> Self {
self.restore_token = token.into().map(ToOwned::to_owned);
self
}
}

#[derive(SerializeDict, Type, Debug, Default)]
Expand All @@ -190,6 +216,7 @@ struct StartRemoteOptions {
pub struct SelectedDevices {
devices: BitFlags<DeviceType>,
streams: Option<Vec<Stream>>,
restore_token: Option<String>,
}

impl SelectedDevices {
Expand All @@ -202,6 +229,11 @@ impl SelectedDevices {
pub fn streams(&self) -> Option<&[Stream]> {
self.streams.as_deref()
}

/// The session restore token.
pub fn restore_token(&self) -> Option<&str> {
self.restore_token.as_deref()
}
}

/// The interface lets sandboxed applications create remote desktop sessions.
Expand Down Expand Up @@ -255,8 +287,13 @@ impl<'a> RemoteDesktop<'a> {
&self,
session: &Session<'_>,
types: BitFlags<DeviceType>,
restore_token: Option<&str>,
persist_mode: PersistMode,
) -> Result<Request<()>, Error> {
let options = SelectDevicesOptions::default().types(types);
let options = SelectDevicesOptions::default()
.types(types)
.persist_mode(persist_mode)
.restore_token(restore_token);
self.0
.empty_request(&options.handle_token, "SelectDevices", &(session, &options))
.await
Expand Down
26 changes: 5 additions & 21 deletions src/desktop/screencast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@
//!
//! ```rust,no_run
//! use ashpd::{
//! desktop::screencast::{CursorMode, PersistMode, Screencast, SourceType},
//! desktop::{
//! screencast::{CursorMode, Screencast, SourceType},
//! PersistMode,
//! },
//! WindowIdentifier,
//! };
//!
Expand Down Expand Up @@ -46,7 +49,7 @@ use serde::Deserialize;
use serde_repr::{Deserialize_repr, Serialize_repr};
use zbus::zvariant::{self, DeserializeDict, SerializeDict, Type, Value};

use super::{HandleToken, Request, Session};
use super::{HandleToken, PersistMode, Request, Session};
use crate::{proxy::Proxy, Error, WindowIdentifier};

#[bitflags]
Expand Down Expand Up @@ -84,25 +87,6 @@ pub enum CursorMode {
Metadata,
}

#[cfg_attr(feature = "glib", derive(glib::Enum))]
#[cfg_attr(feature = "glib", enum_type(name = "AshpdPersistMode"))]
#[derive(Default, Serialize_repr, PartialEq, Eq, Debug, Copy, Clone, Type)]
#[doc(alias = "XdpPersistMode")]
#[repr(u32)]
/// Persistence mode for a screencast session.
pub enum PersistMode {
#[doc(alias = "XDP_PERSIST_MODE_NONE")]
#[default]
/// Do not persist.
DoNot = 0,
#[doc(alias = "XDP_PERSIST_MODE_TRANSIENT")]
/// Persist while the application is running.
Application = 1,
#[doc(alias = "XDP_PERSIST_MODE_PERSISTENT")]
/// Persist until explicitly revoked.
ExplicitlyRevoked = 2,
}

#[derive(SerializeDict, Type, Debug, Default)]
/// Specified options for a [`Screencast::create_session`] request.
#[zvariant(signature = "dict")]
Expand Down

0 comments on commit aad9ec1

Please sign in to comment.