Skip to content

veiland 0.2.0

Choose a tag to compare

@sylflo sylflo released this 26 Aug 20:12
· 9 commits to master since this release

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, and BufferChain.
    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.
  • markup is 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.
  • weather reads 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-playing shows the current MPRIS track, read-only.
  • shape draws 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/valign with fraction-of-surface
    width, height, and margin (margin_x/margin_y per axis). A
    widget anchored to a corner lands in the same relative spot on 1080p
    and 4K, instead of at fixed pixel coordinates.
  • --help and --version. Version carries the git revision on builds
    off master, so a bug report says which build it came from.
  • VEILAND_GL_DEBUG=1 for GL diagnostics: the driver debug callback
    where available, with a glGetError fallback.

Plugins

  • wallpaper gained blur, darken, and blur_regions: blur the
    whole surface, then tint rounded regions on top as frosted cards.
  • particles gained an opt-in twinkle (with twinkle_speed and
    twinkle_depth) for a shimmering starfield.
  • Optional labels beside the glyph on wifi, bluetooth, and
    battery; avatar gained a rounded-square shape.

Scenes and docs

  • Four composed example scenes with screenshots: aurora-corners,
    aurora-card, aurora-dashboard, and deepfield.
  • 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_authenticate only, not pam_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-dead account line. 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.
  • Configure now 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 on PATH like the Rust plugins.

Removed

  • The clock and label plugins. markup replaces both, with
    Pango markup, live substitutions, and font matching that follows the
    system's configuration. Scenes using them need
    binary = "veiland-markup" and a text key; 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. BufferChain double-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.