| Age | Commit message (Collapse) | Author | Files | Lines |
|
udt-accent's docstrings and AGENTS.md still said colors.json was a fixed
Macchiato palette. It has been built from udt_colors.PALETTE, which
udt-palette generates per scheme, since schemes became switchable; the
live file carries candy-night's colours. The terminal likewise follows
the scheme, only never the wallpaper.
The stock ~/.config/waybar/ has been deleted, so the notes explaining why
install.sh leaves it alone now just record that it is gone.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The appearance panel is the usual way a scheme gets applied, so the hints
install.sh prints belong on screen whoever calls it, not only when the
panel pipes them. install.sh reruns itself as a child, tees the output to
the terminal and a temporary log, and passes the log to udt-steps install,
keeping the child's exit status.
With the window as its main reader, the output is now a summary: only
udt-palette's count line rather than all 86 generated paths, and a restart
hint in place of the closing ls -l dump.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Notification balloons carried the GRUB and homepage root commands, but a
balloon cannot stay open while its commands are pasted into a root shell.
bin/udt-steps NAME writes a consumer's pending steps to
~/.cache/udt/steps/NAME and pokes quickshell's appearance shell, which shows
one tab per file on DP-3. Empty stdin clears the tab, so producers report
on every run and a consumer that caught up drops out by itself.
udt-grub and udt-homepage now route through it. install.sh's SDDM block
checks what is installed and reports only the steps still missing, rather
than printing the full install on every run. udt-homepage remembers the
last staged pair, since udt-accent now also runs on icon switches, which
change neither file and would re-raise the finish steps for nothing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
GRUB's background is a wallpaper snapshot, but only install.sh rebuilt it,
so a wallpaper change left the /boot copy stale with no hint. udt-grub now
holds the build-and-print logic; install.sh runs it in the foreground and
udt-accent starts it detached next to udt-homepage. A stale installed theme
gets a notification carrying the root copy command. A flock serialises the
two runs install.sh triggers, since build swaps dist/udt in by rename.
AGENTS.md: udt-accent writes seven outputs (SDDM was missing), and names
the two detached helpers.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Up to date when the installed theme matches dist/udt, the copy line alone
when GRUB_THEME already names the udt theme, the full three steps otherwise.
The build is deterministic, so a clean diff -rq means nothing changed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The GRUB theme titles its panel with the machine's pretty name, and on
Slackware nothing writes /etc/machine-info: hostnamectl is systemd's. This
sets the one key, keeping any others, and with no argument prints it.
The value is double-quoted with only \ and " escaped, the escapes systemd's
reader and the GRUB build's shlex agree on; control characters are refused.
It needs root and is never run by install.sh, which only suggests it in the
GRUB output while no name is set. tests/machine-name.sh checks the quoting
round-trip against shlex.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
theme.txt has no include, so udt-palette substitutes eight roles and the
scheme name into the sibling repo's theme.txt.in, conky-style. The accent is
the scheme's fixed one; nothing at boot can read the wallpaper.
install.sh runs that repo's build as the user and, only when it succeeds,
prints the root copy into /boot/grub/themes plus the one-time GRUB_THEME and
grub-mkconfig steps. External targets are now skipped whenever their template
is missing, not only when the repo is, so a sibling mid-setup cannot break an
install.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The rofi menus' launch scripts lived loose in ~/bin, so the themes were
tracked and the only things that open them were not. They now live in bin/
and are symlinked under the names hypr-theme's keybindings call.
neovim gets a generated colorscheme: catppuccin/nvim with all 26 palette
colours overridden from the active scheme, selected by rewriting only the
colorscheme line of init.vim. hypr-theme is linked as the whole of
~/.config/hypr, leaving a real directory there alone.
The qt-gtk templates were reference copies nothing installed. They now hold
theme keys only and ini_merge writes them into the live qt5ct, qt6ct and
gtk3 files key by key, keeping every other line; tests/ini-merge.sh checks
it. The stale kvantum.kvconfig template is gone, install.sh writes that file.
Fresh-machine fixes: settings.ini and ~/.config/gtk-4.0 are created when
missing instead of aborting under set -e, and conky is found as a sibling
checkout and skipped when absent, in udt-palette as well as install.sh.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The README still called it a real file. It now links into the kitty-conf
repository and install.sh writes the theme through it (47dcb72).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The yes/no gate was a 500px box, small next to the fullscreen power
menu in front of it. confirm.rasi now imports the screenshot menu's
layout, two half-monitor buttons on the scrim, and adds the question
above them. The glyph size arrives from the calling script with
-theme-str, derived from the focused monitor, as it does there.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The screenshot menu (Mod+Shift+S) borrowed menu.rasi, a small list
box, so its two options were small glyphs in a narrow column.
screenshot.rasi gives each option half the monitor on the scrim,
centred vertically by spacers because rofi sizes a row by its text.
rofi cannot size a font by percentage, so the calling script passes
the glyph size with -theme-str, derived from the focused monitor and
aware of rotated outputs; the size in the theme is only a fallback.
install.sh links the new file with the other layouts.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The power menu's ground was a hardcoded rgba(36, 39, 58, 0.88),
Macchiato's base, so every other scheme drew its overlay with a
Macchiato tint. Each roles file now defines scrim as its own
background at 88% alpha, udt-palette emits it into palette.rasi, and
powermenu.rasi uses @scrim.
scrim is the first translucent palette entry, so udt-accent's QML
palette no longer drops the alpha pair: an opaque colour still goes
out as #rrggbb, a translucent one as QML's #aarrggbb.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
palette.rasi is what udt-accent forwards to quickshell as
udt-palette.qml, and the keybind reminder there draws the macropad's
orange, purple and blue keycaps. peach and mauve come from the peach
and highlight roles every scheme defines; mauve used to be added only
to waybar's compat list, which now reads it from ROFI_NAMES instead of
defining it twice.
The existing "blue" name carries the active-border role, magenta under
candy-night, so the terminal's blue goes out as termblue. The first
spelling, term_blue, made rofi reject palette.rasi and with it every
theme; AGENTS.md now says so next to the selftest.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The greeter drew the AccountsService icon while hyprlock and the rofi
powermenu draw ~/.user-icon.jpg, so one login showed two pictures.
udt-accent now writes that path as `avatar`, plus `avatarUser` naming
who it belongs to, into the generated theme.conf.user. Both stay empty
when the file is missing so the greeter keeps its fallback.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
kcalc rendered white under the dark Kvantum theme. Off Plasma,
KStyleManager forces Breeze unless kdeglobals names a widgetStyle, and
KColorSchemeManager applies BreezeLight unless kdeglobals names a colour
scheme; qt6ct never forwards the portal's prefer-dark to Qt.
Generate a udt.colors KColorScheme from the Kvantum roles, install it to
~/.local/share/color-schemes/, and point kdeglobals at it and at
kvantum-dark.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
bin/udt-homepage replaces install.sh's inline scp. It stages custom.css
and the current wallpaper, keeping the wallpaper's own extension, then
raises a desktop notification with the root commands that install both
and point settings.yaml at the new background. Plain root commands, not
sudo: the login user on that host has no sudo rights.
udt-accent starts it detached on every run, so it follows a wallpaper
change (wallp) as well as a scheme switch (install.sh) without holding
either up when the host is unreachable.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
~/.config/kitty/current-theme.conf is now a symlink into the kitty-conf
repo. install -Dm644 unlinked it and left a plain file in its place, so
the theme is written through the link with cat instead.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The key was set by hand through Kvantum Manager, which writes to the installed
theme. That file is generated, so the next install.sh would have reverted it
without saying anything. Setting it in the template is what makes it survive a
scheme switch.
On its own this only stops the file list painting its own background; the
window's opacity is the compositor's, and is set by a scoped rule in
hypr-theme rather than here.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
Qt windows were opaque while the rest of the desktop was not. This turns on
translucent_windows and blurring and lifts reduce_window_opacity from 10 to 15.
The keys are global rather than per-scheme placeholders on purpose: every
scheme wants the same frame treatment, and making it a role would add three
keys to all ten role files to encode a value none of them would disagree
about. All ten schemes gain the effect.
Worth knowing when this looks wrong: Kvantum only makes the window
see-through. The blur behind it is the compositor's, so under a Hyprland
without a blur rule covering Qt surfaces these settings read as plain
transparency rather than the intended glass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
A tenth scheme, sampled from a desktop shot built on the Candy icon set
(https://github.com/EliverLara/candy-icons) over a near-black purple ground.
Its hue ramp is deliberately that icon set's folder gradients, so the palette
names the same colours the icons are drawn in.
The colours are measured from solid regions of the source image rather than
taken from a published scheme, which is why the palette names are this file's
own. The window body in that image is translucent over the wallpaper and so
contributes no value; that is opacity, not a colour.
One split is load-bearing: [ui] accent is the true magenta #cc0dbf from the
image, while [terminal] magenta is #f00fe0, the same hue lifted to lightness
0.50. Against the scheme's background the original scores 3.79 contrast, under
the 4.5 wanted for body text. The accent only ever fills large areas, where it
reads fine; terminal magenta is glyphs on a dark ground, where it does not.
Every other terminal colour already clears 4.5 (lowest: red at 5.42); ANSI
black stays low as it does in every other scheme, since it is never body text.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
udt-palette renders the scheme-level palette to
templates/hyprlock/hyprlock-palette.conf ($panel, $input_bg, $text,
$subtext, $fail); udt-accent writes the wallpaper accent gradient to
~/.cache/udt/hyprlock-border.conf as a hyprlang variable. The hyprlock
config sources both, so a scheme switch recolours the lock and a
wallpaper change recolours its border.
install.sh copies the palette and seeds the border from the committed
fallback on a fresh cache. Both selftests cover the new outputs.
|
|
find_icon merged all candidate names into one set and ranked across
them, so a later alternate name could beat the first name present, and
size directories spelled 48x48 or scalable were not parsed. Try the
names in order instead: the first with a match wins, and within a name
prefer -symbolic, then scalable, then the largest size directory.
Update the docstring and selftest comment to match, extend the selftest
with size and name-order cases.
Add the missing GPL-2.0-only SPDX line.
|
|
The greeter runs as the sddm user and cannot read the login user's
dconf, so udt-accent resolves the four FreeDesktop power icon names in
the icon theme gsettings reports and bakes absolute paths into the
generated sddm-theme.conf. An unresolved key stays empty and the
theme falls back to its bundled SVGs.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bin/ holds the weather fetch script that conky.text runs on an execi, so
it needs the same symlink treatment as lib/ and widgets/.
The restart now goes through hyprctl with `[workspace special:dash
silent]`. The dashboard's window rule puts it on that workspace but
cannot suppress the switch to it, so before this every reinstall threw
the dashboard up over whatever was on screen. Guarded by a check for a
running Hyprland, falling back to a plain exec elsewhere, since the
workspace rule is the only reason hyprctl is involved.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
templates/gtk/index.theme.in named IconTheme and CursorTheme, and it is
installed whole-file into ~/.themes/udt/index.theme, which the drawer's Icons
tab never rewrites. Every switch there left this file naming the old theme.
Both keys are dropped: gsettings wins over a metatheme hint on Wayland, so the
drawer's value stands on its own.
templates/qt-gtk/{gtk3-settings.ini,qt5ct.conf,qt6ct.conf} were checked and
are not a conflict: nothing installs them, and install.sh only seds
gtk-theme-name into the live gtk-3.0/settings.ini. Each now says so at the
top, so the next reader does not have to establish it again.
TODO-icons.md records the audit, including the three consumers outside this
repo that resolved icons against a hardcoded theme name.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
The restart ran a bare `conky -d` and relied on conky's default lookup
finding ~/.config/conky/conky.conf. It does resolve to the same file,
so this changes nothing today.
It is worth pinning anyway: the dashboard's own hypr/README.md tells
the user to launch it from autostart.lua as
`conky -c ~/.config/conky/conky.conf`, and two launch paths that
disagree in form are how they later drift apart in effect.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
The conky dashboard target is an absolute path now that it lives in
another repo, and `out_dir / absolute` discards out_dir, a documented
pathlib behaviour.
For the default in-repo render that is correct: the file genuinely
belongs at that path. For a render aimed anywhere else it is not.
selftest renders every scheme to a temp dir to have rofi parse the
result, so the escaping target rewrote the live file each time,
silently leaving the user's rendered conky.conf set to whichever scheme
was probed last rather than the one they run. Confirmed with a sentinel
line: before the fix it vanished after a selftest, after it survives.
So an absolute target is honoured only when out_dir is the repo, and
rebased under out_dir otherwise. Rebasing unconditionally was the wrong
fix and was caught in testing: it sent the real render into a
home/danix/... tree inside this repo and stopped updating the live file
at all.
Verified both directions: selftest leaves the live file alone and
creates no stray tree, a real render still updates it, and all nine
schemes still pass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
The Lua dashboard lives in conky-theme-udt now, so udt-palette renders
that repo's conky.conf.in instead of a local template and install.sh
links the Lua alongside the config.
gen_conky also substitutes critical, for the dashboard's error overlay:
conky reports a Lua fault as a blank window, so the dashboard catches
it and draws the message instead.
The old variables-and-execi template is deleted. Its hardware discovery
was not lost; the hwmon glob-by-name approach is carried into
lib/data.lua deliberately, since fixed indices drift across kernel
reorders.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
The README said derived tints were left alone, which was true for an hour and
is now wrong for twelve of them. Records which widget each paints, what it
became, and why shade() keeps the relationship rather than the upstream value.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
Twelve hexes were shades upstream computed from a palette colour rather than
taking one. They were left literal on the same reasoning as the neutral greys,
which was wrong: a grey is shading, but each of these paints one widget
surface in a colour that is supposed to be the theme's. Under any scheme but
Macchiato they stayed Macchiato, including the window close, minimise and
maximise hover fills.
They are substituted as @ROLE_PCT@ now, the percentage being that shade's
brightness relative to its base. shade() scales each channel and clamps, so it
keeps the relationship rather than the exact upstream value; closest on the
accent family, crudest on the reds, where upstream darkened toward saturation.
GTK4 carries ten of the twelve: the selected progress bar and the
selection-mode titlebar backdrop are GTK3-only widgets upstream.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
AGENTS.md listed GTK3/GTK4 among the covered consumers, but nothing generated
or installed a theme for it: the claim had been aspirational since the repo
started. It now describes what the code does, and says plainly that the old
state was a gap rather than a drift.
templates/qt-gtk/ documented both Qt and GTK as installed from upstream. Qt
still derives from catppuccin/Kvantum and GTK from catppuccin/gtk, but both
are generated here now, so the table and the gsettings line say 'udt'. Its
tracked gtk3-settings.ini carried the old theme name too, which made the
record disagree with the live config it mirrors.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
One fixed name for every scheme, like Kvantum: the name is referenced by
gsettings and by the GTK4 symlink, so a per-scheme name would mean rewriting
both on every switch and leaving stale themes behind.
Only the two GTK directories are installed. The upstream theme this derives
from also ships cinnamon, gnome-shell, metacity, xfwm4 and plank directories,
none of which anything here reads.
gtk-dark.css is written alongside gtk.css because apps request one or the
other depending on the prefer-dark setting; upstream ships them identical.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
A placeholder with no matching role renders literally into the CSS and GTK
drops the declaration without an error. The stylesheets are 8500 lines each,
so nothing would catch it by eye.
Verified the assertion fires: renaming @ACCENT@ to @NOSUCHROLE@ in one asset
template fails the selftest, naming the file and the placeholder.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
70 new targets: the two stylesheets, the metatheme descriptor and 67 widget
assets. The assets are discovered from disk rather than listed, because they
arrive as a set from upstream and a hand-written list would miss one added by
a future refresh.
Substitution does the _RGB@ form before the bare @ROLE@: @FG@ is a prefix of
@FG_RGB@, so the other order would eat the start of the triple placeholder
and leave a literal "_RGB@" in the CSS.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
67 SVGs carrying only three palette colours: bg, bg_alt and the accent, the
last in 36 of them. The upstream gtk-3.0 and gtk-4.0 asset directories are
byte-identical, so one templated set is rendered and copied into both.
index.theme names the theme in three places and has no placeholders; it is a
template only so it installs through the same code path. Its icon and cursor
entries are this desktop's, not upstream's Tela-circle-Dark and
Macchiato-cursors, which nothing here uses.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
Derived from catppuccin/gtk v1.0.3. Substitution is whole-file rather than
confined to the @define-color block at the tail: 338 palette hexes in GTK3
and 328 in GTK4 sit in the 8400 lines above it, so a block-scoped template
would have left most of the theme macchiato.
Both colour forms are replaced, the hex and the bare decimal triple GTK
writes inside rgba(). Neutral greys, upstream's derived tints and the
Material swatch constants are left exactly as drawn, the same rule the
Kvantum SVG follows.
#eff1f5 is upstream's foreground, which is Latte text: a near-white it pairs
with a Macchiato background. It maps to the fg role so GTK text matches rofi,
kitty and waybar rather than being brighter than all of them.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
GTK's stylesheets write colours two ways: as a hex, and as a bare decimal
triple inside rgba(). The existing rgba() helper emits without spaces and
wraps the call itself, so neither form matches what the upstream theme
contains; rgb_triple emits just `r, g, b` and the template keeps the call.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
GTK4 uses an orange for weather chart fills and badge backgrounds, and no
role exposed one. Every scheme defines it or --selftest fails, which is what
that identical-role-set check is for.
Catppuccin schemes name it peach; tokyo-night, dracula and the three material
schemes call it orange; nord calls it aurora_orange.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
GTK was listed in AGENTS.md as a covered consumer but nothing generated or
installed a theme for it. Every GTK app sat on a hardcoded upstream
catppuccin-macchiato-lavender while the rest of the desktop ran tokyo-night.
The plan templates the upstream stylesheets and assets the way Kvantum
already is, rendering into ~/.themes/udt under one fixed name per scheme.
Substitution is whole-file rather than confined to the @define-color block:
338 palette hexes in GTK3 and 328 in GTK4 sit outside it, which was measured
before the approach was chosen.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
They lived in ~/.cache/wal because pywal owned that directory and udt-accent
was written alongside a pywal run. Nothing on this desktop invokes pywal any
more: the wal binary is unused, and udt-accent imports pywal.backends.colorz
as a quantisation library, which writes nothing. Sharing the cache only left
the ownership ambiguous.
colors.json is the one file that cannot move. pywalfox hardcodes
<cache>/wal/colors.json and honours only XDG_CACHE_HOME, which would relocate
every cache on the system, so udt-accent writes the real file to ~/.cache/udt
and install.sh symlinks the old path at it. ~/.cache/wal now holds that link
and nothing else.
Consumers repointed here: install.sh, udt-accent, launcher.rasi's @WPAPER@.
Outside the repo, wallp, Hyprland's look_and_feel.lua and quickshell's
shared/Theme.qml move with it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
install.sh generated templates/conky.conf and restarted conky, but no
line ever put the file where conky reads it. git log -S"config/conky"
finds nothing, so the install step never existed: ~/.config/conky/conky.conf
was a hand-placed copy that happened to match while the scheme was
macchiato, and silently desynced when it changed.
The restart then made it worse than doing nothing, relaunching conky onto
a stale config on every install.
Symlinked, like everything else the repo owns, and placed before the
restart because conky reads its config once at startup. Safe to link
wholesale: the host-specific parts, the mpd host and the tuned ${goto}
offsets in conky.text, live in conky.conf.in, so only the colours differ
between schemes.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
dunst no longer runs on this desktop. notifyd owns
org.freedesktop.Notifications and the quickshell notifications shell
draws the balloons, reading the palette from ~/.cache/wal/udt-palette.qml
like every other quickshell component. So the whole dunst path was
generating a config nothing read.
It was also actively wrong. pywal rendered ~/.cache/wal/dunstrc from the
installed template, then wal.sh restarted dunst on it while @ACCENT@ was
still an unsubstituted placeholder, and udt-accent restarted it a second
time after substituting. Two restarts per wallpaper change, the first on
a broken config, for a daemon that could not claim the bus name anyway.
Removes gen_dunst and its TARGETS entry, write_dunst and DUNSTRC, the
install block, templates/dunstrc.in and the gitignore entry. The reload
table now lists quickshell, which needs no signal: it watches the
generated palette and re-reads it in place.
The [state] roles stay. They were never dunst-only; waybar module states
and conky warnings use the same four.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|