From ec3734c5ef9fcfe97c21cd19f198ec779ab5f052 Mon Sep 17 00:00:00 2001 From: sommerfeld Date: Fri, 29 May 2026 11:18:15 +0100 Subject: refactor(suspend): gate suspend on AC, drop bespoke zellij inhibit New, simpler suspend policy: AC plugged in -> never auto-suspends (lid close ignored, idle no-op) On battery only -> lid close suspends, swayidle suspends at 30 min idle This replaces the SSH/zellij-aware inhibit machinery with a rule that matches the user's mental model: if you don't want the machine to sleep, plug it in. Long-running tasks (builds, downloads, SSH sessions, headless services) just need AC. Changes: * etc/systemd/logind.conf.d/20-lid-ac.conf: set HandleLidSwitchExternalPower=ignore so logind itself handles the AC case at the source. No userspace daemon, no race, no rate-limit risk. * dot_local/bin/on-battery-suspend: tiny POSIX wrapper that exits 0 when any /sys/class/power_supply/{AC,ADP}*/online == 1, else execs `systemctl suspend`. * dot_config/systemd/user/swayidle.service: add `timeout 1800 on-battery-suspend`. Idle suspend now exists, but only when on battery. * Delete zellij-inhibit-suspend.{path,service} + watcher script and remove the entry from systemd-units/user.txt. The .path re-trigger storm bug is moot because the whole mechanism is gone. Manual suspends (sway XF86Sleep keybind, sway power submode `s`, `systemctl suspend` over SSH) still always work regardless of AC -- explicit user intent wins. Also drop /migrate-podman-to-btrfs.sh from .gitignore; the one-off migration script has been deleted now that the user has switched their podman storage to the btrfs driver. On-host steps to apply: chezmoi apply -v systemctl --user daemon-reload systemctl --user reset-failed zellij-inhibit-suspend.service zellij-inhibit-suspend.path || true systemctl --user stop zellij-inhibit-suspend.path zellij-inhibit-suspend.service || true systemctl --user disable zellij-inhibit-suspend.path || true systemctl --user restart swayidle.service # logind drop-in is reloaded automatically by the etc deploy script. Verify: systemctl status systemd-logind | grep -i lid loginctl show-session $XDG_SESSION_ID | grep -i lid # Unplug AC -> close lid -> should suspend. # Plug AC -> close lid -> nothing happens. --- etc/systemd/logind.conf.d/20-lid-ac.conf | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 etc/systemd/logind.conf.d/20-lid-ac.conf (limited to 'etc/systemd/logind.conf.d/20-lid-ac.conf') diff --git a/etc/systemd/logind.conf.d/20-lid-ac.conf b/etc/systemd/logind.conf.d/20-lid-ac.conf new file mode 100644 index 0000000..08e5014 --- /dev/null +++ b/etc/systemd/logind.conf.d/20-lid-ac.conf @@ -0,0 +1,14 @@ +[Login] +# Suspend policy: closing the lid suspends ONLY when on battery. When +# AC is connected the lid switch is ignored entirely. The rationale is +# simple and matches user mental model -- if you don't want the +# machine to sleep, plug it in. +# +# This obsoletes the previous SSH/zellij-aware inhibit machinery: any +# long-running task (build, download, SSH session, server) just needs +# AC and will never be suspended out from under itself. +# +# `HandleLidSwitch` (default = suspend) still applies on battery. +# `HandleLidSwitchDocked` (default = ignore) still applies when an +# external monitor / dock is attached. +HandleLidSwitchExternalPower=ignore -- cgit v1.3.1