{ config, lib, this, ... }: let cfg = config.nixfiles.modules.common.xdg; in { imports = let withBase = a: [ "nixfiles" "modules" "common" "xdg" a ]; in [ (lib.mkAliasOptionModule [ "dirs" "cache" ] (withBase "cacheHome")) (lib.mkAliasOptionModule [ "dirs" "config" ] (withBase "configHome")) (lib.mkAliasOptionModule [ "dirs" "data" ] (withBase "dataHome")) (lib.mkAliasOptionModule [ "dirs" "state" ] (withBase "stateHome")) (lib.mkAliasOptionModule [ "userDirs" ] (withBase "userDirs")) ]; options.nixfiles.modules.common.xdg = { cacheHome = lib.mkOption { type = lib.types.str; default = "${config.hm.home.homeDirectory}/.cache"; }; configHome = lib.mkOption { type = lib.types.str; default = "${config.hm.home.homeDirectory}/.config"; }; dataHome = lib.mkOption { type = lib.types.str; default = "${config.hm.home.homeDirectory}/.local/share"; }; stateHome = lib.mkOption { type = lib.types.str; default = "${config.hm.home.homeDirectory}/.local/state"; }; userDirs = lib.mkOption { type = lib.types.attrs; default = let inherit (config.my) home; tmp = home + "/tmp"; in { enable = true; desktop = tmp; documents = "${home}/doc"; download = tmp; music = tmp; pictures = tmp; publicShare = "${home}/share"; templates = tmp; videos = tmp; }; }; defaultApplications = lib.mkOption { description = "Default applications."; type = with lib.types; attrsOf (listOf str); default = { }; }; }; config = { xdg = { portal.enable = this.isHeadful; sounds.enable = this.isHeadful; }; hm.xdg = lib.mkMerge [ (with cfg; { enable = true; inherit cacheHome; inherit configHome; inherit dataHome; inherit stateHome; inherit userDirs; }) (lib.mkIf this.isHeadful { mimeApps = { enable = true; defaultApplications = lib.mkMerge ( lib.mapAttrsToList (n: v: lib.genAttrs v (_: [ "${n}.desktop" ])) cfg.defaultApplications ); }; }) ]; }; }