pinwheel: Replace swaylock with hyprlock

Fixes black internal screen after unlocking with external monitor
disconnected, and occasional Hyprland crashes on lock.
This commit is contained in:
Alexander Heldt
2026-02-23 10:44:31 +01:00
parent 7d6785f27e
commit ac1c5c372f
3 changed files with 33 additions and 18 deletions

View File

@@ -14,7 +14,7 @@ in
nix-index.enable = false; nix-index.enable = false;
greetd.enable = true; greetd.enable = true;
hyprland.enable = true; hyprland.enable = true;
swaylock.enable = true; hyprlock.enable = true;
physlock.enable = false; physlock.enable = false;
power.enable = true; power.enable = true;

View File

@@ -5,13 +5,13 @@
... ...
}: }:
let let
enabled = config.mod.swaylock.enable; enabled = config.mod.hyprlock.enable;
hyprlandEnabled = config.mod.hyprland.enable; hyprlandEnabled = config.mod.hyprland.enable;
in in
{ {
options = { options = {
mod.swaylock = { mod.hyprlock = {
enable = lib.mkEnableOption "enable swaylock module"; enable = lib.mkEnableOption "enable hyprlock module";
dpmsTimeout = lib.mkOption { dpmsTimeout = lib.mkOption {
description = "timeout in seconds before DPMS is turned on"; description = "timeout in seconds before DPMS is turned on";
@@ -23,13 +23,32 @@ in
config = lib.mkIf enabled { config = lib.mkIf enabled {
home-manager.users.alex = { home-manager.users.alex = {
programs.swaylock = { programs.hyprlock = {
enable = true; enable = true;
settings = { settings = {
color = "000000"; general = {
indicator-idle-visible = false; hide_cursor = true;
show-failed-attempts = true; };
background = [
{
color = "rgb(000000)";
}
];
input-field = [
{
size = "250, 50";
position = "0, 0";
halign = "center";
valign = "center";
outline_thickness = 2;
dots_center = true;
fade_on_empty = true;
placeholder_text = "";
}
];
}; };
}; };
@@ -39,18 +58,18 @@ in
let let
pause-music = "${pkgs.playerctl}/bin/playerctl -p spotify pause"; pause-music = "${pkgs.playerctl}/bin/playerctl -p spotify pause";
dpmsTimeout = config.mod.swaylock.dpmsTimeout; dpmsTimeout = config.mod.hyprlock.dpmsTimeout;
dpms-lock = pkgs.writeShellScript "dpms-lock" '' dpms-lock = pkgs.writeShellScript "dpms-lock" ''
${pkgs.swayidle}/bin/swayidle \ ${pkgs.swayidle}/bin/swayidle \
timeout ${dpmsTimeout} "${pkgs.hyprland}/bin/hyprctl dispatch dpms off" \ timeout ${dpmsTimeout} "${pkgs.hyprland}/bin/hyprctl dispatch dpms off" \
resume "${pkgs.hyprland}/bin/hyprctl dispatch dpms on" & resume "${pkgs.hyprland}/bin/hyprctl dispatch dpms on" &
${pkgs.swaylock}/bin/swaylock && ${pkgs.procps}/bin/pkill swayidle ${pkgs.hyprlock}/bin/hyprlock && ${pkgs.procps}/bin/pkill swayidle
''; '';
in in
[ [
"$mod, x, exec, ${pause-music}; ${dpms-lock}" "$mod, x, exec, ${pause-music}; ${dpms-lock}"
"$mod SHIFT, x, exec, ${pause-music}; ${pkgs.swaylock}/bin/swaylock -f; systemctl suspend" "$mod SHIFT, x, exec, ${pause-music}; ${pkgs.hyprlock}/bin/hyprlock & sleep 0.5; systemctl suspend"
]; ];
}; };
}; };
@@ -59,11 +78,7 @@ in
security = { security = {
polkit.enable = true; polkit.enable = true;
pam.services.swaylock.text = '' pam.services.hyprlock = {};
# PAM configuration file for the swaylock screen locker. By default, it includes
# the 'login' configuration file (see /etc/pam.d/login)
auth include login
'';
}; };
}; };
} }

View File

@@ -80,7 +80,7 @@ in
path = [ path = [
pkgs.coreutils # For `cat` pkgs.coreutils # For `cat`
pkgs.libnotify pkgs.libnotify
pkgs.swaylock pkgs.hyprlock
]; ];
script = script =
@@ -103,7 +103,7 @@ in
BATTERY_STATUS=$(cat /sys/class/power_supply/${lowbat.battery}/status) BATTERY_STATUS=$(cat /sys/class/power_supply/${lowbat.battery}/status)
if [[ $BATTERY_STATUS = "Discharging" ]]; then if [[ $BATTERY_STATUS = "Discharging" ]]; then
${pause-music}; ${pkgs.swaylock}/bin/swaylock -f; systemctl suspend ${pause-music}; ${pkgs.hyprlock}/bin/hyprlock & sleep 0.5; systemctl suspend
fi fi
fi fi
''; '';