summaryrefslogtreecommitdiffstats
path: root/nixos/modules/services/display-managers/noctalia-greeter.nix
blob: dd188ee866f4f037dc2427e077c79bb7885f05ef (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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# adapted from upstream
{
  lib,
  pkgs,
  config,
  ...
}:
let
  cfg = config.services.displayManager.noctalia-greeter;
  format = pkgs.formats.toml { };

  inherit (lib)
    escapeShellArgs
    getExe'
    maintainers
    mkDefault
    mkEnableOption
    mkIf
    mkOption
    mkPackageOption
    optionalAttrs
    ;

  inherit (lib.types)
    listOf
    str
    ;
in
{
  options.services.displayManager.noctalia-greeter = {
    enable = mkEnableOption "Noctalia Greeter, a minimal login greeter for greetd";

    package = mkPackageOption pkgs "noctalia-greeter" { };

    extraArgs = mkOption {
      description = "Arguments to add to the noctalia-greeter-session invocation.";
      type = listOf str;
      default = [ ];
    };

    settings = mkOption {
      description = ''
        Settings for noctalia-greeter written to greeter.toml.

        Note that it also can contain some state, like the most recently used
        session, which will be clobbered on every activation and boot. This is
        due to an upstream limitation; the state is due to be moved to another
        file.
      '';
      inherit (format) type;
      default = { };
      example = {
        cursor = {
          theme = "Adwaita";
          size = 24;
        };
        keyboard = {
          layout = "us";
        };
      };
    };

    cursorTheme = {
      package = mkPackageOption pkgs "cursor theme" {
        nullable = true;
        default = null;
      };

      name = mkOption {
        type = str;
        default = "Adwaita";
        description = ''
          Name of the cursor theme to use for noctalia-greeter.
        '';
      };
    };
  };

  config =
    let
      user = config.services.greetd.settings.default_session.user;
      group =
        let
          g = config.users.users.${user}.group or "";
        in
        if g != "" then g else "greeter";
    in
    mkIf cfg.enable {
      assertions = [
        {
          assertion = (config.users.users.${user} or { }) != { };
          message = "noctalia-greeter: user ${user} does not exist. Please create it before referencing it.";
        }
      ];

      services.displayManager.noctalia-greeter.settings.cursor = mkIf (cfg.cursorTheme.package != null) {
        theme = mkDefault cfg.cursorTheme.name;
        path = mkDefault "${cfg.cursorTheme.package}/share/icons";
      };

      environment.systemPackages = [ cfg.package ];

      systemd.tmpfiles.settings."10-noctalia-greeter" = {
        "/var/lib/noctalia-greeter".d = {
          inherit user group;
          mode = "0750";
        };
      }
      // optionalAttrs (cfg.settings != { }) {
        "/var/lib/noctalia-greeter/greeter.toml"."L+" = {
          argument = "${format.generate "greeter.toml" cfg.settings}";
          inherit user group;
          mode = "0644";
        };
      };

      services.greetd = {
        enable = mkDefault true;
        settings.default_session.command = mkDefault "${getExe' cfg.package "noctalia-greeter-session"} ${escapeShellArgs cfg.extraArgs}";
      };

      security.polkit.enable = mkDefault true;
      services.accounts-daemon.enable = mkDefault true;
    };

  meta.maintainers = with maintainers; [
    dtomvan
    samiser
  ];
}