From 01df321e907b6c8568bb8622eb44a5c1486a0631 Mon Sep 17 00:00:00 2001 From: sommerfeld Date: Fri, 29 May 2026 11:18:13 +0100 Subject: feat(suspend): hold inhibit lock while any zellij session exists MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The SSH-shell inhibitor in dot_zprofile is bound to the lifetime of the login shell, so it disappears the moment the user detaches a zellij session and disconnects — defeating the whole point of using zellij for persistent remote work. Add a user-scope path+service+watcher trio that ties the inhibit lock to the existence of zellij sessions instead: - dot_local/bin/executable_zellij-inhibit-watcher Polls `zellij list-sessions --short` every 15s, exits when none remain. Override poll interval via $ZELLIJ_INHIBIT_POLL. - dot_config/systemd/user/zellij-inhibit-suspend.service Wraps the watcher in `systemd-inhibit --what=sleep:idle:handle-lid-switch --mode=block`. When the watcher exits, the service stops and the lock is released. - dot_config/systemd/user/zellij-inhibit-suspend.path Activates the service whenever $XDG_RUNTIME_DIR/zellij becomes non-empty (i.e. zellij creates its first session socket). Re-fires on every empty→non-empty transition. Enable via systemd-units/user.txt (the .path unit; the service is on-demand). The existing SSH-shell inhibitor is kept as a backstop for non-zellij remote sessions and is now documented as such. VM (nix/vm.nix) deliberately not updated: the Ubuntu remote-dev VM never suspends, so the inhibit machinery would be inert there. --- dot_config/zsh/dot_zprofile | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'dot_config/zsh/dot_zprofile') diff --git a/dot_config/zsh/dot_zprofile b/dot_config/zsh/dot_zprofile index 02991cb..a26209b 100644 --- a/dot_config/zsh/dot_zprofile +++ b/dot_config/zsh/dot_zprofile @@ -151,11 +151,14 @@ 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. +# Backstop for SSH sessions that don't use zellij. (The dedicated +# zellij-inhibit-suspend.path user unit already covers any host that has +# at least one live zellij session — that one survives detach/disconnect, +# which this in-shell inhibitor does not.) +# +# Wrap the login shell in `systemd-inhibit` so a lock is held for the +# entire SSH session lifetime; the lock is released the instant the +# shell exits. if [[ -n $SSH_CONNECTION && -z $__SSH_SUSPEND_INHIBITED ]] \ && command -v systemd-inhibit >/dev/null 2>&1; then export __SSH_SUSPEND_INHIBITED=1 -- cgit v1.3.1