# Fedora and EL spec for slideshow-lock 1.0.9. # # Legend for the comments in this file: # [K] known: read from this repository (the file is named) or from a source named in the comment # [M] measured: a tool was run (in a scratch root or in COPR), the tool and its version, or the # COPR build, are named in the comment # [H] background knowledge about RPM, systemd and the Fedora packaging guidelines, NOT verified # # STATUS of the 1.0.0 builds (2026-10-06; the COPR builds named here are of 1.0.0, 1.0.1, 1.0.2, 1.0.3, 1.0.4, 1.0.5, 1.0.6, 1.0.7 and 1.0.8 are not # covered by them): built in COPR (project trensoft/slideshow-lock) in all four chroots, in two builds: # 11084376 of main 0ac5c23 before the fix of the cairo typelib, which failed on the three Fedora # chroots, and 11084605 of main 2f45728 (the committish in the log of the SRPM build) after the fix, # which succeeded on all four. COPR runs rpmbuild in one mock build root per chroot. [M] read from the # COPR API (api_3) and the builder logs of the build 11084605, which started at 2026-10-06 12:05 UTC # and whose last chroot finished at 12:10 UTC: # epel-10-x86_64, fedora-43-x86_64, fedora-44-x86_64, fedora-rawhide-x86_64 (the last one made fc46 # packages): all four SUCCEEDED; %%check ran to the end in each of them (the # import check of 16 modules, glib-compile-schemas --strict --dry-run, # desktop-file-validate, appstreamcli validate --no-net: no error; the last # one prints "developer-info-missing" as its one info and says "infos: 1, # pedantic: 2", the two pedantic tags are not named in the log) and the # noarch RPM was written # Build 11084376 (before the fix) SUCCEEDED on epel-10-x86_64; on fedora-43, fedora-44 # and fedora-rawhide (x86_64) it FAILED in %%check, all three with the same error: # %%pyproject_check_import, "Typelib file for namespace 'cairo', version '1.0' not found", for # slideshow_lock.preferences, .preview_app, .preview_window and .service. The cause, and the # BuildRequires and Requires that fix it, are named at those two lines below. Before the second COPR # build the fix was also tried in rootless Fedora 43 and CentOS Stream 10 build roots made of the # packages (exact versions) of the COPR logs, with rpmbuild 6.0.2 and 4.19.1.1 of those roots, no # scriptlets run: the build, %%check included, passed on both. # [M] rpmlint 2.8.0 and fedora-review ran in the COPR build 11084605 on the three Fedora chroots (the # results are in the fedora-review/ directory of each: review.txt, rpmlint.txt). rpmlint ran with the # Fedora configuration (/etc/xdg/rpmlint/fedora.toml) on the built noarch RPM and on the source RPM, # and printed the same in fedora-43, fedora-44 and fedora-rawhide: 0 errors, 2 warnings # (no-manual-page-for-binary and empty-%%postun), 7 filtered. That is the result for the 1.0.0 spec of # that build. [M] The build 11092273 of 1.0.5-1 (rpmlint.txt of fedora-43, fedora-44 and fedora-rawhide, # identical) prints 1 error, 2 warnings, 7 filtered: "E: explicit-lib-dependency libadwaita" (rpmlint # only looks at the name "libadwaita" of the Requires; the program loads the typelib Adw-1 through # PyGObject and no repository has a typelib(Adw) provide), and the warnings no-manual-page-for-binary # for slideshow-lock and slideshowlock (empty-%%postun is gone: the spec has a %%posttrans). At that # time the error was filtered by packaging/fedora/slideshow-lock.rpmlintrc, which was not part of the # SRPM: with "rpmlint --rpmlintrc" the same files gave 0 errors, 2 warnings. Since 1.0.8 the spec asks # for "libadwaita >= 1.2" and the package has two manual pages: [M] rpmlint 2.8.0 (the Fedora # configuration) on the spec, the SRPM and the RPM built in a rootless root of CentOS Stream 10 and of # Fedora 43 says 0 errors, 0 warnings; the rpmlintrc is gone, because with the filter left in place the # same rpmlint reports it as the error unused-rpmlintrc-filter. fedora-review (rc 0) wrote its template; # the review.txt of the three chroots lists 70 items (counted with the pattern "^\[.\]:" so that the two # legend lines are not counted): 35 marked "[x]", 2 marked "[!]" (the download of Source0, which fails # because the tag v1.0.0 did not exist yet when that run was made, and the reminder to test the build # in mock) and 33 marked "[ ]" (manual review needed, still open); it has 1 entry under "Issues:" # (the systemd user unit scriptlets, which the %%post and %%preun of this spec provide). There is no # fedora-review/ directory and no rpmlint output on epel-10, and none for the build 11084376 (no such # directory in any of its chroots). # NOT run: mock by hand, rpmlint and fedora-review on epel-10, an install of the RPM on a Fedora or EL # machine, the test suite (--with tests), a real GNOME session. The review.txt says "[x]: Package # installs properly" because fedora-review installed the built package in a mock root of COPR (the log # says "Installing built package(s)", with the mock configuration of the build); that is not an # install on a Fedora or EL machine, and whether the root held the BuildRequires is not read from # the log. # # Prerequisites that are not in this file: # - Source0 (the GitHub archive of the tag v%%{version}) can be downloaded only once that tag # exists. A tag is made at a release, when the review of the final commit is green and the # version is bumped (docs/RELEASING.md). A protected or signed tag and a SHA-512 of the tarball # are to be fixed at release time. A release has to be cut after po/*.po (the catalogs are in # the repository) and after the files listed next. # - The files this spec installs are in the repository and must stay there: # data/io.github.trensoft.slideshowlock.desktop.in, # data/io.github.trensoft.slideshowlock.metainfo.xml.in (the only copies in git: the installed # files are generated from them in %%install) and the two icons under # data/icons/hicolor/. packaging/slideshow-lock and data/slideshow-lock.service are the launcher # and the user unit. # Decisions of the maintainer, taken outside this repository (not read from it): # - The name and e-mail address in %%changelog are the maintainer's choice (2026-10-05). The # repository is public, so they stay in the history of main. # - License GPL-3.0-or-later is the maintainer's decision (2026-10-05). Since 1.0.8 the 22 modules of # slideshow_lock/ and the two launchers carry it as an SPDX header (SPDX-FileCopyrightText: 2026 # TrenSoft, SPDX-License-Identifier: GPL-3.0-or-later); README.md and the metainfo say "or later" # as well, and LICENSE is the plain GPLv3 text. # Open items, not code (they need a later step): # - A second spec (an EL one) would be ignored again by the "*.spec" line of .gitignore; the file # here is tracked, so it is not affected. # - The unit is not enabled by the package by itself. %%systemd_user_post runs "systemctl --no-reload # preset --global" on the first install [M: systemd-update-helper.in of systemd v256, read], so # the unit is enabled for everybody only if a preset of the distribution says so; no preset is # shipped here; the on/off toggle that the settings window is meant to get (docs/service.md, # section 7) would enable it. The service is started at login by the XDG autostart entry below # ("slideshowlock autostart" starts the unit through the user's systemd), not by an enable. # - %%check runs the whole test suite only with "--with tests" (off by default): it needs a private # dbus-daemon and the GTK 4 typelibs, and no build root has been tried with it. # Open questions, NOT measured (background knowledge only, do not read them as verified): # - [H] PyGObject>=3.42 in the dependencies makes the generated Requires ask for # python3dist(pygobject); [M] a Fedora 43 rpmlint run of the earlier spec says the requirement is # generated (python-leftover-require), not measured again here; whether python3-gobject provides it on # EL10 is not known. # - [H] %%{_metainfodir} is not defined by rpm itself [M: not in macros.in of rpm 4.18.2, 4.19.1 # and 4.20.0, read]; the line below defines it when nothing else does. # - [H] the package names of the build requirements and of the typelibs on RHEL 10, AlmaLinux 10, # Rocky 10 (run.sh says itself that its names are "likely, not verified on RHEL 10.2"). # - setuptools in the four COPR chroots: [M] python3-setuptools 69.0.3-12.el10 (epel-10), # 78.1.1-15.fc43, 80.10.2-3.fc44, 84.0.0-1.fc46 (rawhide): the same versions are in the builder # logs of the build 11084605 (2026-10-06) and in the repository metadata read on 2026-10-09 (CentOS # Stream 10 BaseOS, Fedora 43 and 44 release, rawhide); the EPEL 10 repository has no # python3-setuptools of its own (primary.xml read 2026-10-09). [M] setuptools 84.0.0 builds the # wheel of this repository with one deprecation warning for license = { file = "LICENSE" } (a # deadline of 2027-Feb-18 in the message), no failure. [M] The SPDX string license = "GPL-3.0-or-later" (PEP 639) was tried on 2026-10-09 in a # rootless root of each: setuptools 78.1.1 builds the wheel, setuptools 69.0.3 stops with # "`project.license` must be valid exactly by one definition" (it only knows the table with # "file" or "text"). So pyproject.toml keeps the table form until EL10 has setuptools 77 or newer. %global app_id io.github.trensoft.slideshowlock # [K] app_id is APP_ID of slideshow_lock/__init__.py: the GSettings schema id and the gettext domain, # and the name of the .desktop file, the metainfo file and the icons (the app id of the program) %{!?_metainfodir:%global _metainfodir %{_datadir}/metainfo} # [H] the usual place of AppStream metainfo files is /usr/share/metainfo %bcond tests 0 # [H] "%%bcond tests 0" defines the switch off by default; "rpmbuild --with tests" turns it on Name: slideshow-lock # [K] "slideshow-lock" is the name in pyproject.toml; the package name is not derived from APP_ID Version: 1.0.9 # [K] pyproject.toml says version = "1.0.9" Release: 1%{?dist} # [H] a plain Release: with an explicit %%changelog below. %%autorelease/%%autochangelog are not # used on purpose: the changelog would be built from the git log of this repository Summary: Idle slideshow screensaver for GNOME on Wayland that locks on input License: GPL-3.0-or-later AND CC-BY-SA-4.0 # GPL-3.0-or-later is the maintainer's decision (2026-10-05): LICENSE is the plain GPLv3 text, # pyproject.toml says license = { file = "LICENSE" } and, since 1.0.8, the modules and the two # launchers carry an SPDX header (tests/test_packaging.py keeps it). CC-BY-SA-4.0 is the licence of the # seven sample pictures (data/pictures, [K] the credit is data/pictures/CREDITS.txt, the text is # packaging/licenses/CC-BY-SA-4.0.txt); the binary # package holds both, hence AND. [H] an SPDX expression in License: is what the guidelines ask for; # NOT measured: that rpmlint and the Fedora licence data accept CC-BY-SA-4.0 for pictures (a COPR # build of this version, with its rpmlint run, will show). URL: https://github.com/trensoft/slideshow-lock Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz # [H] the usual form of a GitHub tag tarball; it unpacks into slideshow-lock-%%{version}/ # The tag v1.0.8 exists; the tag v1.0.9 does not exist yet, it is made at the release (see the prerequisites at the top). BuildArch: noarch # [K] pure Python: slideshow_lock/*.py only, no extension module BuildRequires: python3-devel # [H] python3-devel brings in the %%pyproject_* macros; setuptools comes from # %%pyproject_buildrequires, which reads [build-system] of pyproject.toml ([K]: setuptools>=68) BuildRequires: gettext # [K] tools/i18n.sh build and data need msgfmt (package: gettext, as the tool itself says) # [H] msgfmt --xml finds the ITS rules of the metainfo in the data directory of the gettext # installation (tools/i18n.sh says so). [M] in the COPR build 11084605 "bash tools/i18n.sh data # generated-data" (it runs msgfmt --desktop and msgfmt --xml, [K] tools/i18n.sh) ended without error # in %%install in all four chroots, and appstreamcli validate accepted the metainfo it wrote, so the # gettext of those four build roots has what it needs. BuildRequires: glib2-devel # [K] run.sh names glib2-devel for glib-compile-schemas; used in %%check only BuildRequires: systemd-rpm-macros # [H] the package of %%{_userunitdir} and %%systemd_user_*; its macros were read in the source of # systemd v256 (src/rpm/macros.systemd.in), which is where the package takes them from BuildRequires: desktop-file-utils # [H] desktop-file-validate is in desktop-file-utils; used in %%check only BuildRequires: appstream # [H] appstreamcli is in the package appstream; used in %%check only BuildRequires: libappstream-glib # [M] appstream-util is a file of the package libappstream-glib (the file list of the RPMs of Fedora 43 # and CentOS Stream 10, read); used in %%check only. The AppData guideline of Fedora asks for # "appstream-util validate-relax" next to the BuildRequires ([K] audit of 2026-10-09, item 6; the # guideline text itself is [H]). [M] the package is in every repository of the four chroots of the COPR # project (primary.xml read on 2026-10-09): CentOS Stream 10 AppStream 0.8.3-2.el10 and 0.8.3-3.el10 # (the epel-10 chroot has that repository; EPEL 10 itself has none), Fedora 43 0.8.3-4.fc43 and # 0.8.4-1.fc43, Fedora 44 0.8.3-5.fc44 and 0.8.4-1.fc44, rawhide 0.8.4-1.fc45, so the line is not # conditional # Needed by %%check (the import test) and by the program at run time. # [K] the package names are the ones run.sh prints for each missing typelib: # gi -> python3-gobject, Gtk/Gdk 4.0 -> gtk4, Graphene 1.0 -> graphene, # GdkPixbuf 2.0 -> gdk-pixbuf2, Gio/GLib 2.0 -> glib2 # [K] run.sh itself says these names are "likely", not verified on RHEL 10.2 BuildRequires: python3-gobject BuildRequires: gtk4 BuildRequires: graphene BuildRequires: gdk-pixbuf2 BuildRequires: glib2 BuildRequires: libadwaita # [M] the settings window is built on libadwaita, which Python loads as gi.require_version("Adw", "1") # (the typelib Adw-1.typelib, a file of the package libadwaita itself, not of libadwaita-devel). The line # is here for the %%check below: %%pyproject_check_import imports every module, so the build root needs # the typelib as soon as one of them does (slideshow_lock/preferences.py does). [M] read in the # live repodata (primary.xml and filelists.xml) on 2026-10-07: CentOS Stream 10 AppStream has libadwaita # 1.6.10-1.el10 (and 1.6.0, 1.6.1, 1.6.6), Fedora 43 has 1.8.1-1.fc43 (release) and 1.8.8-1.fc43 # (updates), EPEL 10 has none (it is not needed). [M] in a rootless CentOS Stream 10 root with the # libadwaita-1.6.10-1.el10 and appstream-1.0.2-5.el10 files unpacked (no scriptlets, no dnf), # gi.require_version("Adw", "1") loads Adw 1.6.10. NOT measured: the same on Fedora 43. BuildRequires: gobject-introspection # [M] cairo-1.0.typelib is a file of the package gobject-introspection (the rpm of Fedora 43, 44 and # rawhide and the filelists of the Fedora 43 and CentOS Stream 10 repositories, read). No module of # this package imports cairo: the typelibs of Gtk 4.0 and Gdk 4.0 depend on cairo 1.0, and loading # them loads it. [M] In the Fedora 43 updates repository (primary metadata read) gtk4 4.20.4-1.fc43 and # python3-gobject-base 3.54.5-4.fc43 do not require gobject-introspection, so the minimal Fedora build # root of COPR (build 11084376) had no cairo typelib and the import check of %%check failed there. In # the Fedora 43 release repository the python3-gobject-base 3.54.3-1.fc43 still requires it # (gobject-introspection(x86-64)); its gtk4 4.20.2-1.fc43 does not. python3-gobject-base 3.46.0-7.el10 # requires it as well (read in the primary metadata of the CentOS Stream 10 BaseOS repository), which is # why the epel-10 chroot passed. %if %{with tests} # [K] the test run (.github/workflows/ci.yml) needs pytest, the GStreamer typelib and dbus-daemon # next to the above; [H] the package names BuildRequires: python3-pytest BuildRequires: gstreamer1-plugins-base BuildRequires: dbus-daemon %endif # [K] the program loads these typelibs through gi.require_version (slideshow_lock/*.py); # [H] a typelib dependency may also be written as typelib(Gtk) = 4.0, package names are used here # Not listed on purpose: python3-gobject and glib2 (no "Requires: python3-gobject", no "Requires: # glib2"). [M: in a Fedora 43 container, with the earlier spec, which had both lines; not measured # again here] rpmlint printed python-leftover-require for python3-gobject (the generated # python3dist(pygobject) requirement covers it, see the open question above) and # explicit-lib-dependency for glib2. [H] glib2 arrives through gtk4 and gdk-pixbuf2, which link its # shared libraries, and it is what python3-gobject needs as well. [M] the COPR build 11084605 passed # on all four chroots, but its build roots have python3-gobject and glib2 installed (BuildRequires), so # it does not show that nothing is missing at run time; only an install of the RPM on a minimal Fedora # or EL machine can (NOT run, see STATUS). The one typelib package that is listed by name, # gobject-introspection, is explained at its own line. Requires: gtk4 Requires: libadwaita >= 1.2 # [M] the same package as the BuildRequires above, for the run time: the typelib Adw-1 is in it. A # dependency on the typelib itself cannot be written: no primary.xml of CentOS Stream 10 (BaseOS, # AppStream, CRB), EPEL 10 or Fedora 43 (release, updates) has a typelib(...) provide, so the package # name is the dependency. [M] libadwaita 1.6.10-1.el10 requires gtk4 >= 4.15.2 (EL10 has 4.16.7-6.el10), # libadwaita 1.8.8-1.fc43 requires gtk4 >= 4.17.5 (Fedora 43 has 4.20.4-1.fc43); appstream, fribidi, # graphene and pango are in the same repositories. # The version: the window code uses only what libadwaita 1.2 has, and Adw.EntryRow (the folder row, # slideshow_lock/preferences.py) is the newest of it: it came with 1.2. [M] read in the sources of # libadwaita 1.2.0, 1.6.10 (EL10) and 1.8.8 (Fedora 43) from download.gnome.org: the classes used are # ApplicationWindow, Application, HeaderBar, Clamp, PreferencesGroup, PreferencesRow, ActionRow, ComboRow # and EntryRow; every function and property of them that the module calls or sets (set_content, add, # add_suffix, set_activatable_widget, subtitle, title, model, selected, set_description, set_child, # maximum-size, tightening-threshold, the entry-activated signal and the GtkEditable text of the # EntryRow) is in the headers and the sources of 1.2.0; what the later releases added to these classes # (ADW_AVAILABLE_IN_1_3 and newer: for example Clamp unit, HeaderBar show-title, ComboRow enable-search) # is not used. The number is also what removes the rpmlint error explicit-lib-dependency, which fires # only for an unversioned Requires on a library-like name ([M] rpmlint 2.8.0, TagsCheck.py). [M] On the # noarch RPMs built from this spec in rootless roots of CentOS Stream 10 and of Fedora 43 (2026-10-09): # the 1.0.7 spec with a bare "Requires: libadwaita" gives "E: explicit-lib-dependency libadwaita", this # one gives no error. Revisit the number when the window code uses something newer # (tests/test_packaging.py fails when it uses a class that is newer than 1.2). Requires: graphene Requires: gdk-pixbuf2 # [M] the cairo typelib is needed at run time as well: in a Fedora 43 root made of the requirements of # this package, with the dependencies resolved by hand inside the package set of the COPR build, # gtk4 and python3-gobject-base do not bring gobject-introspection, and "from gi.repository import # Gtk" fails with the missing cairo typelib; with the line below the import of Gtk and of # slideshow_lock.preferences, .service, .preview_app and .preview_window works. EL10 gets the package # through python3-gobject-base already; the line is for Fedora. Requires: gobject-introspection Requires: hicolor-icon-theme # [H] the package that owns the hicolor directories the icons go into Recommends: gstreamer1-plugins-base # [K] optional: scaling.py falls back to GdkPixbuf bilinear without the GStreamer videoscale element # (run.sh: "optional"). [H] gstreamer1-plugins-base is the package run.sh names for it. # Picture formats (docs/image-source.md, "Picture formats"): on EL10 the loaders for TIFF and GIF are in # gdk-pixbuf2-modules (AppStream, base repositories), and those for BMP and WebP are in packages that # only EPEL 10 has: gdk-pixbuf2-modules-extra and webp-pixbuf-loader. [M: by the solution architect, from # the RPM file lists and primary.xml of Rocky 10.2 and EPEL 10; not measured again here] The EPEL ones # are weak dependencies on purpose: the package must not need EPEL. [H] dnf installs a weak dependency # that no enabled repository has without a message and without failing; not measured. Fedora needs none # of these (gdk-pixbuf2 pulls in glycin, which loads the formats); NOT measured on Fedora 43 or later. %if 0%{?rhel} Requires: gdk-pixbuf2-modules Recommends: webp-pixbuf-loader Recommends: gdk-pixbuf2-modules-extra %endif %description slideshow-lock starts a full-screen picture slideshow on the screens of a GNOME session on Wayland when the session has been idle, and locks the session when the user touches the keyboard or the mouse. The pictures come from a folder, the settings have a GTK 4 window of their own, and the interface follows the language of the session. %prep %autosetup %generate_buildrequires %pyproject_buildrequires # [H] writes the build dependencies of pyproject.toml into the build root instead of a hand-kept list %build %pyproject_wheel %install %pyproject_install %pyproject_save_files -l slideshow_lock # [K] [tool.setuptools.packages.find] include = ["slideshow_lock*"]: 16 .py files, no subpackage, # no data files; data/, packaging/ and po/ are not part of the wheel, so they are installed below # [M] the wheel built by setuptools 84.0.0 has METADATA with "License-File: LICENSE" and the file # in slideshow_lock-1.0.0.dist-info/licenses/LICENSE. [K] %%pyproject_save_files marks the files # named in License-File as %%license (pyproject_save_files.py of pyproject-rpm-macros, read), so # there is no %%license line in %%files; -l asks the macro to fail the build if it finds none. # The command. [K] pyproject.toml has no [project.scripts]; packaging/slideshow-lock is the one # launcher: "slideshow-lock service|settings|preview" starts slideshow_lock.service, .settings_app # or .preview_app (the sub-commands of run.sh). The unit and the .desktop file call it. install -Dpm 0755 packaging/%{name} %{buildroot}%{_bindir}/%{name} # The short command. [K] packaging/slideshowlock is a small sh launcher: "slideshowlock" is # "slideshow-lock control" (start the service, open the settings window); a separate file, no # symlink, no argv0 test. install -Dpm 0755 packaging/slideshowlock %{buildroot}%{_bindir}/slideshowlock # The sample pictures. [K] data/pictures/ holds the seven JPEG files (the metadata taken out but the # author and the licence in Exif and XMP, see tools/strip_jpeg_metadata.py) and CREDITS.txt; slideshow_lock/sample_pictures.py copies them into # the user's pictures folder at the first login, from /slideshow-lock/pictures (its # APP_DIR and DATA_SUBDIR; tests/test_packaging.py compares this line with the two constants). # [K] the folder is made here and not left to the file list, so that it is root:root 0755 whatever # the umask of the build is. -p keeps the time of the files, 0644 is the mode (no execute bit). install -d -m 0755 %{buildroot}%{_datadir}/%{name}/pictures install -pm 0644 data/pictures/* %{buildroot}%{_datadir}/%{name}/pictures/ # [H] "install" fails without a file for the glob: a package without its pictures is not built # The settings schema. [K] data/%%{app_id}.gschema.xml, run.sh compiles the same file into a cache install -Dpm 0644 data/%{app_id}.gschema.xml \ %{buildroot}%{_datadir}/glib-2.0/schemas/%{app_id}.gschema.xml # [H] glib2 compiles installed schemas by itself (file trigger), so there is no scriptlet here # The user unit. [K] data/slideshow-lock.service runs "/usr/bin/slideshow-lock service" install -Dpm 0644 data/%{name}.service %{buildroot}%{_userunitdir}/%{name}.service # [M] %%{_userunitdir} is set from USER_DATA_UNIT_DIR, which is prefixdir / 'lib/systemd/user' in # meson.build of systemd v256 (read): /usr/lib/systemd/user; [H] the same value on the target distributions # The autostart entry. [K] data/%%{app_id}.autostart.desktop runs "/usr/bin/slideshowlock autostart" # at login (GNOME only, NoDisplay): the service is started, and the settings window opens the first # time, while no picture folder is chosen. It goes to /etc/xdg/autostart under the name of the # app id. [H] %%config(noreplace) so that an edit of the administrator stays; a user turns it off # with an entry of the same name in ~/.config/autostart that says Hidden=true or # X-GNOME-Autostart-enabled=false (not measured here). install -Dpm 0644 data/%{app_id}.autostart.desktop \ %{buildroot}%{_sysconfdir}/xdg/autostart/%{app_id}.desktop # The manual pages. [K] packaging/man/ holds slideshow-lock.1 (the four commands) and slideshowlock.1 # (the short command); they describe the command lines of the modules, and tests/test_man_pages.py # compares every option with the --help of the program. [H] rpm compresses them after %%install. install -Dpm 0644 packaging/man/slideshow-lock.1 %{buildroot}%{_mandir}/man1/slideshow-lock.1 install -Dpm 0644 packaging/man/slideshowlock.1 %{buildroot}%{_mandir}/man1/slideshowlock.1 # The desktop entry, the AppStream metainfo and the icons. [K] the app id names all four files. # [K] the .desktop file and the metainfo are generated from data/.desktop.in and # data/.metainfo.xml.in with the translations of the catalogs: "tools/i18n.sh data DIR" writes # DIR/.desktop and DIR/.metainfo.xml (msgfmt --desktop and msgfmt --xml). The directory is # relative to the source tree, which is the current directory in %%install. bash tools/i18n.sh data generated-data install -Dpm 0644 generated-data/%{app_id}.desktop \ %{buildroot}%{_datadir}/applications/%{app_id}.desktop install -Dpm 0644 generated-data/%{app_id}.metainfo.xml \ %{buildroot}%{_metainfodir}/%{app_id}.metainfo.xml install -Dpm 0644 data/icons/hicolor/scalable/apps/%{app_id}.svg \ %{buildroot}%{_datadir}/icons/hicolor/scalable/apps/%{app_id}.svg install -Dpm 0644 data/icons/hicolor/symbolic/apps/%{app_id}-symbolic.svg \ %{buildroot}%{_datadir}/icons/hicolor/symbolic/apps/%{app_id}-symbolic.svg # [H] the icon cache is refreshed by a file trigger of the icon theme packages: no scriptlet here # The translations. [K] tools/i18n.sh build DIR writes DIR//LC_MESSAGES/.mo for the # languages of po/LINGUAS (40 in 1.0.5); slideshow_lock/i18n.py reads /share/locale bash tools/i18n.sh build %{buildroot}%{_datadir}/locale %find_lang %{app_id} # [M] find-lang.sh of rpm 4.18.0 (the same option parsing as in rpm 4.19.1, read): with the five # catalogs of 1.0.0 (1.0.5 has 40) in a scratch build root it writes %%{app_id}.lang with five # %%lang(..) lines, exit 0. # Without a catalog it prints "No translations found" and exits 1, so a build that lost its # catalogs fails instead of shipping an English-only package. The option --allow-no-translations of # the earlier version of this spec is NOT in find-lang.sh of rpm 4.18.0 or 4.19.1: it is taken as the # name of the output file, and the build stops with "No translations found" even when the catalogs # are there [M: run with the option, exit 1]. It is gone. [H] a Fedora rpm may carry a patch for it. %check # [H] imports every module of the package: the typelibs must load, no display is needed to import %pyproject_check_import # [H] a dry run (nothing is written): the schema must compile; run.sh runs glib-compile-schemas on it too glib-compile-schemas --strict --dry-run %{buildroot}%{_datadir}/glib-2.0/schemas # [H] the validators of the files that were installed (the installed paths, not the source tree) desktop-file-validate %{buildroot}%{_datadir}/applications/%{app_id}.desktop desktop-file-validate %{buildroot}%{_sysconfdir}/xdg/autostart/%{app_id}.desktop appstreamcli validate --no-net %{buildroot}%{_metainfodir}/%{app_id}.metainfo.xml appstream-util validate-relax --nonet %{buildroot}%{_metainfodir}/%{app_id}.metainfo.xml %if %{with tests} %pytest # [K] pyproject.toml: testpaths = ["tests"]; [H] the suite needs no display (CI runs it headless) %endif # [M] from the macros.systemd of systemd-rpm-macros (the same file, byte for byte, in EL10 257-34, # Fedora 43 258-1 and 258.11, Fedora 44 259.5 and 259.9 and rawhide 262-3) and the # systemd-update-helper of the systemd package of those releases (read): %%systemd_user_post runs # "systemctl --no-reload preset --global " on the first install only; %%systemd_user_preun, on # removal (not on upgrade), runs "systemctl --global disable --no-warn " and, only when # /run/systemd/system exists (systemd is the running init), also "systemctl --user -M @ disable # --now --no-warn " for every logged-in user. # # The running service is restarted after an upgrade by %%systemd_user_posttrans_with_restart: when # /run/systemd/system exists and the package is upgraded (not installed or removed), it marks the # unit "needs-restart" in the user manager of every logged-in user ("systemctl --user -M @ # set-property Markers=+needs-restart"); it restarts nothing itself. The restart follows at the # end of the transaction from a file trigger of the systemd package for /usr/lib/systemd/user # ("systemd-update-helper user-restart": "reload-or-restart --marked" in each user manager; the # helper of rawhide 262-3 says "enqueue-marked"), so nobody has to run "systemctl --user restart" # after "dnf upgrade". Every failure in these scriptlets is ignored ("|| :"): none stops the upgrade. # It is %%posttrans and not %%postun on purpose: on an upgrade the %%postun that runs is the one of # the OLD package, so a %%postun_with_restart in this spec would act only from the second upgrade on # and not on the first one from a version that has none (1.0.1 and before had an empty # %%systemd_user_postun). The %%posttrans of the NEW package runs on every upgrade. # [M] on the EL10 build root (rpm 4.19.1.1) with the real systemd 257-34 file triggers and a logging # "systemctl": an upgrade from a build with the empty %%postun to one with %%postun_with_restart # marked nothing; to one with this %%posttrans it marked the unit and then ran "reload-or-restart # --marked" for the logged-in user. NOT measured: a real "dnf upgrade" with a logged-in GNOME session (a stub # "systemctl" stood in for systemd), and Fedora 43/44/rawhide transactions (only the packages were read). %post %systemd_user_post %{name}.service %preun %systemd_user_preun %{name}.service %posttrans %systemd_user_posttrans_with_restart %{name}.service %files -f %{pyproject_files} -f %{app_id}.lang %doc README.md %license packaging/licenses/CC-BY-SA-4.0.txt # [M] the wheel of setuptools 84.0.0 has License-File: LICENSE only (see %%install), so the licence of # the pictures is not claimed twice by %%pyproject_save_files; the name and the folder # packaging/licenses/ match no default licence-file pattern of setuptools (LICEN[CS]E*, COPYING*, # NOTICE*, AUTHORS*) [H: from memory, not measured for setuptools newer than 84.0.0]. [M] rpm -qpL and # rpm -qp --licensefiles on the noarch RPM of 1.0.5-1 built from this spec in rootless build roots with # the COPR package sets (rpm 4.19.1.1 on EL10, rpm 6.0.2 on Fedora 43): two %%license files, LICENSE (in # the dist-info directory of the wheel) and CC-BY-SA-4.0.txt, each once; no file of the RPM is listed # twice, and rpmbuild printed no "listed twice" message. %{_bindir}/%{name} %{_bindir}/slideshowlock %{_mandir}/man1/slideshow-lock.1* %{_mandir}/man1/slideshowlock.1* %{_datadir}/glib-2.0/schemas/%{app_id}.gschema.xml %{_userunitdir}/%{name}.service %{_datadir}/applications/%{app_id}.desktop %config(noreplace) %{_sysconfdir}/xdg/autostart/%{app_id}.desktop %{_metainfodir}/%{app_id}.metainfo.xml %{_datadir}/icons/hicolor/scalable/apps/%{app_id}.svg %{_datadir}/icons/hicolor/symbolic/apps/%{app_id}-symbolic.svg %dir %{_datadir}/%{name} %dir %{_datadir}/%{name}/pictures %{_datadir}/%{name}/pictures/* # [H] nothing else owned /usr/share/slideshow-lock/ before the pictures; %%dir makes the package the # owner of both folders and removes them with the files %changelog * Fri Oct 09 2026 TrenSoft - 1.0.9-1 - Add an About window to the settings window, with a link to support the project - List exit status 1 in the manual page of slideshow-lock - Documentation follow-ups: the settings window is a libadwaita window * Fri Oct 09 2026 TrenSoft - 1.0.8-1 - Add manual pages for slideshow-lock and slideshowlock - A slideshow window whose size never settles no longer makes the picture over and over; it is shown after at most three redos - Require libadwaita 1.2 or newer, the version the settings window needs - Add SPDX licence headers to the source files of the program * Fri Oct 09 2026 TrenSoft - 1.0.7-1 - The first picture of a window (and the first one after the empty-state message) gets the slow Ken Burns move by the same rule as every later picture; before, it stood still for its whole interval. The later pictures and the order of the transitions are unchanged * Fri Oct 09 2026 TrenSoft - 1.0.6-1 - The seven sample pictures no longer carry the colour profiles (ICC) that someone else wrote; the author and the licence stay in each picture, and the author is named "TrenSoft" - The address of the project is github.com/trensoft/slideshow-lock (the package URL, the AppStream data and the service file) - The application has a new identifier, io.github.trensoft.slideshowlock. The settings start from their defaults once; whoever has set a picture folder of their own has to set it again. At the first start the seven sample pictures are copied once into the folder Pictures/trensoft, on a new installation and on an update alike - The program does not delete the files of the earlier identifier: the earlier picture folder, its state file and an autostart entry that was made by hand under the earlier name stay where they are, and the user deletes them. An autostart that was switched off by hand under the earlier name is active again under the new identifier - The README says that the code was written with the help of AI agents * Thu Oct 08 2026 TrenSoft - 1.0.5-2 - Remove the Vendor tag: Fedora packages do not use it (fedora-review: "Packager, Vendor, PreReq, Copyright tags should not be in spec"). The upstream sources are the same as in 1.0.5-1 * Thu Oct 08 2026 TrenSoft - 1.0.5-1 - Random order: a picture shown just before the order was changed to random no longer comes back after fewer than 3 other pictures - Random order: when the picture that is next in line is deleted, the picture that takes its place also keeps the distance of 3 pictures - When the picture on screen is deleted or can no longer be read and the program redraws it (after a change of scaling, panning or window size), the slideshow no longer skips a picture or shows one twice * Thu Oct 08 2026 TrenSoft - 1.0.4-1 - Remove the hardware acceleration of 1.0.3: the "Hardware acceleration" switch, the frame-time guard and the graphics-card probe are gone. Nine of the ten transitions are drawn as in 1.0.1; the soft edges of 1.0.2 are gone - Only a picture that comes in with the Ken Burns transition moves; its move lasts until the next picture comes, instead of stopping after 90 % of the display time - Settings are checked and saved the moment they are changed; the Save button is gone - The settings window is one window with two columns of groups and no scrolled page - In random order a picture is not shown again before at least 3 other pictures have been shown (a folder of fewer than 4 pictures keeps as many apart as it has) * Thu Oct 08 2026 TrenSoft - 1.0.3-1 - Settings window: a "Hardware acceleration" switch in the Transitions group. The soft edges and the slow move of the pictures are drawn only where the machine is known to draw with a GPU and the switch is on; otherwise the animation is drawn as in 1.0.1. Without a GPU, or where that cannot be found out, the switch is off and greyed out - A picture that moves is redrawn at every tick of the frame clock; the limit of 30 frames a second that 1.0.2 put on the move is removed - A frame-time guard: if the frames of a screen come slower than 25 ms, the program draws the plain animation for the rest of the run - Settings window: the version of the program is shown at the bottom right - A yes/no setting that the installed settings schema lacks (a program newer than its schema, while an update is not finished) gives its default value, instead of ending the program * Wed Oct 07 2026 TrenSoft - 1.0.2-1 - Restart the running user service after the package is updated, so that the new version runs without a new login - Soft edges on the circle, wipe, slide-in, push, zoom and rotate transitions, instead of a hard line - Ken Burns: a stronger zoom - A picture that does not scroll moves slowly during its whole interval and under the transitions, so there is no still moment before or after a transition - Settings window: the Save button sits next to the Preview button - Name TrenSoft as the developer: the Vendor tag of the package, the metainfo and the README * Wed Oct 07 2026 TrenSoft - 1.0.1-1 - Add the slideshowlock command, which starts the service and opens the settings window - Start the service at login through an XDG autostart entry, and open the settings window once on the first start - Close the shell's overview before the idle slideshow opens and when the Preview button is pressed - Refuse an oversized picture also when the picture loader announces its size only when it is closed - On EL10, require gdk-pixbuf2-modules (TIFF and GIF) and recommend webp-pixbuf-loader and gdk-pixbuf2-modules-extra (BMP and WebP, from EPEL 10) - Add 35 translations of the interface, 40 languages in all; the 35 are AI-assisted and not reviewed by a native speaker - Add a usage section to the README - Ship seven sample pictures (CC BY-SA 4.0) that are copied into Pictures/trensoft at the first login, and add their licence to the License tag - Rebuild the settings window on libadwaita, with a Save button: a change is kept until Save, and is also saved when the window is closed; add the dependency on libadwaita - Add ten transitions between pictures, a "Random mix" of eight of them and a slider for the length of a transition - Make Ken Burns the default transition; a transition the user has chosen is kept - Show a picture for 10 seconds by default (it was 5) - Leave screenshots out of the slideshow by default, judged by the name of the folder or the file; a switch in the settings window shows them again * Tue Oct 06 2026 TrenSoft - 1.0.0-1 - Initial package