PlasmaZones 3.0.5
6 changes, released May 19, 2026.
Fixed
- Shader picker dropdown disabled in the layout editor (#494): checking “Enable shader effect” left the dropdown disabled and unable to select a shader because the editor’s shader list arrived empty. The
availableShadersD-Bus call returns the list as anav(array of variant). Unlikea{sv}, QtDBus does not auto-demarshal a bareavinto aQVariantList. It hands the reply back wrapped in aQDBusArgument, so.toList()silently produced an empty list and every shader was dropped. The reply is now routed throughDBusVariantUtils::convertDbusArgumentfirst, exactly as the siblingshaderInfoandtranslateShaderParamsqueries already did. - Auto-snap-on-open ignored the global snapping toggle (#461, #492): with
Snapping.Enabled=false, newly-opened windows still got auto-snapped to empty or last zones.SnapEngine::resolveWindowRestoregated its empty-zone and last-zone fallbacks only onmodeForScreen() == Snapping, butmodeForScreenreturns the screen’s assigned layout mode, independent of the global Snapping toggle. ThesnapTo*,restoreToPersistedZone, andresolveWindowRestoreD-Bus slots and the sharedapplySnapResultgate never checked the global toggle either. OnlydragStarteddid. Both chokepoints now consultsnappingEnabled(). - Keyboard snap-to-zone shortcuts fired with snapping globally off (#461, #492):
IPlacementEngine::isEnabled()defaulted tofalseandSnapEnginenever overrode it, so the shared keyboard-shortcut dispatcher had no usable gate for snap-mode shortcuts (autotile shortcuts were already gated onAutotileEngine::isEnabled()).SnapEngine::isEnabled()now mirrorsAutotileEngineand reportssnappingEnabled(), and the navigator dispatcher skips any shortcut whose resolved engine is disabled. Together with the auto-snap fix,Snapping.Enabled=falseis now a total kill-switch at parity with autotiling. - Transient child surfaces snapped to zones (#461, #492): the effect’s
shouldHandleWindow()filtered dialogs, utilities, splashes, notifications, OSDs, modals, and popups, but never consultedw->transientFor(), despite the comment claiming it skipped transient windows. Sibling filters in the same file (shouldAnimateWindow,isTileableWindow) already had the transient-parent check. Electron/CEF apps (Steam image previews, Discord popups, VS Code dialogs) spawn child surfaces that frequently fail to report an accurate KWin window type but always settransientFor, so they passed the filter and got snapped to a zone. Transient children are now excluded. - Generic “effect not running” message hid the real cause on bridge timeout (#481, #485): the KWin effect plugin’s IID embeds KWin’s exact upstream version, and KWin’s effect loader silently rejects any plugin whose IID does not match the running compositor, even across patch releases. On bridge watchdog timeout the daemon now reads the installed effect plugin’s embedded IID via
QPluginLoader::metaData(), asynchronously queries the running KWin’ssupportInformation(), and names the exact build-vs-running versions and the remediation in the log and desktop notification. The version probe is non-blocking, so the degraded startup path no longer freezes the daemon event loop for the duration of the round-trip. - Nix flake hardened to keep PlasmaZones in sync with the host’s KWin (#481, #489): expanded module documentation, a new
overlays.defaultoutput, and explicit guidance steer users toward the NixOS module, Home Manager module, and overlay (which build against the consumer’s pkgs) and away fromnix profile install/packages.default(which pins to the flake’s own nixpkgs and breaks silently when the host’s KWin moves pastflake.lock).