use std::fmt::Debug;
use serde::{Deserialize, Serialize};
use zbus::zvariant::{
Optional, Type,
as_value::{self, optional},
};
use super::{HandleToken, Request};
use crate::{Error, Uri, WindowIdentifier, desktop::Color, proxy::Proxy};
#[derive(Serialize, Deserialize, Type, Debug, Default)]
#[zvariant(signature = "dict")]
pub struct ScreenshotOptions {
#[serde(with = "as_value", skip_deserializing)]
handle_token: HandleToken,
#[serde(default, with = "optional", skip_serializing_if = "Option::is_none")]
modal: Option<bool>,
#[serde(default, with = "optional", skip_serializing_if = "Option::is_none")]
interactive: Option<bool>,
#[serde(default, with = "optional", skip_serializing)]
#[cfg_attr(not(feature = "backend"), allow(dead_code))]
permission_store_checked: Option<bool>,
}
impl ScreenshotOptions {
#[must_use]
pub fn set_modal(mut self, modal: impl Into<Option<bool>>) -> Self {
self.modal = modal.into();
self
}
#[cfg(feature = "backend")]
pub fn modal(&self) -> Option<bool> {
self.modal
}
#[must_use]
pub fn set_interactive(mut self, interactive: impl Into<Option<bool>>) -> Self {
self.interactive = interactive.into();
self
}
#[cfg(feature = "backend")]
pub fn interactive(&self) -> Option<bool> {
self.interactive
}
#[cfg(feature = "backend")]
pub fn permission_store_checked(&self) -> Option<bool> {
self.permission_store_checked
}
}
#[derive(Serialize, Deserialize, Type)]
#[zvariant(signature = "dict")]
pub struct Screenshot {
#[serde(with = "as_value")]
uri: Uri,
}
impl Screenshot {
#[cfg(feature = "backend")]
#[cfg_attr(docsrs, doc(cfg(feature = "backend")))]
pub fn new(uri: Uri) -> Self {
Self { uri }
}
pub fn request() -> ScreenshotRequest {
ScreenshotRequest::default()
}
pub fn uri(&self) -> &Uri {
&self.uri
}
}
impl Debug for Screenshot {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.uri.as_str())
}
}
#[derive(Serialize, Deserialize, Type, Debug, Default)]
#[zvariant(signature = "dict")]
pub struct ColorOptions {
#[serde(with = "as_value", skip_deserializing)]
handle_token: HandleToken,
}
#[derive(Debug)]
#[doc(alias = "org.freedesktop.portal.Screenshot")]
pub struct ScreenshotProxy(Proxy<'static>);
impl ScreenshotProxy {
pub async fn new() -> Result<Self, Error> {
let proxy = Proxy::new_desktop("org.freedesktop.portal.Screenshot").await?;
Ok(Self(proxy))
}
pub async fn with_connection(connection: zbus::Connection) -> Result<Self, Error> {
let proxy =
Proxy::new_desktop_with_connection(connection, "org.freedesktop.portal.Screenshot")
.await?;
Ok(Self(proxy))
}
pub fn version(&self) -> u32 {
self.0.version()
}
#[doc(alias = "PickColor")]
#[doc(alias = "xdp_portal_pick_color")]
pub async fn pick_color(
&self,
identifier: Option<&WindowIdentifier>,
options: ColorOptions,
) -> Result<Request<Color>, Error> {
let identifier = Optional::from(identifier);
self.0
.request(&options.handle_token, "PickColor", &(identifier, &options))
.await
}
#[doc(alias = "Screenshot")]
#[doc(alias = "xdp_portal_take_screenshot")]
pub async fn screenshot(
&self,
identifier: Option<&WindowIdentifier>,
options: ScreenshotOptions,
) -> Result<Request<Screenshot>, Error> {
let identifier = Optional::from(identifier);
self.0
.request(&options.handle_token, "Screenshot", &(identifier, &options))
.await
}
}
impl std::ops::Deref for ScreenshotProxy {
type Target = zbus::Proxy<'static>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
#[derive(Debug, Default)]
#[doc(alias = "xdp_portal_pick_color")]
pub struct ColorRequest {
identifier: Option<WindowIdentifier>,
options: ColorOptions,
connection: Option<zbus::Connection>,
}
impl ColorRequest {
#[must_use]
pub fn identifier(mut self, identifier: impl Into<Option<WindowIdentifier>>) -> Self {
self.identifier = identifier.into();
self
}
#[must_use]
pub fn connection(mut self, connection: Option<zbus::Connection>) -> Self {
self.connection = connection;
self
}
pub async fn send(self) -> Result<Request<Color>, Error> {
let proxy = if let Some(connection) = self.connection {
ScreenshotProxy::with_connection(connection).await?
} else {
ScreenshotProxy::new().await?
};
proxy
.pick_color(self.identifier.as_ref(), self.options)
.await
}
}
impl Color {
pub fn pick() -> ColorRequest {
ColorRequest::default()
}
}
#[derive(Debug, Default)]
#[doc(alias = "xdp_portal_take_screenshot")]
pub struct ScreenshotRequest {
options: ScreenshotOptions,
identifier: Option<WindowIdentifier>,
connection: Option<zbus::Connection>,
}
impl ScreenshotRequest {
#[must_use]
pub fn identifier(mut self, identifier: impl Into<Option<WindowIdentifier>>) -> Self {
self.identifier = identifier.into();
self
}
#[must_use]
pub fn modal(mut self, modal: impl Into<Option<bool>>) -> Self {
self.options.modal = modal.into();
self
}
#[must_use]
pub fn interactive(mut self, interactive: impl Into<Option<bool>>) -> Self {
self.options.interactive = interactive.into();
self
}
#[must_use]
pub fn connection(mut self, connection: Option<zbus::Connection>) -> Self {
self.connection = connection;
self
}
pub async fn send(self) -> Result<Request<Screenshot>, Error> {
let proxy = if let Some(connection) = self.connection {
ScreenshotProxy::with_connection(connection).await?
} else {
ScreenshotProxy::new().await?
};
proxy
.screenshot(self.identifier.as_ref(), self.options)
.await
}
}