aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLibravatar sommerfeld <sommerfeld@sommerfeld.dev>2026-05-29 11:18:13 +0100
committerLibravatar sommerfeld <sommerfeld@sommerfeld.dev>2026-05-29 11:18:13 +0100
commit263f39704ae5e8f44a79d64dce2be048009b4df6 (patch)
treeba994c9800b26cc3f69c4f9fc19ff0651cc06168
parent7ad6f474634f7c359264053bf0f8e93a9bdd37b1 (diff)
downloaddotfiles-263f39704ae5e8f44a79d64dce2be048009b4df6.tar.gz
dotfiles-263f39704ae5e8f44a79d64dce2be048009b4df6.tar.bz2
dotfiles-263f39704ae5e8f44a79d64dce2be048009b4df6.zip
feat(zsh): inhibit suspend while an SSH session is active
A remote session is useless if the laptop suspends mid-command, but logind doesn't suppress lid-close or idle-suspend for SSH sessions on its own — you have to hold an explicit inhibitor lock. When $SSH_CONNECTION is set, re-exec the login shell under `systemd-inhibit --what=sleep:idle:handle-lid-switch --mode=block` so the lock is bound to the shell's lifetime: it covers swayidle, logind's HandleLidSwitch, and any other consumer that respects inhibit locks, and it's released the moment the SSH session ends. A guard env var prevents recursion if the user nests a login shell inside the wrapped one (e.g. `exec zsh -l`).
-rw-r--r--dot_config/zsh/dot_zprofile17
1 files changed, 17 insertions, 0 deletions
diff --git a/dot_config/zsh/dot_zprofile b/dot_config/zsh/dot_zprofile
index 7b79af0..02991cb 100644
--- a/dot_config/zsh/dot_zprofile
+++ b/dot_config/zsh/dot_zprofile
@@ -150,6 +150,23 @@ case $(uname -n) in
;;
esac
+# ── SSH: inhibit suspend/idle while connected ────────────────────────────────
+# A remote session is useless if the laptop suspends mid-command. Wrap the
+# login shell in `systemd-inhibit` so a lock is held for the entire SSH
+# session lifetime (lid close, idle timeout, swayidle, lid-switch handlers
+# all honour it). The lock is released the instant the shell exits, so a
+# clean disconnect restores normal power behaviour.
+if [[ -n $SSH_CONNECTION && -z $__SSH_SUSPEND_INHIBITED ]] \
+ && command -v systemd-inhibit >/dev/null 2>&1; then
+ export __SSH_SUSPEND_INHIBITED=1
+ exec systemd-inhibit \
+ --what=sleep:idle:handle-lid-switch \
+ --who="ssh:${USER}@${HOST}" \
+ --why="active SSH session from ${SSH_CONNECTION%% *}" \
+ --mode=block \
+ "$SHELL" -l
+fi
+
# ── Auto-start sway on VT1 ────────────────────────────────────────────────────
if [[ -z $WAYLAND_DISPLAY && $XDG_VTNR == 1 ]]; then
export XDG_SESSION_TYPE=wayland