| Age | Commit message (Collapse) | Author | Files | Lines |
|
When the image staged for the targeted screen gets a yellow or red
quality note, a button under the mock screens copies it to the clipboard
and opens TinEye in the browser, where Ctrl+V runs the reverse search and
the matches can be sorted by size. It acts on the staged image, not the
hovered one, because the pointer leaves the thumbnail to reach it.
The image goes through the clipboard because a search engine takes no
local file in a URL, and scripted uploads did not get through: TinEye
answered 403 to curl and 405 with a browser user agent, and Google Lens
redirected to its consent page, dropping the image. The paste in the
browser is the upload, and only on the user's click.
The copy is converted to PNG with magick. Copied as itself, a JPEG put
only image/jpeg on the clipboard and Firefox pasted nothing into the
page; it hands web content image/png.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The wallpaper tab showed every image under ~/Pictures/wallpapers in one
grid. It now groups them by top-level folder, each behind a header that
opens and closes it, and adds the distribution's /usr/share/wallpapers:
its loose images as "system", its Plasma packages as "Plasma". A package
carries one picture at several resolutions under contents/images/, some
with a dark version under contents/images_dark/, so it shows once, the
dark version where there is one and the largest of those, labelled with
the package name rather than "5120x2880.png". Groups are keyed apart from
their names, so a local folder called "system" does not share open state
with the system group. Open state lives in the Wallpapers singleton,
because the panel is destroyed on close.
The list is one flat ListView of rows, a header or a row of thumbnails,
so only rows in view (plus cacheBuffer) are instantiated and decode. A
first version made each folder one delegate, which loaded every image of
a folder as soon as it opened; the system group alone is 727. The rows
live in a ListModel and a toggle inserts or removes only that folder's
rows: assigning a fresh JS array instead resets the view, which loses the
scroll position and re-decodes everything visible. cacheBuffer is clamped
at 0 because the column's width reads negative before layout and the
ListView warns on each negative value.
The scan's find calls go through a small shell function rather than eval.
Each thumbnail's 2px border tells how it will look on the targeted
screen. `file -N -0` reads every image's size from its header after each
scan, ~0.6s for 1161; the NUL keeps names containing ": " intact, and the
size is the last WxH in the description because a JPEG's "density 72x72"
comes first. wallp runs swaybg -m fill, which scales to cover, so the
measure is the enlargement factor: <=1 green, <=1.33 yellow, else red, in
the udt palette colours. A note under the mock screens, in that colour,
gives the size, the factor and why it will look soft or pixelated, for
the hovered image or else the staged one. The staged image keeps its
accent border. Screen sizes are fixed, as the mock's already were.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Both now follow the scheme but only read their theme at startup.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
StepsWindow shows unified-desktop-theme's pending manual steps, one tab per
consumer, centred on DP-3 on the top layer with on-demand focus so it can
stay open while commands are pasted elsewhere. udt-steps writes the files
and calls the new `steps` IPC verb; indented lines become command blocks
with a copy button. The Theme tab pipes install.sh's output into it.
The icon switch now also reruns udt-accent (SDDM power icons) and
waybar-theme-udt's install.sh (taskbar theme, module icons), chained after
the gsettings write both read. Cursor changes write ~/.config/udt/cursor.lua
instead of editing hypr-theme's tracked environment.lua.
The theme notice and the Udt.qml comment claimed install.sh reloads
nothing; it reloads Hyprland, waybar, kitty and conky now.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Cursor previews were extracted only on hover, so the row stayed blank until
each card was visited. They are now batched on open: one python pass extracts
four shapes per theme (arrow, hand, text, horizontal resize) through the
theme's aliases and every storage form it may use (hyprcursor .hlc, a shape
directory SVG, or a legacy Xcursor binary via xcur2png).
The card rows are Flows so they wrap instead of running off the right edge,
and the tab scrolls. Cards widened and names wrap to two lines. A size
selector (16-64) applies the pointer size live, to gsettings, the GTK
settings.ini files and environment.lua.
gsettings alone does not reliably switch icon/cursor here: both gtk-3.0 and
gtk-4.0 settings.ini carry the names, so apply now rewrites
gtk-icon-theme-name / gtk-cursor-theme-name / gtk-cursor-theme-size there too.
The symlinked `default` cursor alias is skipped in the scan and the current
value resolved through it, so the real theme carries the current marker.
The tab row is centred against the panel so it reads as drawer chrome rather
than the first line of a tab's content.
|
|
Icon themes preview four glyphs each from the GTK lookup; cursor themes
preview an extracted left_ptr and change the real cursor on hover, reverted
on leave and on close. Selection applies both.
|
|
Rows for each listener with an enable toggle and a timeout field, the
command shown read-only. Save rewrites the file and restarts hypridle.
|
|
Tab bar and Tab-key cycle become five entries, the Loader picks inline or
file tabs, and show() refreshes the model. The tab edits the profiles
in place, fetches sun times and previews through the daemon.
|
|
Both scans ran once at startup. This shell is autostarted, so that is
once per session: a scheme or a wallpaper added afterwards never
appeared, and restarting the shell was the only way to see it. Six
schemes added during a session were invisible for exactly this reason.
Opening the panel now refreshes both. Verified by adding a palette pair
to a running shell and watching it appear, with its colours resolved,
after the refresh.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G7NRsGyF9jGfPYS4zPqpN7
|
|
One drawer for how the desktop looks, on SUPER+Return, replacing the
qarma file dialog that key used to open. wallp is untouched and still
does the work: the panel calls it with H= and V= and it still runs from
a terminal.
Clicking a thumbnail stages it rather than setting it, so both screens
can be composed before anything changes and Apply is a single wallp
call. The mock screens show the result: the staged pick where there is
one, what is set where there is not, and the hovered thumbnail on the
targeted screen. They are drawn at the real proportions from hyprctl
monitors, DP-3 upright because it has transform=1, centred against each
other as Hyprland has them.
The scheme tab reads the palette pair unified-desktop-theme keeps for
each scheme, so the swatches are that scheme's real colours and the list
needs no edit when a scheme is added. Applying writes roles.conf and
runs install.sh, and reloads nothing, because install.sh reloads
nothing: the panel says what is still showing the old scheme rather than
pretending the switch is done.
Two QML traps are documented in AGENTS.md because neither announces
itself: there is no String.matchAll, which threw inside a try and left
every swatch empty, and assigning running = true to an already-running
Process does nothing, which stopped the scheme loader after the first
file.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G7NRsGyF9jGfPYS4zPqpN7
|