1
1
Fork 0

systemd-lock-handler: initial service

Signed-off-by: Myned <dev@bjork.tech>
This commit is contained in:
Myned 2024-12-30 10:07:38 -06:00
parent 6206af877a
commit 16c480c8f6
Signed by: Myned
GPG key ID: C7224454F7881A34
2 changed files with 94 additions and 0 deletions

View file

@ -49,6 +49,7 @@ with lib; {
#// swayidle.enable = true; #// swayidle.enable = true;
swaync.enable = true; swaync.enable = true;
swayosd.enable = true; swayosd.enable = true;
systemd-lock-handler.enable = true;
usbmuxd.enable = true; usbmuxd.enable = true;
#// xembed-sni-proxy.enable = true; #// xembed-sni-proxy.enable = true;
#// zerotierone.enable = true; #// zerotierone.enable = true;

View file

@ -0,0 +1,93 @@
{
config,
lib,
pkgs,
...
}:
with lib; let
cfg = config.custom.services.systemd-lock-handler;
gtklock = getExe pkgs.gtklock;
hyprlock = getExe config.programs.hyprlock.package;
niri = getExe config.programs.niri.package;
pgrep = getExe' pkgs.procps "pgrep";
sleep = getExe' pkgs.coreutils "sleep";
in {
options.custom.services.systemd-lock-handler = {
enable = mkOption {default = false;};
delay = mkOption {default = 1;}; # Seconds
lock = mkOption {
default =
if config.custom.lockscreen == "gtklock"
then gtklock
else if config.custom.lockscreen == "hyprlock"
then hyprlock
else "";
};
transition = mkOption {default = true;};
};
config = mkIf cfg.enable {
# https://sr.ht/~whynothugo/systemd-lock-handler/
services.systemd-lock-handler.enable = true;
# https://sr.ht/~whynothugo/systemd-lock-handler/#usage
# https://github.com/hyprwm/hypridle/issues/49
systemd.user.services = {
handle-lock = let
delay-ms = toString (cfg.delay * 1000); # Milliseconds
in {
unitConfig = {
Description = "Lockscreen";
# Use Before, not After lock.target
# https://todo.sr.ht/~whynothugo/systemd-lock-handler/4
Before = ["lock.target"];
};
serviceConfig = {
Type = "exec";
ExecCondition = pkgs.writeShellScript "lock-condition" ''
if ${pgrep} ${config.custom.lockscreen}; then
exit 1 # Lockscreen process already running
else
exit 0 # Lockscreen process not found
fi
'';
# HACK: Default red background immediately shows while lockscreen starts, so use transition
# https://github.com/YaLTeR/niri/issues/808
ExecStartPre = mkIf cfg.transition (
if config.custom.desktop == "niri"
then "${niri} msg action do-screen-transition --delay-ms ${delay-ms}"
else ""
);
ExecStart = cfg.lock;
};
requiredBy = ["lock.target" "sleep.target"];
};
handle-sleep = let
# Transition time is about 1 second
delay = toString (cfg.delay + 1); # Seconds
in {
unitConfig = {
Description = "Delay sleep for ${delay}s";
Before = ["sleep.target"];
};
serviceConfig = {
Type = "oneshot";
ExecStart = "${sleep} ${delay}s";
};
requiredBy = ["sleep.target"];
};
};
};
}