Files
mesh-catalog/modules/screen-lock

screen-lock

The lock screen, idle timeouts and display power as one module (novox/hq ADR 0208, research 026/04).

  • Installs xss-lock and the distribution's i3lock. Claims the mesh's node-lock-screen seat and serves its verb lock. Requires x11-display on its own machine.

  • Declares absent (ADR 0180), as replaced and not coming back:

    • i3lock-color, the colour build from the user repository;
    • xscreensaver, a second screensaver that was installed and deliberately never started.
  • Places the locker ~/.local/bin/screen-lock. The lock key ($mod+Delete) is the i3 module's. It asks logind to lock and names no locker, so it does not depend on which module holds the seat.

  • At session start, through the xinitrc slot normal, it:

    • sets the timeouts: lock after 30 minutes idle, displays to standby and suspend at 30 minutes and off at 60;
    • starts xss-lock --transfer-sleep-lock, which runs the locker on idle, before suspend and on logind's Lock, so the lock key, a closed lid and a suspend all lead to one locker.

    xss-lock stays out of the units on purpose. It must find its own login session, and a user unit runs in the service manager's session instead, where xss-lock silently finds none.

Tools

tool does
node-lock-screen.lock lock now, through logind, so the session's one locker answers; answers since when
screen_lock_idle the idle and display power timeouts in force; change any of them for this session
screen_lock_inhibit keep the screen on and unlocked for N minutes, then restore; 0 ends it early
screen_lock_locked locked or not and since when, whether xss-lock runs, whether an inhibition holds

An inhibition runs under the account's service manager (screen-lock-inhibit.service). Stopping it restores the timeouts at once. It holds off the idle lock and display power only: a lock asked for by hand, by the lid or before suspend still locks.

Decided: the distribution's i3lock now

The colour build lives in the user repository, and the colours are the only difference. The module uses the official i3lock (black, failed attempts shown, an empty Enter ignored). The colour build can come back as a pinned archive of this module (ADR 0205). That is a follow-up, and only the locker's options change with it.

What it improves on what was found

  • The machine no longer waits for the unlock to suspend. The found wrapper started i3lock with xss-lock's sleep lock inherited, so a suspend was held until logind's delay ran out. The new locker follows xss-lock's own pattern: the lock is released as soon as i3lock is up.
  • One locker. A second lock while locked does nothing. The power menu locks through logind instead of starting its own i3lock.
  • The respawn loop ends with the session. The found loop kept retrying every two seconds after logout.
  • The timeouts are set once, in one place. On the laptop, measured on 2026-10-04, the screensaver timeout in force was 600 s, not the 1800 s the start script asked for.

What it leaves as found

  • ~/.xscreensaver, xscreensaver's configuration file. Remove it once the package is gone.
  • ~/scripts/my-i3lock, the predecessor's wrapper, which only the colour build understands.

Migration (ADR 0182)

  1. Before the first push, remove the colour build by hand: sudo pacman -R i3lock-color. pacman --noconfirm will not replace a conflicting package. If the host installs i3lock before it removes i3lock-color, the first push fails on the conflict.
  2. Once the xorg module writes the session's start, delete from your own part of ~/.xinitrc:
    • the xset s and xset dpms lines;
    • the while true; do xss-lock … my-i3lock; …; done & loop.
  3. Delete ~/.xscreensaver and ~/scripts/my-i3lock.

Blockers

  • node-lock-screen, x11-display and the xinitrc slot are ADR 0208's. Until the controller knows them, mctl reads them as unknown.
  • xset comes with the display server's module (xorg).