{ config, lib, username, ... }: let cfg = config.xdg.forced-compliance; itgr = cfg.integrations; homeConfig = config.home-manager.users.${username}; xdgConfig = homeConfig.xdg; mkIntegrationOption = name: lib.mkOption { default = true; example = false; description = "Whether to enable ${name} integration."; type = lib.types.bool; }; in { options.xdg.forced-compliance = { enable = lib.mkEnableOption '' a best-effort attempt to get everything to comply with the xdg spec. Has a chance of breaking some programs with hard-coded paths ''; integrations = { android = mkIntegrationOption "android"; bash = mkIntegrationOption "bash"; cargo = mkIntegrationOption "cargo"; cuda = mkIntegrationOption "cuda"; docker = mkIntegrationOption "docker"; dvdcss = mkIntegrationOption "dvdcss"; gpg = mkIntegrationOption "gpg"; gradle = mkIntegrationOption "gradle"; gtk2 = mkIntegrationOption "gtk2"; home-cursor = mkIntegrationOption "home-cursor"; ionic-cli = mkIntegrationOption "ionic-cli"; java = mkIntegrationOption "java"; # some apps just won't respect this # TODO: `.mozilla` (unsupported) nix = mkIntegrationOption "nix"; npm = mkIntegrationOption "npm"; # TODO: `.pki` # Technically this is supporte out of the box, but some programs just # create it out of nowhere https://bugzilla.mozilla.org/show_bug.cgi?id=818686#c11 python = mkIntegrationOption "python"; # TODO: `.ssh` (unsupported) # TODO: `steam` (unsupported) wget = mkIntegrationOption "wget"; wine = mkIntegrationOption "wine"; xcompose = mkIntegrationOption "xcompose"; zsh = mkIntegrationOption "zsh"; }; }; config = lib.mkIf cfg.enable { nix.extraOptions = '' use-xdg-base-directories = true ''; environment.etc."zshenv".text = lib.mkIf itgr.zsh '' source ${xdgConfig.configHome}/zsh/.zshenv ''; home-manager.users.${username} = { xdg = { enable = true; userDirs.enable = true; configFile.wgetrc.text = lib.mkIf itgr.wget '' hsts-file="${xdgConfig.cacheHome}/wget-hsts" ''; }; home.sessionVariables = { _JAVA_OPTGRADLE_USER_HOMEIONS = lib.mkIf itgr.java ''-Djava.util.prefs.userRoot="${xdgConfig.configHome}"/java''; ANDROID_USER_HOME = lib.mkIf itgr.android "${xdgConfig.dataHome}/android"; CARGO_HOME = lib.mkIf itgr.cargo "${xdgConfig.dataHome}/cargo"; CUDA_CACHE_PATH = lib.mkIf itgr.cuda "${xdgConfig.cacheHome}/cuda"; DOCKER_CONFIG = lib.mkIf itgr.docker "${xdgConfig.configHome}/docker"; DVDCSS_CACHE = lib.mkIf itgr.dvdcss "${xdgConfig.cacheHome}/dvdcss"; GRADLE_USER_HOME = lib.mkIf itgr.gradle "${xdgConfig.configHome}/gradle"; NPM_CONFIG_CACHE = lib.mkIf itgr.npm "${xdgConfig.cacheHome}/npm"; NPM_CONFIG_TMP = lib.mkIf itgr.npm "${xdgConfig.stateHome}/npm"; NPM_CONFIG_USERCONFIG = lib.mkIf itgr.npm "${xdgConfig.configHome}/npm/config"; PYTHON_HISTORY = lib.mkIf itgr.python "${xdgConfig.stateHome}/python/history"; PYTHONCACHEPREFIX = lib.mkIf itgr.python "${xdgConfig.cacheHome}/python"; PYTHONUSERBASE = lib.mkIf itgr.python "${xdgConfig.dataHome}/python"; WGETRC = lib.mkIf itgr.wget "${xdgConfig.configHome}/wgetrc"; WINEPREFIX = lib.mkIf itgr.wine "${xdgConfig.dataHome}/wine"; XCOMPOSECACHE = lib.mkIf itgr.xcompose "${xdgConfig.cacheHome}/X11/xcompose"; XCOMPOSEFILE = lib.mkIf itgr.xcompose "${xdgConfig.configHome}/X11/xcompose"; }; home.file = { ".zshenv".enable = lib.mkIf itgr.zsh false; # This might break some stuff, see # https://github.com/nix-community/home-manager/blob/bfa7c06436771e3a0c666ccc6ee01e815d4c33aa/modules/config/home-cursor.nix#L152 ".icons/default/index.theme".enable = lib.mkIf itgr.home-cursor false; ".icons/${homeConfig.home.pointerCursor.name}".enable = lib.mkIf itgr.home-cursor false; }; gtk.gtk2.configLocation = lib.mkIf itgr.gtk2 "${xdgConfig.configHome}/gtk-2.0/gtkrc"; programs = { gpg.homedir = lib.mkIf itgr.gpg "${xdgConfig.configHome}/gnupg"; bash.historyFile = lib.mkIf itgr.bash "${xdgConfig.stateHome}/bash/history"; zsh = lib.mkIf itgr.zsh { dotDir = "${xdgConfig.configHome}/zsh"; history.path = "${xdgConfig.stateHome}/zsh/history"; }; }; }; }; }