| Age | Commit message (Collapse) | Author | Files | Lines |
|
The OSD background held one Image, so a track change swapped covers in a
single frame. Two images now take turns: the new cover loads into the
hidden one and is brought to the front only once it reports Ready, then
both fade over 300ms. Waiting for Ready is what keeps a slow or remote
art server from fading through black.
The blur, scrim, sheen and grain are grouped under one item whose
opacity follows artOn. It goes false when the player has no art or the
cover for the current track errors, so the panel fades back to its plain
translucent look instead of snapping, or keeping a stale cover that
reads as a fault. It goes true again only when a new cover has loaded,
so returning from plain never flashes the previous one.
The back image's source is cleared before being set, so a URL it
already holds still reloads and reports a status. onWantChanged misses
the value at load, hence the Component.onCompleted call.
Not yet seen on screen: the shell reloaded it cleanly but the fade was
not watched through a track change.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The art background is opaque, so Hyprland's blur behind the OSD cannot
show through it; making the art translucent to let it through would
also thin the scrim that keeps light covers legible. Fake the frosted
glass instead: a faint top-down sheen in Theme.text and a fixed grain,
painted once by a Canvas and masked to the panel's rounded corners.
The grain is a Canvas rather than a ShaderEffect because a shader needs
a compiled .qsb beside it; the Canvas repaints only on resize.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
When the current track has art, the volume OSD now draws it across the
whole panel, blurred (MultiEffect blur 0.5, default blurMax) and masked
to the panel's rounded corners, since clip only cuts to the bounding box.
The thumbnail in the track row stays sharp on top.
A dark scrim (Theme.base at 0.82) sits over the art. The palette is dark
and the text light, so a light cover made the panel unreadable, and more
blur did not fix that; only darkening did. The scrim is a sibling of the
MultiEffect, not a child: nested inside it, it did not paint at all, which
is why raising its alpha first appeared to change nothing.
Without art the panel keeps its translucent, compositor-frosted look.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
A Loader keeps the height of its last item after active goes false. When
a browser tab playing media was closed, its MPRIS player vanished,
Player.active dropped and the window shrank to 100px, but the Loader
still reserved 46px plus the Column spacing on top. The volume row was
pushed down and clipped at the bottom edge, which is the "stuck" OSD a
hot reload used to cure: a fresh Loader starts at zero height.
Hiding the Loader while inactive makes the Column skip it. Both the
retained height and the collapse were confirmed with headless qml6 runs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The hand-rolled buttons only reacted to hover, so a press gave no visual
confirmation until the action's outcome appeared. kdeconnect made this
obvious: its row buttons shell out to kdeconnect-cli, and nothing on
screen acknowledged the click.
Button.qml now fills solid accent while the mouse is held (red for
danger), with the label flipped to base for contrast. TransportButton
gets the same treatment, and the window-switcher close button lightens
on press. Toggles, tiles and tabs are left alone: their own state change
is already the feedback.
|
|
The OSD showed only "Output"/"Input", not which device was in use, so
switching between, say, the analogue output and a USB DAC gave no
visible confirmation beyond the volume itself.
The name falls back description -> nickname -> name, the same order
SoundPage.devLabel uses, and elides. The panel height grows to fit the
new line.
|
|
unified-desktop-theme moved its generated files out of ~/.cache/wal, which
pywal used to own and nothing writes any more. The palette udt-accent
generates is now at ~/.cache/udt/udt-palette.qml.
shared/Theme.qml is the only code change; every component reaches it through
a symlink. The module READMEs cite the path, so they move with it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
Glyphs are Nerd Font private-use codepoints, and relying on per-codepoint fontconfig fallback from Noto Sans let the same codepoint resolve to a different glyph in a different Nerd Font.
A Theme.iconFamily now names the render family once, and every glyph Text uses it, while fontFamily stays Noto Sans for words and labels. The ethernet glyph moves from \uf6ff to \uef44, the fa-ethernet codepoint present in Inconsolata.
|
|
The sound page showed the default sink and source but gave no way to
choose another device and the meter was inert. Each section now lists
the real audio devices, streams and monitor nodes filtered out, behind
an in-place dropdown that sets Pipewire.preferredDefaultAudioSink or
preferredDefaultAudioSource. The meter takes the wheel, click and drag,
and the state glyph beside the percentage toggles mute.
The list expands in place rather than in a popup because a
QtQuick.Controls popup is a separate window and does not position
reliably on a layer surface. The meter accepts the wheel and prevents
stealing so the page's ScrollView neither scrolls nor flicks instead.
|
|
The README claimed a click outside returns to the grid; it closes the
drawer, and only Escape-with-a-page or the back arrow return to the grid.
The three moved module READMEs' run and IPC commands still named the
deleted volume-osd, mail-overview and vm-manager paths, so point them at
qs -p desktop and ipc call drawer open sound|mail|vm.
|
|
Five components become three, and the Theme symlink count with them. Two
new notes: a pragma Singleton in a subdirectory resolves through a plain
directory import with no qmldir, and Virsh.sampling gates only the stats
poll, not the lifecycle stream that keeps the tile correct while the page
is closed.
|
|
VolumeOsd.qml did three jobs in one file: PipeWire tracking, the OSD
surface and the player transport. They become Service, Osd and the page.
The OSD keeps its namespace so the existing Hyprland blur rule still
matches, and the service stays always-active because the OSD has to
answer a keypress with no drawer open.
|