Releases: Plyply99/Plaid
Release list
v51.17
v51.17
What's fixed
- Lingering scratchpad border — Fallout 76 Quick Configuration (and similar apps) used to keep their yellow scratchpad border after being removed from the scratchpad. It now cleans up properly.
- Scratchpad key going silent — on some logins the scratchpad shortcut randomly stopped working. Plaid now notices when it clashes with a GNOME shortcut, tells you in plain language, and can fix it with one click.
New for fresh installs
- New default scratchpad shortcuts: Shift+Super+S to stash a window away, Ctrl+Super+S to bring your scratchpads back — chosen so they don't step on anything GNOME uses.
Good to know
- Your shortcuts stay exactly as they are. The new defaults only apply to brand-new installs — existing setups are untouched. (Tiny exception: if you've never changed a single Plaid setting, you'll get the new shortcuts above — rebind in Preferences → Keybindings if you'd rather keep the classic ones.)
- While Plaid runs, a few GNOME shortcuts (like Super+H for minimize) politely step aside — but only when Plaid is actually using that key. They come back if you turn Plaid off.
- Changed your mind about GNOME's Super+Shift+Escape? Run
gsettings reset org.gnome.mutter.keybindings cancel-input-captureto get it back.
v51.16
v51.16
Scratch layer fix + the floating double-border resolution.
Highlights
- Scratch layer fixed — "Add to Scratchpad did nothing" (no popup, no minimize, no ring): the late-identity force-reveal (meant for spawn-hidden windows) was un-minimizing scratch windows within milliseconds of the add — GTK re-applies titles on state changes, so any identity/title notify undid the hide instantly. Registered-late floats (e.g. nautilus, which is float-listed yet registered) were the affected class. The reveal now skips deliberately minimized windows; spawn-hidden windows still reveal as intended. Also converted
_scratchpadRemove's silent catch into a loggedscratch remove failed:(it had been swallowing toggle-off errors with no trace) - Double border on floating XWayland windows fixed — the exactly-one-border client-type rule (after two failed earlier attempts): Wayland + rounded corners → the SDF is the sole border (the widget is captured and clipped by the mask, and its creation raced the mask — the DDT border flip-flop, also fixed); X11 → the widget is the border when its stroke fits the allocation (shadowed windows), the SDF for zero-shadow electron windows (Steam's Special Offers); childless X11 windows get a widget placeholder that swaps seamlessly to the SDF when the surface attaches — no double, no borderless gap
- Widget borders animate now — they were drawn via Clutter's
queue_redraw(), which repaints the cached texture without running the cairo handler; the gradient rotation never fired (masked by the SDF being the visible border on masked windows). Now invalidated via the DrawingArea's ownqueue_repaint()— widget gradients rotate like the SDF borders
Diagnostics (enable Debug Logging in prefs to view)
float reveal skipped (minimized)/scratch add: after minimize…/popup shown: <title>/mask uniforms: …— the probes that diagnosed this round
Notes
- The scratch ring for Wayland windows now draws via the SDF (just inside the border) instead of the outer widget ring — single ring, consistent with the exactly-one-border rule
- The Steam login-popup double border falls under the fixed client-type rule
Known limitations (upstream, unchanged)
- Steam/XWayland content-loss on workspace round-trips (steam-for-linux#10869)
- eframe/wgpu apps have no rounded corners (content bypasses Clutter's paint pipeline)
v51.15
v51.15
The GNOME 50/51 API audit, the stacking rework, and two cleanup batches.
Highlights
- API audit — features that never worked, now fixed:
- The float re-assert was dead for years (
global.window_group.get_child_index()doesn't exist in GNOME 50/51 — the helper threw, silently swallowed) — this was the float-sink; floats/transients are now genuinely re-raised after restacks - The background-app lock-cycle resume was dead (
win.is_client_window()doesn't exist) — no more duplicate bg-app spawn after lock cycles - The grab grace threshold never scaled (monitor lookup API missing) — now sized per monitor
- The blur's stage-view correction is now feature-detected — correct sampling on non-origin monitors under GNOME 50
- The float re-assert was dead for years (
- Stacking rework (the switch-arrival flash): raises now use mutter-native
win.raise()(regional damage + persistent mutter z — no more whole-screen redraws, and the reveal can't undo the raise), the blur-sibling glue only reorders when a sibling is genuinely above its float, and a 50ms settle poll after workspace switches covers XWayland's late surface commits — switching workspaces is jank-free - Gaps (outside/inside consistency): all 10 leftover
workArea ± gaparea computations now honor the per-edge outside gaps — no more drag-end jumps or misaligned drop previews with non-default outside gaps - Hygiene: per-pass border-animation log pairs eliminated, settle corrections no longer starved by the animation gate, rotation follows Border Animation Speed alone, dead code removed,
[plaid]double-prefix fixed, Wayland-only guard that actually works (introspectable context check), timer/signal/map lifecycle prunes
Notes
- No schema changes (no settings migration)
- The Wayland guard now genuinely rejects X11 sessions (it was inert before) — Wayland behavior unchanged
- Known limitations (upstream, unchanged): Steam/XWayland content-loss on workspace round-trips (steam-for-linux#10869), Steam login-popup transient double border, eframe/wgpu no rounded corners
v51.14
v51.14
The Firefox placement saga, the Inside/Outside gaps rework, and the popups consolidation.
Highlights
- Firefox placement saga (client session-restore race): Firefox re-applies its remembered window geometry AFTER being tiled, fighting the placement. Fixed end-to-end:
- The real blocker:
_windowSlotRectreturned null for single-dwindle windows (the BSP tree is never built for a lone window), so every settle re-assert silently no-oped — single-window slots now match the placement rect exactly - A 400ms settle-window poll (6s per new window) corrects client resizes within ~0.5s via a direct re-place (the forced-configure path — the same mechanism as the maximize keybind)
- Tight 4px verify tolerance for new-window placements; a one-shot settle re-request after placement give-ups
- Upstream context: this is the known Wayland tiler-vs-client resize fight (niri#2457: "clients are in full control of their size"); compositors only enforce geometry in the maximize/tile states, which are gap-less — so a gap-design tiler must win the last move
- The real blocker:
- Gaps rework (Hyprland-style):
gap→ Inside Gaps (inside-gap, spacing between windows),single-gap-*→ Outside Gaps (outside-gap-top/bottom/left/right, per-edge spacing between windows and the screen edges). Multi-window layouts' outer edges now use the outside gaps — one concept everywhere, live re-tile on changes - Popups consolidation: one Show Popups toggle (was workspace-popup + tiling-popup)
- Self-heals: mask-only windows purge stale widget borders; blur siblings re-attach when their source actor is detached/replaced
- Debug Logging toggle (from v51.12's lineage) — verbose diagnostics to the journal, enable only when troubleshooting
Known limitations (upstream, not Plaid)
- Floating Steam/electron (XWayland) windows can lose content or sink below the tiled stack after a workspace round-trip — reproduces with Plaid fully disabled; Chromium/XWayland occlusion behavior (steam-for-linux#10869, open since May 2024;
-system-composertested and does not help). Likely resolves when Steam ships native Wayland - Steam's login popup shows a transient double border during its geometry churn (accepted cosmetic quirk — the widget border is the live border for floating windows)
- eframe/wgpu apps do not get rounded corners (architectural: content bypasses Clutter's paint pipeline)
v51.13
v51.13
Small quality-of-life patch.
Changes
- Scratchpad hotkey is now a toggle: Super+Shift+Esc hides the focused window into the scratchpad — press it again to fully restore it (original workspace, position, and size). The separate "Remove from scratchpad" keybinding (Super+Ctrl+Shift+Esc) is gone — redundant with the toggle. Prefs/schema/terminal-settings labels updated to match.
v51.12
v51.12
EGO-readiness cleanup, deep-review hardening, and the Steam/XWayland saga resolution.
Highlights
- EGO-readiness cleanup: spike probes removed, bg-app cycle logs debug-gated,
terminal-profile-integrationis now opt-in (default off) with a prefs toggle - Deep-review hardening (correctness + responsiveness): DDT late-claim visibility, fade-in fix, reveal-timer tracking, radius clamps, warp-clear borders, dead-code sweep, mask/scan-signature gates, drag-preview, retile stabilization, prefs history on popover-open
- New Debug Logging toggle in prefs (verbose
[plaid]diagnostics to the journal — enable only when troubleshooting) - Steam/XWayland resolution: border/mask restored to the proven v51.11 mechanism; float re-assert now covers unmanaged windows; border sig-gate tracks actor replacements (borders survive X11 surface round-trips); mask self-heal — X11 windows whose client texture swaps (foreign-texture captures render empty) get their mask dropped + quarantined instead of showing transparent content
Known limitations (upstream, not Plaid)
- Floating Steam/electron (XWayland) windows can lose content or sink below the tiled stack after a workspace round-trip — reproduces with Plaid fully disabled; Chromium/XWayland occlusion behavior (same family as steam-for-linux#11077 / electron#48737). Likely resolves when Steam ships full Wayland
- Steam's login popup shows a transient double border during its geometry churn (accepted cosmetic quirk — the widget border is the live border for floating windows)
- eframe/wgpu apps do not get rounded corners (architectural: content bypasses Clutter's paint pipeline)
v51.11
Blur is now rendered entirely in-house: a pure-GJS effect that renders mutter's own Gaussian kernel with Plaid's rounded-corner cut, through cached offscreen buffers. No bundled libraries, no environment configuration, no restart — the same code works on GNOME 50 and 51.
Older installs are swept automatically: leftover artifacts from the previous blur implementation (an environment.d config and the bundled library directory) are removed on enable.
v51.10
Fixes and polish batch.
- Cursor warp on GNOME 51: the same clutter_get_default_backend removal that
broke the blur library also silently disabled cursor warp (every trigger
threw). Warp now resolves the backend via the context-accessor route
(stage → context → backend); the GNOME 50 path is unchanged - Non-resizable windows (min===max size hints) now float immediately instead
of running the ~2s placement retry dance before the give-up float - Hover-focus: minimized windows are skipped in the pointer scan — a hidden
DDT, scratchpad-hid, or Super+H window overlapping the cursor no longer
nulls the scan via the popup reach-through protection - New "Show Init Overlay" toggle (General page, default on, applies at your
next login) for the full-screen "Plaid is initializing…" login moment - Log hygiene: routine landing/audit/maximize/scratchpad/background-app
diagnostics are gated behind the debug setting; error logs stay loud
Validated: GNOME 50.4 host (toggle on/off, DDT hover-focus with large DDT
heights, fixed-size float, warp unchanged). GNOME 51 warp verification on the
CachyOS machine still pending at release time.
v51.09
Fixes a GNOME 51rc session crash on blur enable.
Root cause: the 51.beta → 51.rc transition removed the private Clutter accessor clutter_get_default_backend from libmutter-clutter — extensions binding mutter's private blur layer (this extension's C blur library, cloned from GNOME Shell's ShellBlurEffect) died with 'undefined symbol: clutter_get_default_backend' at first blur use, taking the compositor down with it. Verified on CachyOS/Arch (mut terr 51rc-1) and Fedora 45 (mut ter-51~rc-2): both rc trees lack the symbol (nm -D fingerprint), while 51.beta exported it.
Fixes:
- The blur attach builds lazily at first paint (after the actor binds) with a NULL-actor-safe context-accessor route: ClutterContext → Backend → CoglContext via clutter_actor_get_context/clutter_context_get_backend/clutter_backend_get_cogl_context (the 51rc-era actors), eliminating the β-era global accessor dependency
- GNOME 51rc removed StBoxLayout's vertical property — five StBoxLayout constructors now use orientation: Clutter.Orientation.VERTICAL (dual-safe on 50 as well)
- Environment.d conf freshness reads bytes via TextDecoder instead of Uint8Array.toString (deprecation-free on gjs 1.90+)
Also shipped with the earlier v51.07/08 blur work: the in-guest 51rc-built blur library validated on CachyOS (crash-free enable, ABI-correct). Blur rendering itself on 51rc llvmpipe stacks shows a silent no-op upstream (both native ShellBlurEffect and this library) — tracked separately; the crash class introduced by blur enable is fixed here.
Validated: CachyOS/Arch GNOME 51rc (session holds, crash chain eliminated), Fedora 45 ABI fingerprint, GNOME 50.4 host unaffected by the ABI guard.
v51.08
Blur: the bundled typelibs now ship RAW (shared-library is a bare name resolved via the session LD_LIBRARY_PATH from plaid-blur.conf) — one machine-independent artifact for host, VMs, and auto-updated installs. Fixes v51.07 auto-updates silently downgrading non-host installs to Shell.BlurEffect square blur (baked host paths). The Blur-import failure fallback is now loud in the journal and distinguishes the designed pre-relog state from artifact breakage. build-blur.sh: typelib baking is opt-in via INSTALL_LIB (system images without the conf, e.g. PlaidOS). Anti-aliased corners from v51.07 unchanged. Validated on GNOME 50.4 host (gjs 1.88) and 51.beta VM (gjs 1.89, llvmpipe).