Commit 6fe222a

HPCesia <me@hpcesia.com>
2026-07-30 09:55:41
Migrate XDG config to Hjem
1 parent 1626dc1
Changed files (3)
hjemModules
modules
core
desktop
hjemModules/xdg/user-dirs.nix
@@ -0,0 +1,47 @@
+{
+  lib,
+  config,
+  pkgs,
+  ...
+}: {
+  options = {
+    xdg.user-dirs = {
+      enable = lib.mkEnableOption "Whether to manage `$XDG_CONFIG_HOME/user-dirs.dirs`";
+      package = lib.mkPackageOption pkgs "xdg-user-dirs" {nullable = true;};
+      setSessionVariables = lib.mkEnableOption "Whether to set the XDG user dir environment variables";
+      directories = lib.mkOption {
+        type = lib.types.lazyAttrsOf lib.types.str;
+        description = "All user directories";
+        default = {
+          desktop = "${config.directory}/Desktop";
+          documents = "${config.directory}/Documents";
+          download = "${config.directory}/Downloads";
+          music = "${config.directory}/Music";
+          pictures = "${config.directory}/Pictures";
+          projects = "${config.directory}/Projects";
+          publicShare = "${config.directory}/publicShare";
+          templates = "${config.directory}/Templates";
+          videos = "${config.directory}/Videos";
+        };
+      };
+    };
+  };
+  config = let
+    cfg = config.xdg.user-dirs;
+    mkXDGVariable = dirs:
+      lib.mapAttrs'
+      (dir: path: lib.nameValuePair "XDG_${lib.strings.toUpper dir}_DIR" path)
+      dirs;
+  in
+    lib.mkIf cfg.enable {
+      packages = lib.optional (cfg.package != null) cfg.package;
+
+      xdg.config.files."user-dirs.dirs" = {
+        generator = lib.generators.toKeyValue {};
+        value = lib.mapAttrs (_: dir: ''"${dir}"'') (mkXDGVariable cfg.directories);
+      };
+      xdg.config.files."user-dirs.conf".text = "enabled=False";
+
+      environment.sessionVariables = lib.mkIf cfg.setSessionVariables (mkXDGVariable cfg.directories);
+    };
+}
modules/core/xdg-dir.nix
@@ -1,8 +1,12 @@
 {
   den.aspects.core.xdg-dir = {
-    cacheHome = {config, ...}: {
+    cacheUser = {
+      user,
+      config,
+      ...
+    }: {
       directories = [
-        config.xdg.cacheHome
+        config.hjem.users.${user.userName}.xdg.cache.directory
       ];
     };
 
@@ -16,6 +20,19 @@
       };
     };
 
+    hjem = {config, ...}: {
+      environment.sessionVariables = {
+        XDG_BIN_HOME = "${config.directory}/.local/bin";
+      };
+
+      xdg = {
+        cache.directory = "${config.directory}/.cache";
+        config.directory = "${config.directory}/.config";
+        data.directory = "${config.directory}/.local/share";
+        state.directory = "${config.directory}/.local/state";
+      };
+    };
+
     homeManager = {config, ...}: {
       home.preferXdgDirectories = true;
 
modules/desktop/xdg.nix
@@ -1,7 +1,15 @@
-{lib, ...}: {
+{
+  self,
+  lib,
+  ...
+}: {
   den.aspects.desktop.xdg-user-dirs = {
-    persistHome = {config, ...}: {
-      directories = with config.xdg.userDirs; [
+    persistUser = {
+      user,
+      config,
+      ...
+    }: {
+      directories = with config.hjem.users.${user.userName}.xdg.user-dirs.directories; [
         desktop
         documents
         music
@@ -25,6 +33,27 @@
       };
     };
 
+    hjem = {config, ...}: {
+      imports = ["${self.outPath}/hjemModules/xdg/user-dirs.nix"];
+
+      xdg.user-dirs = {
+        enable = true;
+        setSessionVariables = true;
+        directories = {
+          desktop = "${config.directory}/Desktop";
+          documents = "${config.directory}/Documents";
+          download = "${config.directory}/Downloads";
+          music = "${config.directory}/Musics";
+          pictures = "${config.directory}/Pictures";
+          projects = "${config.directory}/Development";
+          videos = "${config.directory}/Videos";
+          publicShare = "${config.directory}/Share";
+          templates = "${config.directory}/Templates";
+          screenshots = "${config.xdg.user-dirs.directories.pictures}/Screenshots";
+        };
+      };
+    };
+
     homeManager = {
       config,
       pkgs,
@@ -47,9 +76,9 @@
     in {
       xdg.userDirs =
         {
-          enable = true;
+          enable = false;
           createDirectories = true;
-          setSessionVariables = true;
+          setSessionVariables = false;
 
           publicShare = "${config.home.homeDirectory}/Share";
           templates = "${config.home.homeDirectory}/Templates";