#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Appearance {
Light,
Dark,
}
pub fn detect_preferred_appearance() -> Option<Appearance> {
detect_via_os_hint()
}
fn detect_via_os_hint() -> Option<Appearance> {
#[cfg(target_os = "macos")]
{
use std::process::Command;
if let Ok(output) = Command::new("/usr/bin/defaults")
.args(["read", "-g", "AppleInterfaceStyle"])
.output()
{
if output.status.success() {
let stdout = String::from_utf8_lossy(&output.stdout);
if stdout.to_ascii_lowercase().contains("dark") {
return Some(Appearance::Dark);
} else {
return Some(Appearance::Light);
}
}
}
return Some(Appearance::Light);
}
#[cfg(target_os = "windows")]
{
use winreg::enums::HKEY_CURRENT_USER;
use winreg::RegKey;
let hkcu = RegKey::predef(HKEY_CURRENT_USER);
if let Ok(personalize) =
hkcu.open_subkey("Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize")
{
let value: Result<u32, _> = personalize.get_value("AppsUseLightTheme");
if let Ok(v) = value {
return Some(if v == 0 {
Appearance::Dark
} else {
Appearance::Light
});
}
}
return None; }
#[cfg(target_os = "linux")]
{
use std::process::Command;
if let Ok(output) = Command::new("gsettings")
.args(["get", "org.gnome.desktop.interface", "color-scheme"])
.output()
{
if output.status.success() {
let stdout = String::from_utf8_lossy(&output.stdout);
let s = stdout.to_ascii_lowercase();
if s.contains("prefer-dark") {
return Some(Appearance::Dark);
} else if s.contains("default") {
return Some(Appearance::Light);
}
}
}
if let Ok(output) = Command::new("gsettings")
.args(["get", "org.gnome.desktop.interface", "gtk-theme"])
.output()
{
if output.status.success() {
let stdout = String::from_utf8_lossy(&output.stdout);
let s = stdout.to_ascii_lowercase();
if s.contains("-dark") {
return Some(Appearance::Dark);
} else {
return Some(Appearance::Light);
}
}
}
None
}
#[cfg(not(any(target_os = "macos", target_os = "windows", target_os = "linux")))]
{
None
}
}