use std::fmt::Debug;
use zbus::zvariant::{DeserializeDict, SerializeDict, Type};
use super::{HandleToken, Request};
use crate::{desktop::Color, proxy::Proxy, Error, WindowIdentifier};
#[derive(SerializeDict, Type, Debug, Default)]
#[zvariant(signature = "dict")]
struct ScreenshotOptions {
handle_token: HandleToken,
modal: Option<bool>,
interactive: Option<bool>,
}
#[derive(DeserializeDict, Type)]
#[zvariant(signature = "dict")]
pub struct Screenshot {
uri: url::Url,
}
impl Screenshot {
pub fn request() -> ScreenshotRequest {
ScreenshotRequest::default()
}
pub fn uri(&self) -> &url::Url {
&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(SerializeDict, Type, Debug, Default)]
#[zvariant(signature = "dict")]
struct ColorOptions {
handle_token: HandleToken,
}
#[derive(Debug)]
#[doc(alias = "org.freedesktop.portal.Screenshot")]
struct ScreenshotProxy<'a>(Proxy<'a>);
impl<'a> ScreenshotProxy<'a> {
pub async fn new() -> Result<ScreenshotProxy<'a>, Error> {
let proxy = Proxy::new_desktop("org.freedesktop.portal.Screenshot").await?;
Ok(Self(proxy))
}
#[doc(alias = "PickColor")]
#[doc(alias = "xdp_portal_pick_color")]
pub async fn pick_color(
&self,
identifier: &WindowIdentifier,
options: ColorOptions,
) -> Result<Request<Color>, Error> {
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: &WindowIdentifier,
options: ScreenshotOptions,
) -> Result<Request<Screenshot>, Error> {
self.0
.request(
&options.handle_token,
"Screenshot",
&(&identifier, &options),
)
.await
}
}
impl<'a> std::ops::Deref for ScreenshotProxy<'a> {
type Target = zbus::Proxy<'a>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
#[derive(Debug, Default)]
#[doc(alias = "xdp_portal_pick_color")]
pub struct ColorRequest {
identifier: WindowIdentifier,
options: ColorOptions,
}
impl ColorRequest {
#[must_use]
pub fn identifier(mut self, identifier: WindowIdentifier) -> Self {
self.identifier = identifier;
self
}
pub async fn send(self) -> Result<Request<Color>, Error> {
let proxy = ScreenshotProxy::new().await?;
proxy.pick_color(&self.identifier, 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: WindowIdentifier,
}
impl ScreenshotRequest {
#[must_use]
pub fn identifier(mut self, identifier: impl Into<Option<WindowIdentifier>>) -> Self {
self.identifier = identifier.into().unwrap_or_default();
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
}
pub async fn send(self) -> Result<Request<Screenshot>, Error> {
let proxy = ScreenshotProxy::new().await?;
proxy.screenshot(&self.identifier, self.options).await
}
}