sctk_adwaita/
config.rs

1//! System configuration.
2use std::process::Command;
3
4/// Query system to see if dark theming should be preferred.
5pub(crate) fn prefer_dark() -> bool {
6    // outputs something like: `variant       variant          uint32 1`
7    let stdout = Command::new("dbus-send")
8        .arg("--reply-timeout=100")
9        .arg("--print-reply=literal")
10        .arg("--dest=org.freedesktop.portal.Desktop")
11        .arg("/org/freedesktop/portal/desktop")
12        .arg("org.freedesktop.portal.Settings.Read")
13        .arg("string:org.freedesktop.appearance")
14        .arg("string:color-scheme")
15        .output()
16        .ok()
17        .and_then(|out| String::from_utf8(out.stdout).ok());
18
19    if matches!(stdout, Some(ref s) if s.is_empty()) {
20        log::error!("XDG Settings Portal did not return response in time: timeout: 100ms, key: color-scheme");
21    }
22
23    matches!(stdout, Some(s) if s.trim().ends_with("uint32 1"))
24}
25
26/// Query system configuration for buttons layout.
27/// Should be updated to use standard xdg-desktop-portal specs once available
28/// https://github.com/flatpak/xdg-desktop-portal/pull/996
29pub(crate) fn get_button_layout_config() -> Option<(String, String)> {
30    let config_string = Command::new("dbus-send")
31        .arg("--reply-timeout=100")
32        .arg("--print-reply=literal")
33        .arg("--dest=org.freedesktop.portal.Desktop")
34        .arg("/org/freedesktop/portal/desktop")
35        .arg("org.freedesktop.portal.Settings.Read")
36        .arg("string:org.gnome.desktop.wm.preferences")
37        .arg("string:button-layout")
38        .output()
39        .ok()
40        .and_then(|out| String::from_utf8(out.stdout).ok())?;
41
42    let sides_split: Vec<_> = config_string
43        // Taking last word
44        .rsplit(' ')
45        .next()?
46        // Split by left/right side
47        .split(':')
48        // Only two sides
49        .take(2)
50        .collect();
51
52    match sides_split.as_slice() {
53        [left, right] => Some((left.to_string(), right.to_string())),
54        _ => None,
55    }
56}