pub(crate) fn read_portal_u32(namespace: &str, key: &str) -> Option<u32> {
let output = std::process::Command::new("busctl")
.args([
"--user",
"call",
"org.freedesktop.portal.Desktop",
"/org/freedesktop/portal/desktop",
"org.freedesktop.portal.Settings",
"ReadOne",
"ss",
namespace,
key,
])
.output()
.ok()?;
if !output.status.success() {
return None;
}
let stdout = String::from_utf8_lossy(&output.stdout);
stdout.split_whitespace().last()?.parse::<u32>().ok()
}
pub(crate) fn read_gsettings(schema: &str, key: &str) -> Option<String> {
let output = std::process::Command::new("gsettings")
.args(["get", schema, key])
.output()
.ok()?;
if !output.status.success() {
return None;
}
let value = String::from_utf8_lossy(&output.stdout).trim().to_string();
Some(value.trim_matches('\'').to_string())
}
pub(crate) fn read_portal_rgb(namespace: &str, key: &str) -> Option<(f64, f64, f64)> {
let output = std::process::Command::new("busctl")
.args([
"--user",
"call",
"org.freedesktop.portal.Desktop",
"/org/freedesktop/portal/desktop",
"org.freedesktop.portal.Settings",
"ReadOne",
"ss",
namespace,
key,
])
.output()
.ok()?;
if !output.status.success() {
return None;
}
let stdout = String::from_utf8_lossy(&output.stdout);
let parts: Vec<&str> = stdout.split_whitespace().collect();
if parts.len() >= 3 {
let b = parts[parts.len() - 1].parse::<f64>().ok()?;
let g = parts[parts.len() - 2].parse::<f64>().ok()?;
let r = parts[parts.len() - 3].parse::<f64>().ok()?;
if (0.0..=1.0).contains(&r) && (0.0..=1.0).contains(&g) && (0.0..=1.0).contains(&b) {
Some((r, g, b))
} else {
None
}
} else {
None
}
}
#[allow(dead_code)]
pub(crate) enum Desktop {
Gnome,
Kde,
Cinnamon,
Other(String),
}
pub(crate) fn detect_desktop() -> Desktop {
let xdg = std::env::var("XDG_CURRENT_DESKTOP").unwrap_or_default();
let upper = xdg.to_uppercase();
if upper.contains("GNOME") {
Desktop::Gnome
} else if upper.contains("KDE") {
Desktop::Kde
} else if upper.contains("CINNAMON") || upper.contains("X-CINNAMON") {
Desktop::Cinnamon
} else {
Desktop::Other(xdg)
}
}