Skip to content

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 03 Jun 19:50
· 3 commits to main since this release

Added

  • Multi-monitor mode: independent (default) or mirror. New
    MULTI_MONITOR_MODE config key. independent keeps the existing behavior —
    each output runs its own driver and randomizes its own effect/logo. mirror
    makes every output show the same effect: the launcher rolls one RNG seed
    (and, when RANDOM_LOGO is on, picks one shared logo) and passes them to every
    driver via argv (--seed/--logo), since niri msg action spawn runs in the
    compositor's environment and would not inherit exported vars. Each driver seeds
    tte with SEED + window, where window = wall-clock-seconds / MIRROR_INTERVAL
    (default 8s) — deriving the effect window from the shared wall clock, not a
    per-process counter, is what keeps the monitors on the same effect at the
    same time even though the surfaces spawn at different moments and animate for
    different durations. tte's deterministic RNG then renders identical
    animations on matched-resolution monitors; it degrades to "same effect,
    different layout" when resolutions differ. Surfaced in the Noctalia plugin as a
    Multi-monitor mode dropdown in the Effects section. Only applies with more
    than one output; single-monitor setups are unaffected.
  • Bar widget: left-click is now a smart toggle. Clicking the Noctalia bar
    widget previously always launched the screensaver; it now stops it if it's
    already running and launches it otherwise, so it no longer has to be killed
    from a menu or the CLI. Backed by a new quiet niri-screensaver-launch is-running command (exit 0 if running, 1 if not; also forwarded by
    niri-screensaver-ctl) that the widget probes on click. Right-click still
    opens the full Trigger / Stop / Toggle / Settings menu.
  • Bar widget: Quit and Reload menu items. The right-click menu gains
    Quit (stop the screensaver and disable it, so idle won't relaunch it
    until re-enabled) and Reload (stop the screensaver, restart the Noctalia
    shell so the systray reappears, and leave the screensaver enabled — a one-shot
    fresh start, run detached so it survives qs kill).

Fixed

  • Multi-monitor: surfaces no longer collapse onto one output under
    focus-follows-mouse.
    niri-screensaver-launch previously spread one
    Alacritty per output by cycling keyboard focus
    (niri msg action focus-monitor-next) between spawns. With niri's
    input { focus-follows-mouse }, window placement follows the pointer, not
    keyboard focus, and the pointer isn't parked until after the spawn loop — so
    every surface opened on the cursor's monitor and the others stayed blank. The
    launcher now enumerates outputs once up front and pins each spawned surface to
    its target output by window id
    (niri msg action move-window-to-monitor --id <id> <output>), which is
    independent of pointer/keyboard focus. Outputs are enumerated a single time so
    N>2 monitors and mid-launch hotplug are handled deterministically. A new
    NIRI_SCREENSAVER_SPAWN_PIN_TIMEOUT_SECS env var (default 2) bounds how long
    the launcher waits for each surface to appear before moving on. Thanks to
    @landryjeanluc for the report and root-cause analysis (#11).
  • Multi-monitor: dismissing one screen now wakes all of them. Each output
    runs its own driver in its own terminal, and a keypress only reaches the
    focused one — so on a multi-monitor setup, dismissing the active screen left
    the others still running the screensaver. The driver now broadcasts a
    terminate to its sibling instances on dismiss (dismiss_all
    terminate_sibling_drivers, which SIGTERMs the other niri-screensaver run
    processes via a /proc scan that skips its own PID). Siblings exit through
    the normal signal path and do not re-broadcast, so there is no signal storm.
    Surfaced once #11's fix made surfaces actually spread across outputs.