dark_light/platforms/
freedesktop.rs

1use 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}