From e67ffed047e87561ef6426cc1a25a711d9feccb4 Mon Sep 17 00:00:00 2001 From: Austin Horstman Date: Mon, 22 Apr 2024 22:34:22 -0500 Subject: [PATCH] hyprlock: add module --- modules/misc/news.nix | 11 +++ modules/modules.nix | 1 + modules/programs/hyprlock.nix | 130 ++++++++++++++++++++++++++++++++++ 3 files changed, 142 insertions(+) create mode 100644 modules/programs/hyprlock.nix 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; + }; + }; +}