# RPM spec for vigil (repo: vigil). Built in COPR from a local SRPM produced # by packaging/build-srpm.sh (source tarball from the git tag + vendored # cargo deps as Source1 — no rust-*-devel packages needed). # # The package depends on greetd. %post points stock agreety at vigil and # enables greetd as the display manager when none is set. Custom greetd # command lines stay operator-owned. /etc/pam.d/vigil-lock ships as a # pass-through hook (auth include login) — a named place for operator # policy, not an opinion about it. # # The test suite runs by default; disable for a one-off build with # --without check. %bcond_without check Name: vigil Version: 0.3.6 Release: 1%{?dist} Summary: Compositor-less greetd greeter and matching session lockscreen License: GPL-3.0-only URL: https://github.com/MasonRhodesDev/vigil Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz Source1: %{name}-%{version}-vendor.tar.xz BuildRequires: cargo-rpm-macros >= 24 BuildRequires: systemd-rpm-macros # smithay backends: libseat + libinput + libdrm/gbm + libudev; xkbcommon for # keymaps; pam for the locker (pam-sys runs bindgen, hence clang). BuildRequires: libseat-devel BuildRequires: libinput-devel BuildRequires: libxkbcommon-devel BuildRequires: systemd-devel BuildRequires: libdrm-devel BuildRequires: mesa-libgbm-devel BuildRequires: pam-devel BuildRequires: clang-devel BuildRequires: fontconfig-devel # The greeter runs as greetd's `greeter` user on greetd's socket. Requires: greetd # groupadd in %pre for the shared monitor-profiles group. Requires(pre): shadow-utils # The package creates this shared group in %%pre. Declare the capability so # RPM's file-owner dependency for /etc/monitor-profiles is self-satisfied. Provides: group(monitor-profiles) %description vigil is a multi-monitor, themeable greetd greeter that renders directly on KMS/DRM — no compositor in the login path — plus vigil-lock, a session lockscreen speaking ext-session-lock-v1 that shares the greeter's theme, config, and auth seams. One Rust binary per surface, Slint scenes per output, runtime .slint themes with a compiled-in fallback. %prep # -a1 unpacks vendor/ and its generated git source replacements. %autosetup -p1 -a1 %cargo_prep -v vendor # %%cargo_prep redirects crates.io only. Append the exact tagged/revision git # replacements captured by cargo vendor in build-srpm.sh. cfg=.cargo/config.toml [ -f "$cfg" ] || cfg=.cargo/config cat vendor-git-sources.toml >> "$cfg" %build # vigil's default features include `gl` (FemtoVG over GBM/EGL). %cargo_build %{cargo_license_summary} %{cargo_license} > LICENSE.dependencies %install # The build phase already produced both workspace binaries. Installing those # artifacts avoids a second `cargo install` resolution from each member crate, # which has no workspace lockfile and cannot resolve vendored Git sources. install -Dpm0755 target/rpm/vigil %{buildroot}%{_bindir}/vigil install -Dpm0755 target/rpm/vigil-lock %{buildroot}%{_bindir}/vigil-lock install -Dpm0755 target/rpm/vigil-sim %{buildroot}%{_bindir}/vigil-sim install -Dpm0755 dist/setup-greetd %{buildroot}%{_prefix}/lib/vigil/setup-greetd install -Dpm0644 dist/vigil.tmpfiles %{buildroot}%{_tmpfilesdir}/vigil.conf # Fedora's greetd package creates user "greetd", not Arch's "greeter". # setup-greetd subsequently reconciles the directory with the account in an # existing operator-owned greetd config, which may deliberately be different. sed -i 's/ greeter greeter / greetd greetd /' %{buildroot}%{_tmpfilesdir}/vigil.conf install -Dpm0644 dist/vigil-lock.pam %{buildroot}%{_sysconfdir}/pam.d/vigil-lock install -Dpm0644 dist/vigil.toml.example %{buildroot}%{_datadir}/vigil/vigil.toml.example install -Dpm0644 themes/default/theme.slint %{buildroot}%{_datadir}/vigil/themes/default.slint install -d %{buildroot}%{_datadir}/vigil/slint-kit/ui install -pm0644 themes/kit/ui/*.slint %{buildroot}%{_datadir}/vigil/slint-kit/ui/ install -d -m2775 %{buildroot}%{_sysconfdir}/monitor-profiles %if %{with check} %check %cargo_test %endif %pre # Shared monitor-profile group. The greeter reads layouts from # /etc/monitor-profiles so the login screen arranges monitors the way the # session will; the directory is group-writable so a desktop user can edit # them without root, with no username baked in. hyprstate creates the same # group and co-owns the directory with identical attributes -- either package # may be installed alone. getent group monitor-profiles >/dev/null || groupadd -r monitor-profiles || : # /var/lib/vigil itself comes from the tmpfiles.d snippet via systemd's file # triggers (no scriptlet needed on current Fedora). %post %{_prefix}/lib/vigil/setup-greetd >/dev/null 2>&1 || : %files %license LICENSE LICENSE.dependencies %doc README.md %{_bindir}/vigil %{_bindir}/vigil-lock %{_bindir}/vigil-sim %{_prefix}/lib/vigil/setup-greetd %{_tmpfilesdir}/vigil.conf %config(noreplace) %{_sysconfdir}/pam.d/vigil-lock %{_datadir}/vigil/ %dir %attr(2775,root,monitor-profiles) %{_sysconfdir}/monitor-profiles %changelog * Thu Sep 04 2026 Mason Rhodes - 0.3.6-1 - A correct password is no longer intermittently rejected. Every PAM worker shared one event channel with no attempt identity, so a superseded or detached worker's late "conversation failed" retired the LIVE attempt, cascading into repeated failures and a faillock lockout. Each attempt now owns its channel; a retired worker's events are unreachable. A conversation loss (vigil's own transport error, which pam_unix reports identically to a wrong password) is classified apart from a real denial and reopened quietly, never surfaced as a failure. - The lockscreen now names a faillock lockout and counts down to release ("Account locked - try again in Nm Ss") instead of showing a bare authentication failure, read from the user's own faillock tally. * Thu Sep 04 2026 Mason Rhodes - 0.3.5-1 - The warn-to-lock handoff is one continuous image. The first lock frame was an opaque black placeholder (canvas.fill(0)) even though the fully rendered scene sat in the retained shadow; it is now the scene itself, with black only as the no-scene fallback (--no-warn/--immediate). A mixed-fractional-scale rebind path that could leave an output permanently black is fixed alongside. - Frame-hash observability (VIGIL_FRAME_HASH=1): a stable FNV-1a of every committed buffer, emitted post-commit so the diagnostic cannot perturb the handoff it measures. The nested harness gains a locked-to-commit gate (stable at 2-4 ms) and a first-frame-not-black check - the assertion that actually detects this bug class. * Wed Sep 03 2026 Mason Rhodes - 0.3.4-1 - Unlock is instant and blur-free by default: the lock wallpaper is released the moment authentication succeeds, with no reveal fade, tint, or scheduled frames. Blur is now strictly the pre-lock warning (the frost ramp that signals the device is about to lock) and never touches unlock. - The reveal is an opt-in modular slot: lock.transition.wallpaper_out_ms > 0 fades the wallpaper out on unlock, and frost_out_ms > 0 adds a fading blur to it (both default off). * Tue Aug 26 2026 Mason Rhodes - 0.3.3-1 - A locked, idle session no longer burns CPU. present() acquired a wl_shm buffer before testing whether the scene was dirty and dropped it un-attached when it was not; the compositor answers every wl_buffer.destroy with delete_id, which wakes the event loop, which acquires another. Measured on mason-desktop at 38% of a core on average and 70% at peak while locked, with Hyprland paying another 24%, and nothing ever drawn. Presenters now ask whether an output owes a present before acquiring anything (desktop-commons ADR 0007); the greeter's own loop does the same. - An element whose start keyframe can never resolve settles instead of rendering invisible for the whole lock while requesting a frame every 33ms. * Sat Aug 22 2026 Mason Rhodes - 0.3.2-1 - singleton-guard resolves xdg-paths from crates.io; allow the desktop-commons git source in deny.toml. * Sat Aug 22 2026 Mason Rhodes - 0.3.1-1 - Depend on xdg-paths 0.2.0, slint-idle-runtime 0.2.0, and singleton-guard from desktop-commons (renamed crates). - Nested lock-readiness harness: errexit-safe probe and S1 diagnostics. * Thu Aug 20 2026 Mason Rhodes - 0.3.0-1 - Add capture-free compositor frost warnings with tint-only fallback. - Add cancelable idle policy, atomic session-lock handoff, and join IPC. - Ship the safe in-session simulator for login, lock, and warning development. * Thu Aug 20 2026 Mason Rhodes - 0.2.16-1 - Vendor exact Cargo Git source replacements for fully offline RPM builds. - Preflight the vendored dependency graph offline while constructing the SRPM. * Thu Aug 20 2026 Mason Rhodes - 0.2.15-1 - Admit the pinned hypr-slint-runtime release in the supply-chain policy. * Thu Aug 20 2026 Mason Rhodes - 0.2.14-1 - Replace fixed-rate Slint polling with event-driven, per-output rendering. - Defer fullscreen buffer acquisition until an output is actually dirty. - Bound presenter retry backoff and disable idle caret animation. * Wed Aug 19 2026 Mason Rhodes - 0.2.13-1 - Synchronize the background-worker wake test with the callback it verifies. * Wed Aug 19 2026 Mason Rhodes - 0.2.12-1 - Reuse shared canonical monitor identity across greeter and lockscreen. - Stabilize Wayland output identity and detach daemonized lock startup cleanly. - Preserve non-blocking native cached background presentation on every output. * Tue Aug 18 2026 Mason Rhodes - 0.2.11-1 - Keep the restart and shutdown controls left-aligned at bounded widths. * Tue Aug 18 2026 Mason Rhodes - 0.2.10-1 - Reconcile /var/lib/vigil ownership with the greeter account selected by an existing greetd config, preserving operator-owned configuration and state. * Mon Aug 17 2026 Mason Rhodes - 0.2.9-1 - Fedora: own /var/lib/vigil as greetd's "greetd" user (Arch's is "greeter"), so remembered user/session state actually persists; setup-greetd probes for the distro's greeter account instead of hardcoding one. * Sun Aug 16 2026 Mason Rhodes - 0.2.8-1 - Embed slint-kit UI so the default theme compiles without the build-host cargo git checkout (packaged greeter panic on a fresh install). * Sun Aug 16 2026 Mason Rhodes - 0.2.7-1 - Snapshot Arch sources on tag builds so the PKGBUILD checksum can match. * Sun Aug 16 2026 Mason Rhodes - 0.2.6-1 - Commit lock buffers on every configure, including same-size DPMS/VT. - Defer lock wallpaper decode until after the first painted frame. - Do not rebuild the lock scene when only scale/configure repeats. * Fri Aug 14 2026 Mason Rhodes - 0.2.5-1 - Resolve per-user backgrounds through appearance-profiles. - Cache and render user backgrounds off the UI thread. - Focus the Hyprstate monitor-profile origin in vigil and vigil-lock. * Thu Aug 13 2026 Mason Rhodes - 0.2.4-1 - Reload shared monitor profiles while the greeter is running (#31). - Pin monitor-profiles to aef5f0e (to_toml/CLI release). * Thu Aug 06 2026 Mason Rhodes - 0.2.2-1 - logind integration (SetLockedHint, Lock/Unlock, sleep invalidates grace); user list with Other… fallback; session default policy * Wed Aug 05 2026 Mason Rhodes - 0.2.1-1 - Remember last user/session (empty username = one-keypress relogin); /etc/pam.d/vigil-lock policy-free pass-through hook * Wed Aug 05 2026 Mason Rhodes - 0.2.0-1 - First packaged release: greeter (M1.5 spec-complete, multi-GPU) + vigil-lock (L1 + grace), vigil.toml config, tmpfiles.d state dir