dark_light/platforms/
freedesktop.rs1use std::time::Duration;
2
3use crate::{Error, Mode};
4
5use ashpd::desktop::settings::ColorScheme as PortalColorScheme;
6use ashpd::desktop::settings::Settings as XdgPortalSettings;
7use async_std::{future, task};
8
9pub fn detect() -> Result<Mode, Error> {
10 task::block_on(future::timeout(Duration::from_millis(25), async {
11 let settings = XdgPortalSettings::new()
12 .await
13 .map_err(|e| Error::XdgDesktopPortal(e.to_string()))?;
14 let color_scheme = settings
15 .color_scheme()
16 .await
17 .map_err(|e| Error::XdgDesktopPortal(e.to_string()))?;
18 Ok::<Mode, Error>(color_scheme.into())
19 }))
20 .map_err(|_| Error::Timeout)?
21}
22
23impl From<PortalColorScheme> for Mode {
24 fn from(value: PortalColorScheme) -> Self {
25 match value {
26 PortalColorScheme::NoPreference => Mode::Unspecified,
27 PortalColorScheme::PreferDark => Mode::Dark,
28 PortalColorScheme::PreferLight => Mode::Light,
29 }
30 }
31}