1use cfg_if::cfg_if;
12
13cfg_if! {
14 if #[cfg(target_os = "windows")] {
15 mod windows;
16 use windows as sys;
17 } else if #[cfg(target_os = "macos")] {
18 mod macos;
19 use macos as sys;
20 } else if #[cfg(target_os = "linux")] {
21 mod linux;
22 use linux as sys;
23 } else {
24 compile_error!("screen-wake-lock only supports Windows, macOS, and Linux.");
25 }
26}
27
28#[derive(Debug, thiserror::Error)]
30pub enum Error {
31 #[error("OS error: {0}")]
33 Os(String),
34 #[error("D-Bus error: {0}")]
36 Dbus(String),
37 #[error("Unsupported: {0}")]
39 Unsupported(String),
40}
41
42#[derive(Clone, Debug)]
44pub struct LinuxOptions {
45 pub application_id: Option<String>,
47 pub reason: Option<String>,
49}
50
51impl Default for LinuxOptions {
52 fn default() -> Self {
53 Self {
54 application_id: None,
55 reason: None,
56 }
57 }
58}
59
60pub struct ScreenWakeLock {
62 inner: sys::Inner,
63}
64
65impl ScreenWakeLock {
66 pub fn acquire(reason: impl Into<String>) -> Result<Self, Error> {
68 Self::acquire_with_linux_options(reason, LinuxOptions::default())
69 }
70
71 pub fn acquire_with_linux_options(
73 reason: impl Into<String>,
74 linux: LinuxOptions,
75 ) -> Result<Self, Error> {
76 let reason = reason.into();
77 let inner = sys::acquire(&reason, linux)?;
78 Ok(Self { inner })
79 }
80
81 pub fn is_supported() -> bool {
83 sys::is_supported()
84 }
85
86 pub fn release(self) {
88 drop(self);
89 }
90}
91
92impl Drop for ScreenWakeLock {
93 fn drop(&mut self) {
94 sys::release(&mut self.inner);
95 }
96}