use cfg_if::cfg_if;
cfg_if! {
if #[cfg(target_os = "windows")] {
mod windows;
use windows as sys;
} else if #[cfg(target_os = "macos")] {
mod macos;
use macos as sys;
} else if #[cfg(target_os = "linux")] {
mod linux;
use linux as sys;
} else {
compile_error!("screen-wake-lock only supports Windows, macOS, and Linux.");
}
}
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error("OS error: {0}")]
Os(String),
#[error("D-Bus error: {0}")]
Dbus(String),
#[error("Unsupported: {0}")]
Unsupported(String),
}
#[derive(Clone, Debug)]
pub struct LinuxOptions {
pub application_id: Option<String>,
pub reason: Option<String>,
}
impl Default for LinuxOptions {
fn default() -> Self {
Self {
application_id: None,
reason: None,
}
}
}
pub struct ScreenWakeLock {
inner: sys::Inner,
}
impl ScreenWakeLock {
pub fn acquire(reason: impl Into<String>) -> Result<Self, Error> {
Self::acquire_with_linux_options(reason, LinuxOptions::default())
}
pub fn acquire_with_linux_options(
reason: impl Into<String>,
linux: LinuxOptions,
) -> Result<Self, Error> {
let reason = reason.into();
let inner = sys::acquire(&reason, linux)?;
Ok(Self { inner })
}
pub fn is_supported() -> bool {
sys::is_supported()
}
pub fn release(self) {
drop(self);
}
}
impl Drop for ScreenWakeLock {
fn drop(&mut self) {
sys::release(&mut self.inner);
}
}