# RPM spec for lmtt (Linux Multi-Theme Toggle). 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, and the # schema-tui git dependency is vendored too, so the build is fully offline). # The test suite runs by default (cargo test over all workspace members). # Disable for a one-off build with --without check; COPR builds run the suite. %bcond_without check Name: lmtt Version: 0.3.2 Release: 1%{?dist} Summary: Fast async theme switching for Hyprland/Wayland desktops License: MIT URL: https://github.com/MasonRhodesDev/linux-multi-theme-toggle # The GitHub repo name differs from the package name; GitHub serves the # archive under any basename, but its top-level dir would be # linux-multi-theme-toggle-%%{version}. The SRPM never uses this URL: # build-srpm.sh always regenerates Source0 with git archive using an # lmtt-%%{version}/ prefix, which is what %%autosetup expects. Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz Source1: %{name}-%{version}-vendor.tar.xz BuildRequires: desktop-file-utils BuildRequires: cargo-rpm-macros >= 24 BuildRequires: systemd-rpm-macros # matugen (wallpaper-based Material You palettes) is optional at runtime and # not packaged in Fedora/COPR default repos; lmtt falls back to built-in # themes or custom JSON colors without it. When present it must be 4.1+ # (--prefer and the 4.x JSON shape are the only ones supported). Recommends: matugen >= 4.1 %description Linux Multi-Theme Toggle: high-performance async light/dark theme switching for Hyprland/Wayland desktops with Material You color schemes. Applies themes in parallel across 14+ applications (Waybar, Hyprland, GTK, VSCode, Wezterm, SwayNC, ...), auto-detects what is installed, and supports user-defined custom modules. Ships the lmtt CLI and the lmtt-config TUI. Configuration lives in ~/.config/lmtt and is not part of this package. %prep # -a1 unpacks the vendor tarball (vendor/ at its root) into the source dir. %autosetup -p1 -a1 %cargo_prep -v vendor # %%cargo_prep only redirects crates-io at the vendor/ directory. Git # dependencies are also vendored; redirect them at those copies so the build # never touches the network. cat >> .cargo/config.toml << 'EOF' [source."git+https://github.com/MasonRhodesDev/schema-tui.git?rev=90bf1526f31cf20852b9c02fb3d17c94746fc425"] git = "https://github.com/MasonRhodesDev/schema-tui.git" rev = "90bf1526f31cf20852b9c02fb3d17c94746fc425" replace-with = "vendored-sources" [source."git+https://github.com/MasonRhodesDev/appearance-profiles.git?rev=bfd6f0d66dac7a31c4f2be042466f9222a3cb165#bfd6f0d66dac7a31c4f2be042466f9222a3cb165"] git = "https://github.com/MasonRhodesDev/appearance-profiles.git" rev = "bfd6f0d66dac7a31c4f2be042466f9222a3cb165" replace-with = "vendored-sources" [source."git+https://github.com/MasonRhodesDev/monitor-profiles?rev=64d5d1ed079582a2014ebf23c403a3ca03ee9c64#64d5d1ed079582a2014ebf23c403a3ca03ee9c64"] git = "https://github.com/MasonRhodesDev/monitor-profiles" rev = "64d5d1ed079582a2014ebf23c403a3ca03ee9c64" replace-with = "vendored-sources" EOF %build %cargo_build %{cargo_license_summary} %{cargo_license} > LICENSE.dependencies %install # The workspace root is a virtual manifest, so %%cargo_install (cargo # install --path .) cannot be used; install the two workspace binaries from # the rpm profile target dir that %%cargo_build populates. install -Dpm0755 target/rpm/lmtt %{buildroot}%{_bindir}/lmtt install -Dpm0755 target/rpm/lmtt-config %{buildroot}%{_bindir}/lmtt-config install -Dpm0644 config-example.toml %{buildroot}%{_datadir}/lmtt/config-example.toml install -Dpm0644 examples/README-modules.md examples/colors-dark.json \ examples/colors-light.json -t %{buildroot}%{_datadir}/lmtt/examples install -Dpm0644 examples/modules/*.toml -t %{buildroot}%{_datadir}/lmtt/examples/modules install -Dpm0755 examples/scripts/*.sh -t %{buildroot}%{_datadir}/lmtt/examples/scripts install -Dpm0644 dist/tmpfiles.d/lmtt.conf %{buildroot}%{_tmpfilesdir}/lmtt.conf desktop-file-install --dir=%{buildroot}%{_datadir}/applications dist/lmtt-config.desktop %if %{with check} %check %cargo_test %endif %post %tmpfiles_create %{_tmpfilesdir}/lmtt.conf %files %license LICENSE LICENSE.dependencies %doc README.md %{_bindir}/lmtt %{_bindir}/lmtt-config %{_datadir}/lmtt/ %{_tmpfilesdir}/lmtt.conf %{_datadir}/applications/lmtt-config.desktop %changelog * Tue Oct 13 2026 Mason Rhodes - 0.3.2-1 - `lmtt wallpaper unset --output ` removes a per-output override, the inverse of `set --output` (dials' Displays inspector uses it). - clippy on rustc 1.99: the script runner's late-initialised temp file and async_trait's must_use on ThemeModule; main's CI is green again. * Sat Aug 22 2026 Mason Rhodes - 0.3.1-1 - Depend on xdg-paths 0.2.0 (renamed crate); ship lmtt-config.desktop (Settings entry, X-Dials-Section=Appearance). * Fri Aug 22 2026 Mason Rhodes - 0.3.0-1 - matugen >= 4.1 is the floor: the pre-4.1 --prefer fallback and the older JSON shapes are gone. The one-time lmtt-slint.json migration from the matugen-era token path is removed (alpha cleanup). * Fri Aug 22 2026 Mason Rhodes - 0.2.9-1 - Review fixes: refuse to publish into a users/ dir we do not own outright (sticky world-writable parent lets another user pre-create or symlink it); retry matugen without --prefer on pre-4.1 matugen; seed preference is part of the color cache key; source_color_preference is in the lmtt-config schema and validated on load. * Fri Aug 22 2026 Mason Rhodes - 0.2.8-1 - Parse matugen 4.x JSON (colors[name][mode] is now { color = "#hex" }). Together with 0.2.7's --prefer this restores wallpaper-derived palettes; both gaps had been silently falling back to the built-in colors. * Fri Aug 22 2026 Mason Rhodes - 0.2.7-1 - Pass --prefer to matugen (config: general.source_color_preference, default "saturation"). matugen 4.x refuses non-interactively when an image has several seed colors, so every switch had been falling back to the built-in palette instead of the wallpaper-derived one. * Fri Aug 22 2026 Mason Rhodes - 0.2.6-1 - xdg module: start the portal with --no-block and skip confirmation when it is not up. At login (hypr-DE renders styles before the daemons) the blocking start sat on the session critical path for the full 10s module timeout. * Fri Aug 22 2026 Mason Rhodes - 0.2.5-1 - Ship a tmpfiles.d entry creating /var/lib/appearance-profiles/users: without it, prepared-bundle publication failed silently on every switch and lock screens fell back to seconds-long wallpaper decodes. * Wed Aug 19 2026 Mason Rhodes - 0.2.4-1 - Allow the pinned shared monitor-profiles source in the release security policy. * Wed Aug 19 2026 Mason Rhodes - 0.2.3-1 - Delegate atomic prepared appearance publication to appearance-profiles. - Use the shared canonical monitor identity implementation. * Sat Aug 15 2026 Mason Rhodes - 0.2.2-1 - Publish tokens.json beside appearance-profiles on switch with last-known-good rotation, take hypr-paths from crates.io, and retire the regreet and hyprlock modules. * Fri Aug 14 2026 Mason Rhodes - 0.2.1-1 - Add the appearance-profiles registry, wallpaper set/resolve/publish CLI, and shared wallpaper resolution for palette generation. * Tue Aug 04 2026 Mason Rhodes - 0.2.0-1 - Template files ([template] path), system module search path, packaged-DE swaync gate * Wed Jul 15 2026 Mason Rhodes - 0.1.1-1 - hyprland: emit tertiary + tertiary_container in lmtt-colors.{conf,lua} (used for the pinned-window border color) * Thu Jul 02 2026 Mason Rhodes - 0.1.0-1 - Initial packaged release: lmtt CLI + lmtt-config TUI, config example and custom-module examples under /usr/share/lmtt