From dc06c70c43421f8002737537da325f7b4a65a6fa Mon Sep 17 00:00:00 2001 From: OlivierChiasson Date: Mon, 22 Jun 2026 13:14:08 -0300 Subject: [PATCH] Refactor DMS configuration and introduce home-manager integration - Simplified `default.nix` by removing legacy home-manager settings and delegating them to a new `_private/hm.nix` module for better organization. - Added a new script `dms-restart-once.sh` to handle service restarts and cache management for DMS plugins. - Updated the DMS configuration to streamline the integration of third-party plugins and improve overall modularity. --- flake.nix | 3 +- .../default.nix => _private/hm.nix} | 166 ++++++++---------- modules/desktop/shells/dms/default.nix | 28 +-- .../scripts/dms-restart-once.sh | 0 4 files changed, 78 insertions(+), 119 deletions(-) rename modules/desktop/shells/dms/{home-manager/default.nix => _private/hm.nix} (55%) rename modules/desktop/shells/dms/{home-manager => }/scripts/dms-restart-once.sh (100%) diff --git a/flake.nix b/flake.nix index b95b796..51bd9c3 100644 --- a/flake.nix +++ b/flake.nix @@ -207,7 +207,7 @@ lib = inputs.nixpkgs.lib; # import-tree default: only .nix, skip paths with /_/ (see # https://import-tree.oeiuwq.com/guides/filtering/ ). filterNot composes AND with that. - # Skip /package/, /packages/, and dms/home-manager/ (callPackage + DMS HM colocation). + # Skip /package/ and /packages/ (callPackage colocation). # Avoid a global "/home-manager/" filter — it would drop modules/ssh/home-manager/. modulesTree = lib.pipe inputs.import-tree [ @@ -217,7 +217,6 @@ p: lib.hasInfix "/package/" p || lib.hasInfix "/packages/" p - || lib.hasInfix "dms/home-manager/" p )) (it: it ./modules) ]; diff --git a/modules/desktop/shells/dms/home-manager/default.nix b/modules/desktop/shells/dms/_private/hm.nix similarity index 55% rename from modules/desktop/shells/dms/home-manager/default.nix rename to modules/desktop/shells/dms/_private/hm.nix index d4f518d..8663546 100644 --- a/modules/desktop/shells/dms/home-manager/default.nix +++ b/modules/desktop/shells/dms/_private/hm.nix @@ -1,3 +1,4 @@ +# Home Manager wiring for DMS (imported by default.nix; lives under _private/ for import-tree). { inputs, config, @@ -5,10 +6,17 @@ lib, osConfig ? { }, ... -}: let +}: +let home = config.home.homeDirectory; dmsEnabled = lib.attrByPath [ "chiasson" "desktop" "shell" ] null osConfig == "dms"; dmsOs = lib.attrByPath [ "chiasson" "desktop" "shells" "dms" ] { } osConfig; + hostName = lib.attrByPath [ "networking" "hostName" ] "nixos" osConfig; + rebuildCommand = + if (dmsOs.rebuildCommand or null) != null then + dmsOs.rebuildCommand + else + [ "sudo" "nixos-rebuild" "switch" "--flake" ".#${hostName}" ]; gpuTempEnabled = dmsOs.enableGpuTemp or true; hyprlandEnabled = lib.attrByPath [ "chiasson" "desktop" "hyprland" "enable" ] false osConfig; discordEnabled = lib.attrByPath [ "chiasson" "home" "apps" "discord" "enable" ] false config; @@ -57,12 +65,12 @@ "${pkgs.util-linux}/bin/flock" "${pkgs.systemd}/bin/systemctl" ] - (builtins.readFile ./scripts/dms-restart-once.sh) + (builtins.readFile ../scripts/dms-restart-once.sh) ); jsonFormat = pkgs.formats.json { }; dmsConfigDir = "${config.xdg.configHome}/DankMaterialShell"; - defaultSeedDir = lib.attrByPath [ "chiasson" "desktop" "shells" "dms" "defaultSeedDir" ] null osConfig; + defaultSeedDir = dmsOs.defaultSeedDir or null; dmsSeedSources = if defaultSeedDir != null then @@ -75,7 +83,7 @@ else { "settings.json" = jsonFormat.generate "dms-settings-seed.json" ( - import ../_private/default-settings.nix { + import ./default-settings.nix { inherit lib gpuTempEnabled; extraRightBarWidgets = dmsOs.extraRightBarWidgets or [ ]; } @@ -105,7 +113,7 @@ ${dmsSeedBody} ''; - matugenConfigText = import ../_private/matugen-config.nix { + matugenConfigText = import ./matugen-config.nix { inherit lib home @@ -116,7 +124,6 @@ ; }; - # Directory name must match each plugin's `id` in plugin.json. thirdPartyPlugins = { dankVault = inputs.dms-plugin-dank-vault; calculator = inputs.dms-plugin-calculator; @@ -138,14 +145,14 @@ rbwLockToggle = inputs.dms-plugin-rbw-lock-toggle; }; - shipThirdPartyPlugin = - id: src: + shipPlugin = + _id: src: { source = src; onChange = "${dmsRestartOnceScript}"; }; - -in { +in +{ imports = [ inputs.dms.homeModules.dank-material-shell inputs.nix-monitor.homeManagerModules.default @@ -153,93 +160,70 @@ in { config = lib.mkIf dmsEnabled (lib.mkMerge [ (lib.mkIf (dmsOs.bundleThirdPartyPlugins or true) { - xdg.configFile = - lib.mapAttrs (id: src: shipThirdPartyPlugin id src) thirdPartyPlugins; + xdg.configFile = lib.mapAttrs (_id: src: shipPlugin _id src) thirdPartyPlugins; }) { + programs.nix-monitor = { + enable = true; + inherit rebuildCommand; + generationsCommand = [ + "bash" + "-c" + "readlink /nix/var/nix/profiles/system | cut -d- -f2" + ]; + }; - # Nix rebuild widget used by DankMaterialShell (via nix-monitor). - # Per-host `rebuildCommand` is set in `modules/hosts//configuration.nix` (`chiasson.desktop.shells.dms`). - programs.nix-monitor = { - enable = true; - generationsCommand = [ - "bash" - "-c" - "readlink /nix/var/nix/profiles/system | cut -d- -f2" - ]; - }; + home.packages = with pkgs; [ + kdePackages.qtdeclarative + kdePackages.kirigami.unwrapped + kdePackages.qtmultimedia + kdePackages.sonnet + tesseract + mpv + socat + wl-clipboard + jq + cava + curl + libsecret + ]; - home.packages = with pkgs; [ - kdePackages.qtdeclarative - kdePackages.kirigami.unwrapped - kdePackages.qtmultimedia - kdePackages.sonnet - # ocrScanner DMS plugin — eng/fra/vie and 120+ langs ship in nixpkgs tessdata. - tesseract - # ambientSound DMS plugin — mpv playback + socat IPC to mpv socket. - mpv - socat - # dankVault / emojiLauncher / ephemera — Wayland clipboard. - wl-clipboard - # nixPackageRunner DMS plugin. - jq - # cavaVisualizer DMS plugin. - cava - # ephemera DMS plugin — API requests + optional keyring storage. - curl - libsecret - ]; - programs.dank-material-shell = { - enable = true; + programs.dank-material-shell = { + enable = true; + package = inputs.dms.packages.${pkgs.stdenv.hostPlatform.system}.dms-shell.override { + extraQtPackages = with pkgs.kdePackages; [ qtwebsockets ]; + }; + systemd = { + enable = true; + restartIfChanged = true; + }; + enableSystemMonitoring = true; + dgop.package = inputs.dgop.packages.${pkgs.stdenv.hostPlatform.system}.default; + enableVPN = true; + enableDynamicTheming = true; + enableAudioWavelength = true; + enableCalendarEvents = false; + settings = { }; + session = { }; + }; - # homeAssistantMonitor plugin (QtWebSockets) needs QML on DMS's import path, not just home.packages. - package = inputs.dms.packages.${pkgs.stdenv.hostPlatform.system}.dms-shell.override { - extraQtPackages = with pkgs.kdePackages; [ qtwebsockets ]; - }; + home.activation.dmsSeedConfig = lib.hm.dag.entryAfter [ "writeBoundary" ] "${dmsSeedConfigScript}"; - systemd = { - enable = true; # Systemd service for auto-start - restartIfChanged = true; # Auto-restart dms.service when dankMaterialShell changes - }; + systemd.user.services.dms.serviceConfig.ExecStartPre = + lib.mkOrder 100 "${ensureMatugenOutputDirsScript}"; - # Core features - enableSystemMonitoring = true; # System monitoring widgets (dgop) - dgop.package = inputs.dgop.packages.${pkgs.stdenv.hostPlatform.system}.default; - enableVPN = true; # VPN management widget - enableDynamicTheming = true; # Wallpaper-based theming (matugen) - enableAudioWavelength = true; # Audio visualizer (cava) - enableCalendarEvents = false; # Disable calendar integration (khal/ikhal) - - # Leave `session` at {} — non-empty makes HM rewrite session.json every switch and nukes wallpaper/session state. - # Leave `settings` at {} — UI-owned settings.json is seeded once on first run (see home.activation below). - settings = { }; - session = { }; - }; - - # Detach store symlinks so UI edits survive rebuilds; seed defaults only on a fresh profile. - home.activation.dmsSeedConfig = lib.hm.dag.entryAfter [ "writeBoundary" ] "${dmsSeedConfigScript}"; - - # matugen won't create missing output_path parents; run before DMS theme generation. - systemd.user.services.dms.serviceConfig.ExecStartPre = - lib.mkOrder 100 "${ensureMatugenOutputDirsScript}"; - - # DMS / matugen custom templates. - # - # DMS docs (custom templates): https://danklinux.com/docs/dankmaterialshell/application-themes#custom-matugen-templates - xdg.configFile."matugen/config.toml".text = matugenConfigText; - - xdg.configFile."matugen/templates/dank-discord.css".source = ../templates/dank-discord.css; - xdg.configFile."matugen/templates/hyprland-colors.conf".source = ../templates/hyprland-colors.conf; - xdg.configFile."matugen/templates/ohmyposh-theme.omp.json".source = ../templates/ohmyposh-theme.omp.json; - xdg.configFile."matugen/templates/obsidian-minimal-matugen-colors.css".source = - ../templates/obsidian-minimal-matugen-colors.css; - } - (lib.mkIf ohMyPoshEnabled { - # Same path as matugen `[templates.ohmyposh]`; seeded as a real file by `ensureMatugenOutputDirsScript`. - programs.oh-my-posh = { - useTheme = lib.mkForce null; - configFile = lib.mkForce "${config.xdg.configHome}/oh-my-posh/theme.omp.json"; - }; - }) + xdg.configFile."matugen/config.toml".text = matugenConfigText; + xdg.configFile."matugen/templates/dank-discord.css".source = ../templates/dank-discord.css; + xdg.configFile."matugen/templates/hyprland-colors.conf".source = ../templates/hyprland-colors.conf; + xdg.configFile."matugen/templates/ohmyposh-theme.omp.json".source = ../templates/ohmyposh-theme.omp.json; + xdg.configFile."matugen/templates/obsidian-minimal-matugen-colors.css".source = + ../templates/obsidian-minimal-matugen-colors.css; + } + (lib.mkIf ohMyPoshEnabled { + programs.oh-my-posh = { + useTheme = lib.mkForce null; + configFile = lib.mkForce "${config.xdg.configHome}/oh-my-posh/theme.omp.json"; + }; + }) ]); } diff --git a/modules/desktop/shells/dms/default.nix b/modules/desktop/shells/dms/default.nix index c84c1d3..d4f3bfc 100644 --- a/modules/desktop/shells/dms/default.nix +++ b/modules/desktop/shells/dms/default.nix @@ -1,4 +1,4 @@ -{ inputs, ... }: { +{ ... }: { flake.nixosModules.desktopShellDmsOptions = { lib, ... }: { options.chiasson.desktop.shells.dms = { enableGpuTemp = lib.mkOption { @@ -45,29 +45,5 @@ }; }; - flake.homeManagerModules.desktopShellDms = { - lib, - osConfig ? { }, - ... - }: - let - cfg = lib.attrByPath [ "chiasson" "desktop" "shells" "dms" ] { } osConfig; - selectedShell = lib.attrByPath [ "chiasson" "desktop" "shell" ] null osConfig; - dmsEnabled = selectedShell == "dms"; - hostName = lib.attrByPath [ "networking" "hostName" ] "nixos" osConfig; - rebuildCommand = - if (cfg.rebuildCommand or null) != null then - cfg.rebuildCommand - else - [ "sudo" "nixos-rebuild" "switch" "--flake" ".#${hostName}" ]; - in - { - imports = [ - ./home-manager/default.nix - ]; - - config = lib.mkIf dmsEnabled { - programs.nix-monitor.rebuildCommand = rebuildCommand; - }; - }; + flake.homeManagerModules.desktopShellDms = import ./_private/hm.nix; } diff --git a/modules/desktop/shells/dms/home-manager/scripts/dms-restart-once.sh b/modules/desktop/shells/dms/scripts/dms-restart-once.sh similarity index 100% rename from modules/desktop/shells/dms/home-manager/scripts/dms-restart-once.sh rename to modules/desktop/shells/dms/scripts/dms-restart-once.sh