Two monitors on a desk with the XScreenSaver module bubblecolors stretched across both screens

Since I switched to GNOME and Wayland on my desktop I have been missing XScreenSaver.

JWZ is rightly not planning to add support for this unless there are some significant changes in GNOME.

I felt left out whenever I saw a new version with new hacks being released.

Recently I stumbled over retrosaver by c-premus. It is basically a workaround to run the hacks on GNOME Wayland. It doesn’t lock the screen and leaves that to GNOME, so it isn’t really a replacement for XScreenSaver. At home, this is probably good enough.

Since I am a Fedora fan-boy and upstream only provides Debian packages at the moment, I decided to build RPMs for this for easier installation. I used to be a mainline Fedora packager, but this was clearly better suited to COPR. I haven’t packaged Go RPMs before; this was also fiddly a bit of a learning experience.

The upstream maintainer has been great, incorporating some text changes to enable me to remove a patch that was originally required.

I originally used a hack using systemd to span both of my screens (see photo). Now I have switched to the upstream version which runs the same module on every screen.

Install

sudo dnf copr enable cdamian/retrosaver
sudo dnf install retrosaver
retrosaver setup      # once per user, inside the GNOME Wayland session

The COPR builds for recent Fedoras.

How the package is built

The spec lives in christof/retrosaver-rpm on my Forgejo. COPR clones it and builds with the make_srpm method, which runs .copr/Makefile in a chroot that has network access:

  • spectool downloads the tagged upstream tarball.
  • go_vendor_archive from go-vendor-tools vendors the Go dependencies into a second tarball, and checks their licences.
  • rpmautospec turns %autorelease and %autochangelog into a release number and changelog from the packaging repo’s git history.

Neither tarball is committed, so a version bump is one line in the spec. Renovate watches upstream’s git tags and opens that PR. Merging it triggers the COPR rebuild. A Forgejo Actions job runs the same build on every push, without mock, so a broken spec shows up before COPR sees it.

For comments... reply on Mastodon or find me at @cdamian@rls.social.