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-shell QPA plugin replaces the LayerShellQt dependency. PlasmaZones now works on any Wayland compositor with zwlr_layer_shell_v1 support (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-settings is 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 .js algorithm 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 zoneIds array: Window state responses now include the full list of zone IDs a window occupies.

Changed

  • LayerShellQt replaced: Custom pz-layer-shell QPA plugin is now the sole layer-shell backend. Packagers: drop layer-shell-qt build dependency, add qt6-wayland and wayland-scanner.
  • Config keys centralized (#266): All config group names and key strings extracted to ConfigDefaults accessors. No more inline string literals in settings code.
  • Settings page IDs renamed: snap-* / tile-* page IDs renamed to snapping-* / tiling-* for consistency.
  • Algorithm registry: Hardcoded algorithm ID constants replaced with a data-driven registry. Algorithm metadata (name, capabilities, flags) comes from JS @tag annotations.
  • 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-shell QPA 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 SettingsCard component.

Fixed

  • Window restore on daemon restart: Bypass QSettings cache in loadState so 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 finalizeExitTransition use-after-free when selecting a shader while the menu is animating closed.
  • Editor context menu crash: Use shared context menu instance to prevent QQmlData use-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 LayerSurface is unexpectedly destroyed.

Migration Notes (Packagers)

  • Drop layer-shell-qt / liblayershellqtinterface-dev build dependency
  • Add qt6-wayland / qt6-wayland-dev build dependency
  • Add wayland-scanner build dependency (usually in wayland-devel)
  • Add vulkan-headers and vulkan-loader build dependencies (optional, for Vulkan backend)