1{
2 config,
3 lib,
4 pkgs,
5 ...
6}:
7let
8 cfg = config.programs.gtklock;
9 configFormat = pkgs.formats.ini {
10 listToValue = builtins.concatStringsSep ";";
11 };
12
13 inherit (lib)
14 types
15 mkOption
16 mkEnableOption
17 mkPackageOption
18 ;
19in
20{
21 options.programs.gtklock = {
22 enable = mkEnableOption "gtklock, a GTK-based lockscreen for Wayland";
23
24 package = mkPackageOption pkgs "gtklock" { };
25
26 config = mkOption {
27 type = configFormat.type;
28 example = lib.literalExpression ''
29 {
30 main = {
31 idle-hide = true;
32 idle-timeout = 10;
33 };
34 }'';
35 description = ''
36 Configuration for gtklock.
37 See [`gtklock(1)`](https://github.com/jovanlanik/gtklock/blob/master/man/gtklock.1.scd) man page for details.
38 '';
39 };
40
41 style = mkOption {
42 type = with types; nullOr str;
43 default = null;
44 description = ''
45 CSS Stylesheet for gtklock.
46 See [gtklock's wiki](https://github.com/jovanlanik/gtklock/wiki#Styling) for details.
47 '';
48 };
49
50 modules = mkOption {
51 type = with types; listOf package;
52 default = [ ];
53 example = lib.literalExpression ''
54 with pkgs; [
55 gtklock-playerctl-module
56 gtklock-powerbar-module
57 gtklock-userinfo-module
58 ]'';
59 description = "gtklock modules to load.";
60 };
61 };
62
63 config = lib.mkIf cfg.enable {
64 programs.gtklock.config.main = {
65 style = lib.mkIf (cfg.style != null) "${pkgs.writeText "style.css" cfg.style}";
66
67 modules = lib.mkIf (cfg.modules != [ ]) (
68 map (pkg: "${pkg}/lib/gtklock/${lib.removePrefix "gtklock-" pkg.pname}.so") cfg.modules
69 );
70 };
71
72 environment.etc."xdg/gtklock/config.ini".source = configFormat.generate "config.ini" cfg.config;
73
74 environment.systemPackages = [ cfg.package ];
75
76 security.pam.services.gtklock = { };
77 };
78}