feat: change default_folder path of system backgrounds based on distribution

NixOS is not a Linux distribution that is compliant with the "File
Hierarchy System." The top-level directory `/usr` does not exist on
NixOS. So on NixOS, we won't find any backgrounds in the
`/usr/share/backgrounds/` directory.

Instead, what one usually finds in `/usr/share` on FHS-compliant
distributions, on NixOS, it is found in the
`/run/current-system/sw/share` directory.

So, check if we are on NixOS or a NixOS-like distribution by checking
the `/etc/os-release` file. If we are on such distribution, use the
`/run/current-system/sw/share/backgrounds/` directory. Otherwise,
use the `/usr/share/backgrounds/` directory for getting system
backgrounds.
This commit is contained in:
Pratham Patel 2025-04-10 22:53:37 +05:30 committed by GitHub
parent 78ba1212da
commit 2e2898b31f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -5,6 +5,7 @@ use cosmic::cosmic_config::{self, ConfigGet, ConfigSet};
use cosmic_bg_config::Source;
use cosmic_settings_wallpaper as wallpaper;
use std::collections::VecDeque;
use std::io::Read;
use std::path::{Path, PathBuf};
const NAME: &str = "com.system76.CosmicSettings.Wallpaper";
@ -107,7 +108,29 @@ impl Config {
#[must_use]
pub fn default_folder() -> &'static Path {
Path::new("/usr/share/backgrounds/")
let is_nixos_like: bool = match std::fs::File::open("/etc/os-release") {
Ok(mut file) => {
let mut os_release_contents = String::new();
let _ = file.read_to_string(&mut os_release_contents);
// While only want to match for distributions that are either
// NixOS or are based on NixOS.
if os_release_contents.contains("ID=nixos")
|| os_release_contents.contains("ID_LIKE=nixos")
{
true
} else {
false
}
}
Err(_) => false,
};
if is_nixos_like {
Path::new("/run/current-system/sw/share/backgrounds/")
} else {
Path::new("/usr/share/backgrounds/")
}
}
/// Sets the current background folder