Some checks failed
Check / eval (push) Has been cancelled
The machine flake's git-tracked settings file is system state, not "theme" only — rename it to state.json. CLI becomes nomarchy-state-sync with a nomarchy-theme-sync symlink for scripts and muscle memory. Eval (mkFlake, doctor, lifecycle) still accepts theme-state.json; the next write migrates to state.json and removes the legacy file. Documented in MIGRATION.md; drop the CLI alias after release notes.
37 lines
1.7 KiB
Nix
37 lines
1.7 KiB
Nix
# Auto time-of-day theme switch (BACKLOG #79, VISION § D). A user timer
|
|
# periodically runs `nomarchy-state-sync auto`, which reads
|
|
# settings.autoTheme = { enable, day, night, sunrise, sunset } from the
|
|
# state file and applies the day or night preset for the current clock —
|
|
# through the SAME one engine as a manual `apply` (no second pipeline).
|
|
#
|
|
# The command self-gates (no-op when disabled) and is idempotent (it only
|
|
# rebuilds when the active theme actually needs to change), so the timer
|
|
# can tick freely. Install is gated on the state flag (like nomarchy.updates
|
|
# gates on its enable), so a machine not using the feature carries no timer;
|
|
# enabling it from the menu (slice 3) writes the flag + rebuilds, which is
|
|
# what brings the timer into being.
|
|
{ config, lib, pkgs, ... }:
|
|
|
|
lib.mkIf (config.nomarchy.settings.autoTheme.enable or false) {
|
|
systemd.user.services.nomarchy-auto-theme = {
|
|
Unit.Description = "Apply the day/night theme for the current time";
|
|
Service = {
|
|
Type = "oneshot";
|
|
# The rebuild (`home-manager switch`) and its tools resolve from the
|
|
# system + per-user profiles — same PATH shape nomarchy-updates uses.
|
|
Environment = "PATH=/run/current-system/sw/bin:/etc/profiles/per-user/${config.home.username}/bin";
|
|
ExecStart = "${pkgs.nomarchy-state-sync}/bin/nomarchy-state-sync auto";
|
|
};
|
|
};
|
|
|
|
systemd.user.timers.nomarchy-auto-theme = {
|
|
Unit.Description = "Periodic day/night theme check";
|
|
Timer = {
|
|
OnStartupSec = "1min"; # settle on the right theme shortly after login
|
|
OnCalendar = "*:0/15"; # re-check every 15 min; auto no-ops if unchanged
|
|
Persistent = true; # catch a transition missed while powered off
|
|
};
|
|
Install.WantedBy = [ "timers.target" ];
|
|
};
|
|
}
|