aboutsummaryrefslogtreecommitdiff
path: root/home-manager/modules/xresources.nix
blob: dc59e50c46ea0223399d20a7b8e5d5692a46cd20 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
{ config, lib, pkgs, ... }:

with lib;

let

  cfg = config.xresources;

  formatLine = n: v:
    let
      formatList = x:
        if isList x then
          throw "can not convert 2-dimensional lists to Xresources format"
        else
          formatValue x;

      formatValue = v:
        if isBool v then
          (if v then "true" else "false")
        else if isList v then
          concatMapStringsSep ", " formatList v
        else
          toString v;
    in "${n}: ${formatValue v}";

in {
  meta.maintainers = [ maintainers.rycee ];

  options = {
    xresources.properties = mkOption {
      type = with types;
        let
          prim = either bool (either int str);
          entry = either prim (listOf prim);
        in nullOr (attrsOf entry);
      default = null;
      example = literalExample ''
        {
          "Emacs*toolBar" = 0;
          "XTerm*faceName" = "dejavu sans mono";
          "XTerm*charClass" = [ "37:48" "45-47:48" "58:48" "64:48" "126:48" ];
        }
      '';
      description = ''
        X server resources that should be set.
        Booleans are formatted as "true" or "false" respectively.
        List elements are recursively formatted as a string and joined by commas.
        All other values are directly formatted using builtins.toString. 
        Note, that 2-dimensional lists are not supported and specifying one will throw an exception.
        If this and all other xresources options are
        <code>null</code>, then this feature is disabled and no
        <filename>~/.Xresources</filename> link is produced.
      '';
    };

    xresources.extraConfig = mkOption {
      type = types.lines;
      default = "";
      example = literalExample ''
        builtins.readFile (
            pkgs.fetchFromGitHub {
                owner = "solarized";
                repo = "xresources";
                rev = "025ceddbddf55f2eb4ab40b05889148aab9699fc";
                sha256 = "0lxv37gmh38y9d3l8nbnsm1mskcv10g3i83j0kac0a2qmypv1k9f";
            } + "/Xresources.dark"
        )
      '';
      description = ''
        Additional X server resources contents.
        If this and all other xresources options are
        <code>null</code>, then this feature is disabled and no
        <filename>~/.Xresources</filename> link is produced.
      '';
    };
  };

  config = mkIf ((cfg.properties != null && cfg.properties != { })
    || cfg.extraConfig != "") {
      home.file.".Xresources" = {
        text = concatStringsSep "\n" ([ ]
          ++ optional (cfg.extraConfig != "") cfg.extraConfig
          ++ optionals (cfg.properties != null)
          (mapAttrsToList formatLine cfg.properties)) + "\n";
        onChange = ''
          if [[ -v DISPLAY ]] ; then
            $DRY_RUN_CMD ${pkgs.xorg.xrdb}/bin/xrdb -merge $HOME/.Xresources
          fi
        '';
      };
    };
}