use super::{HandleToken, DESTINATION, PATH};
use crate::{helpers::call_request_method, Error, WindowIdentifier};
use serde::Serialize;
use zvariant_derive::{DeserializeDict, SerializeDict, TypeDict};
#[derive(SerializeDict, DeserializeDict, TypeDict, Debug, Clone, Default)]
struct BackgroundOptions {
handle_token: HandleToken,
reason: Option<String>,
autostart: Option<bool>,
#[zvariant(rename = "dbus-activatable")]
dbus_activatable: Option<bool>,
#[zvariant(rename = "commandline")]
command: Option<Vec<String>>,
}
impl BackgroundOptions {
pub fn reason(mut self, reason: &str) -> Self {
self.reason = Some(reason.to_string());
self
}
pub fn autostart(mut self, autostart: bool) -> Self {
self.autostart = Some(autostart);
self
}
pub fn dbus_activatable(mut self, dbus_activatable: bool) -> Self {
self.dbus_activatable = Some(dbus_activatable);
self
}
pub fn command<S: AsRef<str> + zvariant::Type + Serialize>(
mut self,
command: Option<&[S]>,
) -> Self {
self.command = command.map(|s| s.iter().map(|s| s.as_ref().to_string()).collect());
self
}
}
#[derive(SerializeDict, DeserializeDict, TypeDict, Debug)]
pub struct Background {
background: bool,
autostart: bool,
}
impl Background {
pub fn run_in_background(&self) -> bool {
self.background
}
pub fn auto_start(&self) -> bool {
self.autostart
}
}
#[derive(Debug)]
#[doc(alias = "org.freedesktop.portal.Background")]
pub struct BackgroundProxy<'a>(zbus::azync::Proxy<'a>);
impl<'a> BackgroundProxy<'a> {
pub async fn new(connection: &zbus::azync::Connection) -> Result<BackgroundProxy<'a>, Error> {
let proxy = zbus::ProxyBuilder::new_bare(connection)
.interface("org.freedesktop.portal.Background")
.path(PATH)?
.destination(DESTINATION)
.build_async()
.await?;
Ok(Self(proxy))
}
pub fn inner(&self) -> &zbus::azync::Proxy<'_> {
&self.0
}
#[doc(alias = "RequestBackground")]
pub async fn request_background<S: AsRef<str> + zvariant::Type + Serialize>(
&self,
identifier: WindowIdentifier,
reason: &str,
auto_start: bool,
command_line: Option<&[S]>,
dbus_activatable: bool,
) -> Result<Background, Error> {
let options = BackgroundOptions::default()
.reason(reason)
.autostart(auto_start)
.dbus_activatable(dbus_activatable)
.command(command_line);
call_request_method(
&self.0,
&options.handle_token,
"RequestBackground",
&(identifier, &options),
)
.await
}
}
#[doc(alias = "xdp_portal_request_background")]
pub async fn request<S: AsRef<str> + zvariant::Type + Serialize>(
identifier: WindowIdentifier,
reason: &str,
auto_start: bool,
command_line: Option<&[S]>,
dbus_activatable: bool,
) -> Result<Background, Error> {
let connection = zbus::azync::Connection::new_session().await?;
let proxy = BackgroundProxy::new(&connection).await?;
proxy
.request_background(
identifier,
reason,
auto_start,
command_line,
dbus_activatable,
)
.await
}