nix config
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}