From 9e310d2f58f73e5065c78179691ce115a5a756f0 Mon Sep 17 00:00:00 2001 From: Samuel O'Neal Date: Tue, 18 Aug 2026 08:02:16 -0600 Subject: [PATCH] hyprland: prepend PATH, gate idle inhibitors, allow lock restore - Prepend ~/.local/bin to PATH so user scripts (hyprlock wrapper, weather.sh) resolve before system binaries. - Gate dpms-off and suspend on lock screen running (condition_cmd) so idle inhibitors from apps work while unlocked but screen still blanks and machine suspends after lock. - Enable allow_session_lock_restore so a crashed lock client can be replaced. - Temporarily enable debug logging to diagnose re-lock issues. --- hyprland/.config/hypr/env.lua | 4 ++++ hyprland/.config/hypr/hypridle.conf | 12 ++++++++++++ hyprland/.config/hypr/hyprland.lua | 6 ++++++ 3 files changed, 22 insertions(+) diff --git a/hyprland/.config/hypr/env.lua b/hyprland/.config/hypr/env.lua index ca4f03d..303bdbb 100644 --- a/hyprland/.config/hypr/env.lua +++ b/hyprland/.config/hypr/env.lua @@ -2,3 +2,7 @@ hl.env("XCURSOR_SIZE", "24") hl.env("QT_QPA_PLATFORMTHEME", "qt5ct") -- change to qt6ct if you have that hl.env("SUDO_ASKPASS", os.getenv("HOME") .. "/.local/bin/sudo-askpass.sh") +-- Prepend ~/.local/bin so `hyprlock` (and other user scripts) resolve to the +-- crash-guard wrapper instead of /usr/bin/hyprlock. Hyprland's exec/keybind +-- PATH is otherwise the system PATH and misses user-local binaries. +hl.env("PATH", os.getenv("HOME") .. "/.local/bin:" .. (os.getenv("PATH") or "/usr/bin:/bin")) diff --git a/hyprland/.config/hypr/hypridle.conf b/hyprland/.config/hypr/hypridle.conf index 51e950a..652bd70 100644 --- a/hyprland/.config/hypr/hypridle.conf +++ b/hyprland/.config/hypr/hypridle.conf @@ -23,14 +23,26 @@ listener { on-timeout = loginctl lock-session # lock screen when timeout has passed } +# The dpms-off and suspend listeners ignore idle inhibitors (Steam, browsers, +# etc. hold them) so the screen still blanks and the machine still suspends +# after the screen is locked -- otherwise a held inhibitor would keep the +# locked screen on forever. `condition_cmd` gates them on the lock screen +# actually running, so inhibitors keep working as intended while unlocked +# (e.g. a video keeps the screen awake). listener { timeout = 330 # 5.5min + ignore_inhibit = true # fire even while apps hold idle inhibitors + condition_cmd = pidof hyprlock > /dev/null # ...but only once the session is locked + condition_retry = 30 # if not locked yet, re-check every 30s while idle on-timeout = hyprctl dispatch dpms off # screen off when timeout has passed on-resume = hyprctl dispatch dpms on && brightnessctl -r # screen on when activity is detected after timeout has fired. } listener { timeout = 1800 # 30min + ignore_inhibit = true # fire even while apps hold idle inhibitors + condition_cmd = pidof hyprlock > /dev/null # ...but only while the session is locked + condition_retry = 60 # if not locked yet, re-check every 60s while idle on-timeout = systemctl suspend # suspend pc } diff --git a/hyprland/.config/hypr/hyprland.lua b/hyprland/.config/hypr/hyprland.lua index 62cb745..ec0e98d 100644 --- a/hyprland/.config/hypr/hyprland.lua +++ b/hyprland/.config/hypr/hyprland.lua @@ -94,6 +94,9 @@ hl.config({ mouse_move_focuses_monitor = false, -- Skip drawing the Hyprland logo in the corner of empty workspaces. disable_hyprland_logo = true, + -- Allow a new hyprlock to take over the lock after a crash; without this a + -- dead lock client leaves the session permanently locked (no lockscreen). + allow_session_lock_restore = true, }, }) @@ -103,5 +106,8 @@ hl.config({ hl.config({ debug = { vfr = true, + -- Temporarily on to diagnose the mystery re-lock (disable_logs=true + -- default hides dispatch exec lines from hyprland.log). + disable_logs = false, }, })