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.
This commit is contained in:
2026-08-18 08:02:16 -06:00
parent 21dbb16e8b
commit 9e310d2f58
3 changed files with 22 additions and 0 deletions
+4
View File
@@ -2,3 +2,7 @@
hl.env("XCURSOR_SIZE", "24") hl.env("XCURSOR_SIZE", "24")
hl.env("QT_QPA_PLATFORMTHEME", "qt5ct") -- change to qt6ct if you have that 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") 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"))
+12
View File
@@ -23,14 +23,26 @@ listener {
on-timeout = loginctl lock-session # lock screen when timeout has passed 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 { listener {
timeout = 330 # 5.5min 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-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. on-resume = hyprctl dispatch dpms on && brightnessctl -r # screen on when activity is detected after timeout has fired.
} }
listener { listener {
timeout = 1800 # 30min 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 on-timeout = systemctl suspend # suspend pc
} }
+6
View File
@@ -94,6 +94,9 @@ hl.config({
mouse_move_focuses_monitor = false, mouse_move_focuses_monitor = false,
-- Skip drawing the Hyprland logo in the corner of empty workspaces. -- Skip drawing the Hyprland logo in the corner of empty workspaces.
disable_hyprland_logo = true, 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({ hl.config({
debug = { debug = {
vfr = true, vfr = true,
-- Temporarily on to diagnose the mystery re-lock (disable_logs=true
-- default hides dispatch exec lines from hyprland.log).
disable_logs = false,
}, },
}) })