Repository navigation
veiland 0.2.0
veiland 0.2.0
Veiland gains a Python plugin tier: a full SDK plus nine ready-made
widgets, so a scene can now show the weather, what's playing, or your
network state without writing Rust. Wallpapers can blur, plugins can be
anchored to a corner instead of pinned to pixel coordinates, and the
text tier moved to Pango markup.
Upgrading from 0.1.0: read Removed and Changed first. The
clock and label plugins are gone, and PAM no longer runs the account
phase.
Added
Python plugin tier
veiland_plugin.py, a Python SDK mirroring the Rust one: wire codec,
Connection, GBM buffer allocation,FramePacer, andBufferChain.
Plugins are ordinary Python programs; the wire format was never tied
to Rust, and this is the proof.- Four companions:
veiland_text(Pango text),veiland_svg(SVG icon
rendering),veiland_dbus(D-Bus, no async runtime), and
veiland_layout(content anchoring and debug borders). - Nine widgets installed as
veiland-*commands on every packaging
target:markup,weather,now-playing,avatar,wifi,
ethernet,bluetooth,battery,shape. markupis the new text tier: one block of Pango markup with ten
substitutions:{user},{name},{host},{time},{date},
{uptime},{loadavg},{kernel},{distro},{distro_version}.
{time}and{date}take a strftime format; a bad one shows the text
you typed instead of crashing.weatherreads Open-Meteo by city name or latitude/longitude. No API
key, and the fetch uses only the standard library, so it adds no
dependency beyond the shared widget stack. Eleven CC0 icons included.now-playingshows the current MPRIS track, read-only.shapedraws a rounded colored rectangle, a backdrop to group other
widgets against.- Python tooling in CI: ruff, mypy
--strict, and pytest.
Core
- Anchored region placement:
halign/valignwith fraction-of-surface
width,height, andmargin(margin_x/margin_yper axis). A
widget anchored to a corner lands in the same relative spot on 1080p
and 4K, instead of at fixed pixel coordinates. --helpand--version. Version carries the git revision on builds
offmaster, so a bug report says which build it came from.VEILAND_GL_DEBUG=1for GL diagnostics: the driver debug callback
where available, with aglGetErrorfallback.
Plugins
wallpapergainedblur,darken, andblur_regions: blur the
whole surface, then tint rounded regions on top as frosted cards.particlesgained an opt-intwinkle(withtwinkle_speedand
twinkle_depth) for a shimmering starfield.- Optional labels beside the glyph on
wifi,bluetooth, and
battery;avatargained a rounded-squareshape.
Scenes and docs
- Four composed example scenes with screenshots:
aurora-corners,
aurora-card,aurora-dashboard, anddeepfield. - A documentation website (Zola), with per-plugin reference pages
generated from a single source and checked in CI. docs/plugin-python.md, the Python SDK reference.- Manual VM packaging tests (
scripts/vmtest/) that boot real Debian,
Fedora, and Arch guests, install the built package, and verify the
widget dependency closure resolves.
Changed
- PAM now runs
pam_authenticateonly, notpam_acct_mgmt. A
correct password was intermittently rejected right after a fast logout
and login, because the account phase returned a transient error while
logind tore down the previous session. A locker re-verifies an
existing session; deciding whether an account may start one is a
login manager's job, and applying it here could lock you out of your
own live session with no way to change the password. Shipped PAM files
drop the now-deadaccountline. Existing installs keep their current
file, where the stale line is simply never evaluated. Trade-off: an
account disabled while the screen is locked still unlocks with a
correct password. The session is already open either way. Configurenow carries the plugin's region dimensions rather than the
full surface size, so a plugin assigned a region renders at that
region's size instead of drawing full-surface and being squashed into
it.- Python widgets are referenced by bare
veiland-*name in the example
scenes, resolved onPATHlike the Rust plugins.
Removed
- The
clockandlabelplugins.markupreplaces both, with
Pango markup, live substitutions, and font matching that follows the
system's configuration. Scenes using them need
binary = "veiland-markup"and atextkey; see
docs/examples/for worked configurations.
Fixed
- CPU-rendered plugins flickered because a single buffer was redrawn in
place while the host was still sampling it.BufferChaindouble-buffers
and fixes it. - Dmabufs that a driver only accepts as external textures rendered black
(NVIDIA marks linear and CPU-written buffers this way, so every CPU
plugin was affected). The core now samples them via
GL_TEXTURE_EXTERNAL_OES, and falls back cleanly on stacks without the
extension. - Glyphs bled into their neighbours in the text atlas; a 1px gutter fixes
it. - A glyph the rasterizer can't render is now reported once instead of
silently vanishing. Hairline font weights drop digits on some fonts,
which previously looked like a bug in the clock.