PlasmaZones 2.5.0
43 changes, released March 30, 2026.
Added
- Scripted tiling algorithms (#256, #259): All 24 tiling algorithms are now JavaScript, running in a sandboxed QJSEngine with hot-reload. The 15 former C++ algorithms have been converted to JS with identical behavior. Six new algorithms added: Cascade, Corner Master, Floating Center, Horizontal Deck, Paper, and Stair. Custom user algorithms are loaded from
~/.local/share/plasmazones/algorithms/. - Dwindle (Memory) algorithm: Dwindle variant with a persistent split tree, where resizing one tile does not affect others. Split positions survive window close/reopen.
- Multi-compositor support (#261): Custom
pz-layer-shellQPA plugin replaces theLayerShellQtdependency. PlasmaZones now works on any Wayland compositor withzwlr_layer_shell_v1support (Hyprland, Sway, Wayfire, niri, COSMIC, river, labwc). - Vulkan rendering backend (#264): Optional Vulkan backend for zone overlay rendering with automatic fallback to OpenGL on unsupported hardware or driver crash. User-selectable in Settings → General.
- New Layout / New Algorithm wizards (#263): Guided dialogs for creating zone layouts from templates and tiling algorithms from a starter script, accessible from the settings app.
- Layout filter bar (#265): Replace hardcoded layout groups with configurable group-by, sort-by, and filter controls in the layout list.
- Disable per virtual desktop / activity (#260): Disable PlasmaZones on specific virtual desktops or activities per screen. Overlay hides automatically on disabled contexts.
- Settings UX polish (#268, #269): Two-line description rows, collapsible card sections, consolidated footer bar with Apply/Reset/Defaults, sidebar page badges, inline toggle switches replacing disable checkboxes.
- Single-instance settings app (#270):
plasmazones-settingsis now single-instance via D-Bus. Launching it again raises the existing window and navigates to the requested page (--page <name>/-p <name>). - Unsaved changes confirmation: Settings app prompts before closing with unsaved changes. Reset and Defaults buttons require confirmation.
- Master indicator dots: Algorithm grid cards show dots indicating which zones are master positions.
- Memory indicator icon: Stateful algorithms (Dwindle Memory) show a persistence icon in the algorithm selector.
- Per-algorithm settings storage: Split ratio, master count, and other parameters are saved per-algorithm rather than globally.
- Algorithm import and open folder: Import
.jsalgorithm files and open the user algorithm directory from the tiling settings page. - Algorithm capability grouping: Tiling algorithms grouped by capability (Built-in / Extras / Custom) in the settings UI.
- D-Bus
zoneIdsarray: Window state responses now include the full list of zone IDs a window occupies.
Changed
- LayerShellQt replaced: Custom
pz-layer-shellQPA plugin is now the sole layer-shell backend. Packagers: droplayer-shell-qtbuild dependency, addqt6-waylandandwayland-scanner. - Config keys centralized (#266): All config group names and key strings extracted to
ConfigDefaultsaccessors. No more inline string literals in settings code. - Settings page IDs renamed:
snap-*/tile-*page IDs renamed tosnapping-*/tiling-*for consistency. - Algorithm registry: Hardcoded algorithm ID constants replaced with a data-driven registry. Algorithm metadata (name, capabilities, flags) comes from JS
@tagannotations. - README streamlined: Detailed algorithm table, shader table, D-Bus API reference, and project structure moved to the wiki. README reduced from 742 to 593 lines with summary + wiki links.
Removed
- LayerShellQt dependency: No longer required. Replaced by
pz-layer-shellQPA plugin. - C++ tiling algorithm implementations: All algorithms are now JavaScript. The C++ implementations have been removed.
- Legacy migration code: Removed all config key migration and backward-compatibility shims from settings save/load paths.
- kcfg/kcfgc schema files: Unused KConfig schema files removed.
- Accent stripe feature: Removed from
SettingsCardcomponent.
Fixed
- Window restore on daemon restart: Bypass QSettings cache in
loadStateso window-to-zone mappings are read fresh from disk after daemon restart (#268). - Multipass shader rendering: Fix ping-pong buffer handling in overlay renderer for multi-pass shaders.
- Editor shader menu crash: Rewrite shader submenu to prevent Qt 6
finalizeExitTransitionuse-after-free when selecting a shader while the menu is animating closed. - Editor context menu crash: Use shared context menu instance to prevent
QQmlDatause-after-free when zones update while the popup is open. - NVIDIA Vulkan crash: Suppress spurious shutdown crash on NVIDIA drivers and auto-fallback to OpenGL.
- NVIDIA EGL crash in editor: Guard shader preview reload against EGL context loss on NVIDIA.
- Layout picker dimmed backdrop: Remove unintended dimmed background overlay from the fullscreen layout picker.
- CAVA crash suppression: Suppress misleading “CAVA Crashed” error message caused by process-group SIGTERM during daemon shutdown.
- Shader preview bindings: Restore reactive label and wallpaper texture bindings in the editor shader preview.
- Settings dirty flag on navigation: Prevent spurious unsaved-changes prompts when switching between settings pages.
- Slider snap-back bug: Fix master count control snapping back to previous value, replacing SpinBox with SettingsSlider.
- Aspect ratio menu: Replace flat menu items with nested submenu for aspect ratio presets.
- Layer-shell window recovery: Recover shader preview when the Wayland
LayerSurfaceis unexpectedly destroyed.
Migration Notes (Packagers)
- Drop
layer-shell-qt/liblayershellqtinterface-devbuild dependency - Add
qt6-wayland/qt6-wayland-devbuild dependency - Add
wayland-scannerbuild dependency (usually inwayland-devel) - Add
vulkan-headersandvulkan-loaderbuild dependencies (optional, for Vulkan backend)