adabraka-gpui 0.4.0

Adabraka's GPU-accelerated UI framework (fork of GPUI from Zed - github.com/zed-industries/zed)
Documentation
use anyhow::Result;
use std::path::PathBuf;

fn xdg_config_dir() -> Option<PathBuf> {
    std::env::var_os("XDG_CONFIG_HOME")
        .map(PathBuf::from)
        .or_else(|| std::env::var_os("HOME").map(|home| PathBuf::from(home).join(".config")))
}

fn validate_app_id(app_id: &str) -> Result<()> {
    if app_id.contains('/') || app_id.contains("..") {
        return Err(anyhow::anyhow!(
            "Invalid app_id: must not contain '/' or '..'"
        ));
    }
    Ok(())
}

fn desktop_file_path(app_id: &str) -> Option<PathBuf> {
    xdg_config_dir().map(|dir| dir.join("autostart").join(format!("{}.desktop", app_id)))
}

pub fn set_auto_launch(app_id: &str, enabled: bool) -> Result<()> {
    validate_app_id(app_id)?;

    let desktop_file = desktop_file_path(app_id)
        .ok_or_else(|| anyhow::anyhow!("Could not determine XDG config directory"))?;

    if enabled {
        if let Some(parent) = desktop_file.parent() {
            std::fs::create_dir_all(parent)?;
        }
        let exe_path = std::env::current_exe()?;
        let content = format!(
            "[Desktop Entry]\nType=Application\nName={}\nExec=\"{}\"\nX-GNOME-Autostart-enabled=true\n",
            app_id,
            exe_path.display()
        );
        std::fs::write(&desktop_file, content)?;
    } else {
        let _ = std::fs::remove_file(&desktop_file);
    }

    Ok(())
}

pub fn is_auto_launch_enabled(app_id: &str) -> bool {
    if validate_app_id(app_id).is_err() {
        return false;
    }

    let Some(path) = desktop_file_path(app_id) else {
        return false;
    };

    let Ok(content) = std::fs::read_to_string(&path) else {
        return false;
    };

    !content.contains("X-GNOME-Autostart-enabled=false")
}