lios 0.1.32

A polished GTK4/VTE Linux terminal with baked-in themes, glass backgrounds, opt-in GPU backends, and desktop launcher install.
use std::env;
use std::fs;
use std::path::PathBuf;

const DEFAULT_BACKGROUND_BYTES: &[u8] = include_bytes!("../assets/default-background.png");
const DEFAULT_BACKGROUND_FILE_NAME: &str = "default-background.png";

pub fn ensure_default_background() -> Result<PathBuf, String> {
    let path = default_background_path()?;
    if let Some(parent) = path.parent() {
        fs::create_dir_all(parent).map_err(|error| {
            format!(
                "failed to create default background directory '{}': {error}",
                parent.display()
            )
        })?;
    }

    if !matches!(fs::read(&path), Ok(contents) if contents.as_slice() == DEFAULT_BACKGROUND_BYTES) {
        fs::write(&path, DEFAULT_BACKGROUND_BYTES).map_err(|error| {
            format!(
                "failed to write default background '{}': {error}",
                path.display()
            )
        })?;
    }

    Ok(path)
}

fn default_background_path() -> Result<PathBuf, String> {
    Ok(data_home()?.join("lios").join(DEFAULT_BACKGROUND_FILE_NAME))
}

fn data_home() -> Result<PathBuf, String> {
    if let Ok(data_home) = env::var("XDG_DATA_HOME") {
        if !data_home.is_empty() {
            return Ok(PathBuf::from(data_home));
        }
    }

    let home = env::var("HOME")
        .map_err(|_| "unable to determine data directory; set HOME or XDG_DATA_HOME".to_string())?;
    if home.is_empty() {
        return Err("unable to determine data directory; HOME is empty".to_string());
    }

    Ok(PathBuf::from(home).join(".local/share"))
}