diff --git a/modules/misc/news.nix b/modules/misc/news.nix
index 92d3e9f54..335bb5e73 100644
--- a/modules/misc/news.nix
+++ b/modules/misc/news.nix
@@ -1584,6 +1584,17 @@ in {
https://conky.cc/ for more.
'';
}
+
+ {
+ time = "2024-04-29T19:23:09+00:00";
+ condition = hostPlatform.isLinux;
+ message = ''
+ A new module is available: 'programs.hyprlock'.
+
+ Hyprland's simple, yet multi-threaded and GPU-accelerated screen locking utility.
+ See https://github.com/hyprwm/hyprlock for more.
+ '';
+ }
];
};
}
diff --git a/modules/modules.nix b/modules/modules.nix
index 7c81102a9..bcab21bb0 100644
--- a/modules/modules.nix
+++ b/modules/modules.nix
@@ -116,6 +116,7 @@ let
./programs/hstr.nix
./programs/htop.nix
./programs/hyfetch.nix
+ ./programs/hyprlock.nix
./programs/i3blocks.nix
./programs/i3status-rust.nix
./programs/i3status.nix
diff --git a/modules/programs/hyprlock.nix b/modules/programs/hyprlock.nix
new file mode 100644
index 000000000..ffcbdf326
--- /dev/null
+++ b/modules/programs/hyprlock.nix
@@ -0,0 +1,130 @@
+{ config, pkgs, lib, ... }:
+with lib;
+let cfg = config.programs.hyprlock;
+in {
+ meta.maintainers = [ maintainers.khaneliman maintainers.fufexan ];
+
+ options.programs.hyprlock = {
+ enable = mkEnableOption "" // {
+ description = ''
+ Whether to enable Hyprlock, Hyprland's GPU-accelerated lock screen utility.
+
+ Note that PAM must be configured to enable hyprlock to perform
+ authentication. The package installed through home-manager
+ will *not* be able to unlock the session without this
+ configuration.
+
+ On NixOS, it can be enabled using:
+
+ ```nix
+ security.pam.services.hyprlock = {};
+ ```
+ '';
+ };
+
+ package = mkOption {
+ description = "The hyprlock package";
+ type = types.package;
+ default = pkgs.hyprlock;
+ };
+
+ settings = lib.mkOption {
+ type = with lib.types;
+ let
+ valueType = nullOr (oneOf [
+ bool
+ int
+ float
+ str
+ path
+ (attrsOf valueType)
+ (listOf valueType)
+ ]) // {
+ description = "Hyprlock configuration value";
+ };
+ in valueType;
+ default = { };
+ description = ''
+ Hyprlock configuration written in Nix. Entries with the same key
+ should be written as lists. Variables' and colors' names should be
+ quoted. See for more examples.
+ '';
+ example = lib.literalExpression ''
+ {
+ general = {
+ disable_loading_bar = true;
+ grace = 300;
+ hide_cursor = true;
+ no_fade_in = false;
+ };
+
+ background = [
+ {
+ path = "screenshot";
+ blur_passes = 3;
+ blur_size = 8;
+ }
+ ];
+
+ input-field = [
+ {
+ size = "200, 50";
+ position = "0, -80";
+ monitor = "";
+ dots_center = true;
+ fade_on_empty = false;
+ font_color = "rgb(202, 211, 245)";
+ inner_color = "rgb(91, 96, 120)";
+ outer_color = "rgb(24, 25, 38)";
+ outline_thickness = 5;
+ placeholder_text = '\'Password...'\';
+ shadow_passes = 2;
+ }
+ ];
+ }
+ '';
+ };
+
+ extraConfig = lib.mkOption {
+ type = lib.types.lines;
+ default = "";
+ example = ''
+ # window resize
+ bind = $mod, S, submap, resize
+ '';
+ description = ''
+ Extra configuration lines to add to `~/.config/hypr/hyprlock.conf`.
+ '';
+ };
+
+ sourceFirst = lib.mkEnableOption ''
+ putting source entries at the top of the configuration
+ '' // {
+ default = true;
+ };
+
+ importantPrefixes = lib.mkOption {
+ type = with lib.types; listOf str;
+ default = [ "$" "monitor" "size" ]
+ ++ lib.optionals cfg.sourceFirst [ "source" ];
+ example = [ "$" "monitor" "size" ];
+ description = ''
+ List of prefix of attributes to source at the top of the config.
+ '';
+ };
+ };
+
+ config = mkIf cfg.enable {
+ home.packages = [ cfg.package ];
+
+ xdg.configFile."hypr/hyprlock.conf" =
+ let shouldGenerate = cfg.extraConfig != "" || cfg.settings != { };
+ in mkIf shouldGenerate {
+ text = lib.optionalString (cfg.settings != { })
+ (lib.hm.generators.toHyprconf {
+ attrs = cfg.settings;
+ inherit (cfg) importantPrefixes;
+ }) + lib.optionalString (cfg.extraConfig != null) cfg.extraConfig;
+ };
+ };
+}