nix config
at deck 67 lines 2.0 kB view raw
1{ config, pkgs, lib, ... }: 2with lib; 3let 4 cfg = config.local.dock; 5 inherit (pkgs) stdenv dockutil; 6in 7{ 8 options = { 9 local.dock.enable = mkOption { 10 description = "Enable dock"; 11 default = stdenv.isDarwin; 12 example = false; 13 }; 14 15 local.dock.entries = mkOption 16 { 17 description = "Entries on the Dock"; 18 type = with types; listOf (submodule { 19 options = { 20 path = lib.mkOption { type = str; }; 21 section = lib.mkOption { 22 type = str; 23 default = "apps"; 24 }; 25 options = lib.mkOption { 26 type = str; 27 default = ""; 28 }; 29 }; 30 }); 31 readOnly = true; 32 }; 33 }; 34 35 config = 36 mkIf cfg.enable 37 ( 38 let 39 normalize = path: if hasSuffix ".app" path then path + "/" else path; 40 entryURI = path: "file://" + (builtins.replaceStrings 41 [" " "!" "\"" "#" "$" "%" "&" "'" "(" ")"] 42 ["%20" "%21" "%22" "%23" "%24" "%25" "%26" "%27" "%28" "%29"] 43 (normalize path) 44 ); 45 wantURIs = concatMapStrings 46 (entry: "${entryURI entry.path}\n") 47 cfg.entries; 48 createEntries = concatMapStrings 49 (entry: "${dockutil}/bin/dockutil --no-restart --add '${entry.path}' --section ${entry.section} ${entry.options}\n") 50 cfg.entries; 51 in 52 { 53 system.activationScripts.postUserActivation.text = '' 54 echo >&2 "Setting up the Dock..." 55 haveURIs="$(${dockutil}/bin/dockutil --list | ${pkgs.coreutils}/bin/cut -f2)" 56 if ! diff -wu <(echo -n "$haveURIs") <(echo -n '${wantURIs}') >&2 ; then 57 echo >&2 "Resetting Dock." 58 ${dockutil}/bin/dockutil --no-restart --remove all 59 ${createEntries} 60 killall Dock 61 else 62 echo >&2 "Dock setup complete." 63 fi 64 ''; 65 } 66 ); 67}