use std::{fmt::Debug, os::fd::BorrowedFd};
use serde_repr::Deserialize_repr;
use zbus::zvariant::{Fd, Type};
use crate::{error::PortalError, proxy::Proxy, Error};
#[cfg_attr(feature = "glib", derive(glib::Enum))]
#[cfg_attr(feature = "glib", enum_type(name = "AshpdGameModeStatus"))]
#[derive(Deserialize_repr, PartialEq, Eq, Debug, Clone, Copy, Type)]
#[repr(i32)]
pub enum Status {
Inactive = 0,
Active = 1,
Registered = 2,
Rejected = -1,
}
#[derive(Deserialize_repr, PartialEq, Eq, Debug, Type)]
#[repr(i32)]
enum RegisterStatus {
Success = 0,
Rejected = -1,
}
#[derive(Debug)]
#[doc(alias = "org.freedesktop.portal.GameMode")]
pub struct GameMode<'a>(Proxy<'a>);
impl<'a> GameMode<'a> {
pub async fn new() -> Result<GameMode<'a>, Error> {
let proxy = Proxy::new_desktop("org.freedesktop.portal.GameMode").await?;
Ok(Self(proxy))
}
#[doc(alias = "QueryStatus")]
pub async fn query_status(&self, pid: u32) -> Result<Status, Error> {
self.0.call("QueryStatus", &(pid)).await
}
#[doc(alias = "QueryStatusByPIDFd")]
pub async fn query_status_by_pidfd(
&self,
target: &BorrowedFd<'_>,
requester: &BorrowedFd<'_>,
) -> Result<Status, Error> {
self.0
.call(
"QueryStatusByPIDFd",
&(Fd::from(target), Fd::from(requester)),
)
.await
}
#[doc(alias = "QueryStatusByPid")]
pub async fn query_status_by_pid(&self, target: u32, requester: u32) -> Result<Status, Error> {
self.0.call("QueryStatusByPid", &(target, requester)).await
}
#[doc(alias = "RegisterGame")]
pub async fn register(&self, pid: u32) -> Result<(), Error> {
let status = self.0.call("RegisterGame", &(pid)).await?;
match status {
RegisterStatus::Success => Ok(()),
RegisterStatus::Rejected => Err(Error::Portal(PortalError::Failed(format!(
"Failed to register game for `{pid}`"
)))),
}
}
#[doc(alias = "RegisterGameByPIDFd")]
pub async fn register_by_pidfd(
&self,
target: &BorrowedFd<'_>,
requester: &BorrowedFd<'_>,
) -> Result<(), Error> {
let status = self
.0
.call(
"RegisterGameByPIDFd",
&(Fd::from(target), Fd::from(requester)),
)
.await?;
match status {
RegisterStatus::Success => Ok(()),
RegisterStatus::Rejected => Err(Error::Portal(PortalError::Failed(
"Failed to register by pidfd".to_string(),
))),
}
}
#[doc(alias = "RegisterGameByPid")]
pub async fn register_by_pid(&self, target: u32, requester: u32) -> Result<(), Error> {
let status = self
.0
.call("RegisterGameByPid", &(target, requester))
.await?;
match status {
RegisterStatus::Success => Ok(()),
RegisterStatus::Rejected => Err(Error::Portal(PortalError::Failed(format!(
"Failed to register by pid for target=`{target}` requester=`{requester}`"
)))),
}
}
#[doc(alias = "UnregisterGame")]
pub async fn unregister(&self, pid: u32) -> Result<(), Error> {
let status = self.0.call("UnregisterGame", &(pid)).await?;
match status {
RegisterStatus::Success => Ok(()),
RegisterStatus::Rejected => Err(Error::Portal(PortalError::Failed(format!(
"Failed to unregister for `{pid}`"
)))),
}
}
#[doc(alias = "UnregisterGameByPIDFd")]
pub async fn unregister_by_pidfd(
&self,
target: &BorrowedFd<'_>,
requester: &BorrowedFd<'_>,
) -> Result<(), Error> {
let status = self
.0
.call(
"UnregisterGameByPIDFd",
&(Fd::from(target), Fd::from(requester)),
)
.await?;
match status {
RegisterStatus::Success => Ok(()),
RegisterStatus::Rejected => Err(Error::Portal(PortalError::Failed(
"Failed to unregister by pidfd`".to_string(),
))),
}
}
#[doc(alias = "UnregisterGameByPid")]
pub async fn unregister_by_pid(&self, target: u32, requester: u32) -> Result<(), Error> {
let status = self
.0
.call("UnregisterGameByPid", &(target, requester))
.await?;
match status {
RegisterStatus::Success => Ok(()),
RegisterStatus::Rejected => Err(Error::Portal(PortalError::Failed(format!(
"Failed to unregister by pid for target=`{target}` requester=`{requester}`"
)))),
}
}
}
impl<'a> std::ops::Deref for GameMode<'a> {
type Target = zbus::Proxy<'a>;
fn deref(&self) -> &Self::Target {
&self.0
}
}