Releases: fuddlesworth/PlasmaZones
PlasmaZones v3.0.15
PlasmaZones v3.0.15
Fixed
- Zone-selector popup at the screen edge switched the active layout on hover, resnapping every tiled window (#542): the zone-selector slot was supposed to be input-transparent during drag — cursor coordinates come in via the D-Bus
updateSelectorPositionpath and the snap commits at drag-end viadrop.cpp, never via a Qt hover event. But the slot's QMLMouseAreas still firedzoneSelectedon every pointer-enter, and once snap-assist became visible the shared shell surface flipped to input-grabbing (anyInputGrabbing = isVisible(snapAssistSlot) || isVisible(layoutPickerSlot)insyncPassiveShellSurfaceState) — those leaked hover events committedmanualLayoutSelected, which immediately resnapped every other tiled window into the new layout's zones. Visible as "my layout changes to one with more or fewer windows whenever I drag windows up". The QML hover commit path is gone (ZoneSelectorContentis nowinteractive: falseand the daemon'smanualLayoutSelectedhandler / signal are removed); cross-layout switching on drop still works becauseWindowDragAdaptor::dragStoppedreadsm_selectedLayoutIdfrom the C++ hit-test and applies the layout when the user actually releases the drag on a zone in a different layout.
Removed
- Switching the autotile algorithm by hovering an autotile preview in the zone-selector popup (#542): the autotile-hover commit path went away with the input-contract fix above (
drop.cppresolves the selected id as a UUID and skips non-UUID autotile ids, so the hover path was the only commit point for autotile-via-zone-selector). Algorithm swaps still work through the existing on-by-default routes:NextLayout/PreviousLayout,QuickLayout1–QuickLayout9, and the Layout Picker (Meta+Alt+Spaceby default). TheIOverlayService::autotileLayoutSelectedsignal and its daemon handler were removed as dead code.
Installation
Arch Linux (AUR):
yay -S plasmazones # or plasmazones-binArch Linux (manual):
sudo pacman -U plasmazones-3.0.15-*-x86_64.pkg.tar.zstKDE Neon / Debian-based:
sudo dpkg -i plasmazones_3.0.15-*_amd64.deb
sudo apt-get install -f # Install dependencies if neededFedora (COPR):
sudo dnf copr enable fuddlesworth/PlasmaZones
sudo dnf install plasmazonesFedora (manual RPM):
# Fedora 43
sudo dnf install plasmazones-3.0.15-*.fc43.x86_64.rpm
# Fedora 44
sudo dnf install plasmazones-3.0.15-*.fc44.x86_64.rpmopenSUSE Tumbleweed (manual RPM):
sudo zypper install plasmazones-3.0.15-*.x86_64.rpmopenSUSE Tumbleweed (OBS):
sudo zypper addrepo https://download.opensuse.org/repositories/home:fuddlesworth/openSUSE_Tumbleweed/home:fuddlesworth.repo
sudo zypper refresh
sudo zypper install plasmazonesUniversal Linux (AppDir):
For Fedora Atomic, Steam Deck, or non-root user installation:
tar xzf plasmazones-3.0.15-linux-x86_64.tar.gz
cd plasmazones-linux-x86_64
./install.shNixOS (flake):
# flake.nix inputs
plasmazones.url = "github:fuddlesworth/PlasmaZones";
# configuration.nix
programs.plasmazones.enable = true;NixOS (standalone):
Download plasmazones.nix from the release assets, then:
# configuration.nix
environment.systemPackages = [
(pkgs.callPackage ./plasmazones.nix {})
];Post-Installation
systemctl --user enable --now plasmazones.service
systemsettings kcm_plasmazonesPlasmaZones v3.0.14
PlasmaZones v3.0.14
Fixed
- DPMS-wake autotile orphan reassignment still triggered intermittently (#527, #536): 3.0.13 closed the dropped-monitor case but missed the dual-monitor wake-up where the second output coming back simply shifts the first output's x-offset. With no output actually removed,
oldScreenStillConnectedstayed true, andisScreenChangeInProgress()hadn't flipped on yet because KWin emits the per-windowoutputChangedbefore thevirtualScreenGeometryChangedthat the screen-change debounce listens for — the orphan reached the autotile-delegation guard with both legs of the check false.screenAddedandscreenRemovedare now also wired into the screen-change handler, latching the pending-change flag at the earliest point KWin tells us the output set is changing. The settle path that runs oncevirtualScreenGeometryChangedcatches up is unchanged.
Installation
Arch Linux (AUR):
yay -S plasmazones # or plasmazones-binArch Linux (manual):
sudo pacman -U plasmazones-3.0.14-*-x86_64.pkg.tar.zstKDE Neon / Debian-based:
sudo dpkg -i plasmazones_3.0.14-*_amd64.deb
sudo apt-get install -f # Install dependencies if neededFedora (COPR):
sudo dnf copr enable fuddlesworth/PlasmaZones
sudo dnf install plasmazonesFedora (manual RPM):
# Fedora 43
sudo dnf install plasmazones-3.0.14-*.fc43.x86_64.rpm
# Fedora 44
sudo dnf install plasmazones-3.0.14-*.fc44.x86_64.rpmopenSUSE Tumbleweed (manual RPM):
sudo zypper install plasmazones-3.0.14-*.x86_64.rpmopenSUSE Tumbleweed (OBS):
sudo zypper addrepo https://download.opensuse.org/repositories/home:fuddlesworth/openSUSE_Tumbleweed/home:fuddlesworth.repo
sudo zypper refresh
sudo zypper install plasmazonesUniversal Linux (AppDir):
For Fedora Atomic, Steam Deck, or non-root user installation:
tar xzf plasmazones-3.0.14-linux-x86_64.tar.gz
cd plasmazones-linux-x86_64
./install.shNixOS (flake):
# flake.nix inputs
plasmazones.url = "github:fuddlesworth/PlasmaZones";
# configuration.nix
programs.plasmazones.enable = true;NixOS (standalone):
Download plasmazones.nix from the release assets, then:
# configuration.nix
environment.systemPackages = [
(pkgs.callPackage ./plasmazones.nix {})
];Post-Installation
systemctl --user enable --now plasmazones.service
systemsettings kcm_plasmazonesPlasmaZones v3.0.13
PlasmaZones v3.0.13
Fixed
- Windows from disabled monitors got pulled into the active autotile zone after DPMS sleep (#527, #528): with one monitor autotile-disabled, waiting for that monitor to power off and then moving the mouse to wake the active monitor would cause windows from the disabled monitor to be tiled into the active zone. KWin reassigns orphaned windows from a dropped-out monitor to a remaining output and fires
outputChangedfor each, indistinguishable from a deliberate cross-screen move. The snapping D-Bus path already guarded for this witholdScreenStillConnected && !isScreenChangeInProgress(), but the autotile delegation immediately above ran unconditionally — so the orphan reassignment was mistaken for the window genuinely entering autotile. The disconnect check now feeds both paths via a sharedinvoluntaryMoveflag; recovery is owned by the daemon'svirtualScreensReconfiguredhandler once the screen change has stopped chattering.
Installation
Arch Linux (AUR):
yay -S plasmazones # or plasmazones-binArch Linux (manual):
sudo pacman -U plasmazones-3.0.13-*-x86_64.pkg.tar.zstKDE Neon / Debian-based:
sudo dpkg -i plasmazones_3.0.13-*_amd64.deb
sudo apt-get install -f # Install dependencies if neededFedora (COPR):
sudo dnf copr enable fuddlesworth/PlasmaZones
sudo dnf install plasmazonesFedora (manual RPM):
# Fedora 43
sudo dnf install plasmazones-3.0.13-*.fc43.x86_64.rpm
# Fedora 44
sudo dnf install plasmazones-3.0.13-*.fc44.x86_64.rpmopenSUSE Tumbleweed (manual RPM):
sudo zypper install plasmazones-3.0.13-*.x86_64.rpmopenSUSE Tumbleweed (OBS):
sudo zypper addrepo https://download.opensuse.org/repositories/home:fuddlesworth/openSUSE_Tumbleweed/home:fuddlesworth.repo
sudo zypper refresh
sudo zypper install plasmazonesUniversal Linux (AppDir):
For Fedora Atomic, Steam Deck, or non-root user installation:
tar xzf plasmazones-3.0.13-linux-x86_64.tar.gz
cd plasmazones-linux-x86_64
./install.shNixOS (flake):
# flake.nix inputs
plasmazones.url = "github:fuddlesworth/PlasmaZones";
# configuration.nix
programs.plasmazones.enable = true;NixOS (standalone):
Download plasmazones.nix from the release assets, then:
# configuration.nix
environment.systemPackages = [
(pkgs.callPackage ./plasmazones.nix {})
];Post-Installation
systemctl --user enable --now plasmazones.service
systemsettings kcm_plasmazonesPlasmaZones v3.0.12
PlasmaZones v3.0.12
Fixed
- Focus-follows-mouse stole focus from active floating and overflow windows (#461, #525): the 3.0.11 FFM pause fixed the case where an excluded window (emoji picker, notification popup, krunner) was active, but the symmetric case for floating windows still regressed. A manually-floated window, or an overflow window the daemon auto-floats when window count exceeds the
maxWindowscap, sits on top of the tiled stack while the user works in it; moving the cursor across an underlying tiled window's visible edge still activated that tiled window and sent the floating one to the background.handleCursorMoved's active-window guard now also bails whenisWindowFloating()returns true for the focused window.FloatingCachecovers both code paths (user-toggled float and overflow auto-float viaapplyFloatCleanup), so one predicate handles both scenarios. Resumes naturally on the next cursor move once a tiled window becomes active.
Installation
Arch Linux (AUR):
yay -S plasmazones # or plasmazones-binArch Linux (manual):
sudo pacman -U plasmazones-3.0.12-*-x86_64.pkg.tar.zstKDE Neon / Debian-based:
sudo dpkg -i plasmazones_3.0.12-*_amd64.deb
sudo apt-get install -f # Install dependencies if neededFedora (COPR):
sudo dnf copr enable fuddlesworth/PlasmaZones
sudo dnf install plasmazonesFedora (manual RPM):
# Fedora 43
sudo dnf install plasmazones-3.0.12-*.fc43.x86_64.rpm
# Fedora 44
sudo dnf install plasmazones-3.0.12-*.fc44.x86_64.rpmopenSUSE Tumbleweed (manual RPM):
sudo zypper install plasmazones-3.0.12-*.x86_64.rpmopenSUSE Tumbleweed (OBS):
sudo zypper addrepo https://download.opensuse.org/repositories/home:fuddlesworth/openSUSE_Tumbleweed/home:fuddlesworth.repo
sudo zypper refresh
sudo zypper install plasmazonesUniversal Linux (AppDir):
For Fedora Atomic, Steam Deck, or non-root user installation:
tar xzf plasmazones-3.0.12-linux-x86_64.tar.gz
cd plasmazones-linux-x86_64
./install.shNixOS (flake):
# flake.nix inputs
plasmazones.url = "github:fuddlesworth/PlasmaZones";
# configuration.nix
programs.plasmazones.enable = true;NixOS (standalone):
Download plasmazones.nix from the release assets, then:
# configuration.nix
environment.systemPackages = [
(pkgs.callPackage ./plasmazones.nix {})
];Post-Installation
systemctl --user enable --now plasmazones.service
systemsettings kcm_plasmazonesPlasmaZones v3.0.11
PlasmaZones v3.0.11
Changed
- Layer-shell state setters skip unchanged values across configure events (#522): KWin re-emits
zwlr_layer_surface_v1configure events on every virtual-desktop switch, andapplyPropertieswas unconditionally re-sending the full layer-shell state (anchor, layer, exclusive zone, keyboard interactivity, margin, size, exclusive edge) — six to seven protocol messages per surface per configure. The applied state is now cached per surface and each setter only fires when its source property has actually changed.
Fixed
- Focus-follows-mouse activated tiled windows underneath an active popup (#461, #521): the 3.0.10 FFM fix made auto-focus-follow-mouse consistent for the common case but missed the case where an excluded or untracked window (emoji picker, notification popup, krunner) was active inside a zone. Moving the cursor across the underlying tiled window's visible area still activated that tiled window, sending the just-opened popup straight to the background.
handleCursorMovednow also checks the currently active window — if it is an excluded app, dialog, popup, keep-above overlay, or below the min-size threshold, FFM pauses on the cursor's screen until a tileable window becomes active. - Stale pending-restore entries for excluded apps grew session.json and logged on every daemon start (#461, #521): runtime gates already refused to honor pending restores for excluded apps, but the dead entries persisted on disk in
PendingRestoreQueuesandAutotilePendingRestoresand reappeared on every restart. Both engines now prune their on-disk queues against the current exclusion lists at startup and whenever the lists change. - Drag artifacts, post-snap flicker, and a gray decoration ring during snap drags (#516, #523): the zone-preview
PassiveShellmapped on the Overlay layer fullscreen during a drag, masking KWin's Translucency-while-moving effect. On hybrid Intel+NVIDIA setups (CachyOS, Plasma 6.6.5, NVIDIA 595) this also forced a slower compositional path that produced the visible drag artifacts and post-snap flicker. The PassiveShell role is now downgraded to the Top layer — the same layer KDE's own panels live on — which coexists with the translucency effect. Fullscreen apps on Overlay still draw above the zone preview correctly.
Installation
Arch Linux (AUR):
yay -S plasmazones # or plasmazones-binArch Linux (manual):
sudo pacman -U plasmazones-3.0.11-*-x86_64.pkg.tar.zstKDE Neon / Debian-based:
sudo dpkg -i plasmazones_3.0.11-*_amd64.deb
sudo apt-get install -f # Install dependencies if neededFedora (COPR):
sudo dnf copr enable fuddlesworth/PlasmaZones
sudo dnf install plasmazonesFedora (manual RPM):
# Fedora 43
sudo dnf install plasmazones-3.0.11-*.fc43.x86_64.rpm
# Fedora 44
sudo dnf install plasmazones-3.0.11-*.fc44.x86_64.rpmopenSUSE Tumbleweed (manual RPM):
sudo zypper install plasmazones-3.0.11-*.x86_64.rpmopenSUSE Tumbleweed (OBS):
sudo zypper addrepo https://download.opensuse.org/repositories/home:fuddlesworth/openSUSE_Tumbleweed/home:fuddlesworth.repo
sudo zypper refresh
sudo zypper install plasmazonesUniversal Linux (AppDir):
For Fedora Atomic, Steam Deck, or non-root user installation:
tar xzf plasmazones-3.0.11-linux-x86_64.tar.gz
cd plasmazones-linux-x86_64
./install.shNixOS (flake):
# flake.nix inputs
plasmazones.url = "github:fuddlesworth/PlasmaZones";
# configuration.nix
programs.plasmazones.enable = true;NixOS (standalone):
Download plasmazones.nix from the release assets, then:
# configuration.nix
environment.systemPackages = [
(pkgs.callPackage ./plasmazones.nix {})
];Post-Installation
systemctl --user enable --now plasmazones.service
systemsettings kcm_plasmazonesPlasmaZones v3.0.10
PlasmaZones v3.0.10
Fixed
- Focus-follows-mouse stopped working after any overlay appeared (#461, #517): the focus-follows-mouse stacking-order walk treated the daemon's own full-screen overlay layer-shell surface as a blocking occluder, so once any OSD, snap preview, or layout picker had been shown on an autotile monitor FFM gave up and never resumed. The walk now looks through
plasmazonesdandplasmazones-editorsurfaces to the real window beneath; real overlays (emoji picker, Spectacle, xdg-desktop-portal) still trip the existing guard. - Popups and dialogs could consume the main window's saved zone on reopen (#461, #518): the
PendingRestorequeue was keyed by appId only, so opening any popup or dialog of an app whose main window had previously closed-with-a-zone-assignment consumed the queue's head entry and snapped the popup into that zone. The closing window's structural kind (normal vs transient) is now recorded on each entry, and the consume path refuses to assign an entry to a window of a different kind, leaving it for the next-opening window that does match. Pre-fix on-disk sessions reload with kind=Unknown and the gate stays permissive for them. Steam-class apps whose popups misreport as normal windows still need a separate title-regex follow-up. - Passive overlay shell stayed mapped and prewarmed with effects disabled (#515, #519): the passive overlay's
wl_surfacewas kept mapped even when no overlay slot was live, and the prewarm path did not respect the effects-enabled toggle, leaking compositor work for users who had turned effects off. The shell now unmaps when idle and prewarm is gated on the effects-enabled setting. - Animation shader pattern features scaled inconsistently across monitor sizes (#520): sparkle, streak, and smoke feature density was tied to an arbitrary 800px reference, so pattern density drifted across screen sizes. Features now scale by
iSurfaceScreenPos.zw(anchor size) for constant per-pixel pitch.
Installation
Arch Linux (AUR):
yay -S plasmazones # or plasmazones-binArch Linux (manual):
sudo pacman -U plasmazones-3.0.10-*-x86_64.pkg.tar.zstKDE Neon / Debian-based:
sudo dpkg -i plasmazones_3.0.10-*_amd64.deb
sudo apt-get install -f # Install dependencies if neededFedora (COPR):
sudo dnf copr enable fuddlesworth/PlasmaZones
sudo dnf install plasmazonesFedora (manual RPM):
# Fedora 43
sudo dnf install plasmazones-3.0.10-*.fc43.x86_64.rpm
# Fedora 44
sudo dnf install plasmazones-3.0.10-*.fc44.x86_64.rpmopenSUSE Tumbleweed (manual RPM):
sudo zypper install plasmazones-3.0.10-*.x86_64.rpmopenSUSE Tumbleweed (OBS):
sudo zypper addrepo https://download.opensuse.org/repositories/home:fuddlesworth/openSUSE_Tumbleweed/home:fuddlesworth.repo
sudo zypper refresh
sudo zypper install plasmazonesUniversal Linux (AppDir):
For Fedora Atomic, Steam Deck, or non-root user installation:
tar xzf plasmazones-3.0.10-linux-x86_64.tar.gz
cd plasmazones-linux-x86_64
./install.shNixOS (flake):
# flake.nix inputs
plasmazones.url = "github:fuddlesworth/PlasmaZones";
# configuration.nix
programs.plasmazones.enable = true;NixOS (standalone):
Download plasmazones.nix from the release assets, then:
# configuration.nix
environment.systemPackages = [
(pkgs.callPackage ./plasmazones.nix {})
];Post-Installation
systemctl --user enable --now plasmazones.service
systemsettings kcm_plasmazonesPlasmaZones v3.0.9
PlasmaZones v3.0.9
Fixed
- Per-virtual-desktop and per-activity assignment toggles could not be re-enabled once disabled (#461, #514): the 3.0.8 fix kept the per-desktop and per-activity disable Switch's
checkedbinding live across controller emissions, but the Switch was declared insideAssignmentRow.middleContentand Qt'sItem.enabledcascade carried the row's disabled state down to the nested Switch — leaving no clickable control to flip the context back on.AssignmentRownow exposes acontentEnabledproperty that gates only the combo and clear button, so the Switch inmiddleContentstays clickable while the assignment controls grey out as before. The top-monitor Switch was unaffected because it had always been a sibling of its combo rather than a descendant.
Installation
Arch Linux (AUR):
yay -S plasmazones # or plasmazones-binArch Linux (manual):
sudo pacman -U plasmazones-3.0.9-*-x86_64.pkg.tar.zstKDE Neon / Debian-based:
sudo dpkg -i plasmazones_3.0.9-*_amd64.deb
sudo apt-get install -f # Install dependencies if neededFedora (COPR):
sudo dnf copr enable fuddlesworth/PlasmaZones
sudo dnf install plasmazonesFedora (manual RPM):
# Fedora 43
sudo dnf install plasmazones-3.0.9-*.fc43.x86_64.rpm
# Fedora 44
sudo dnf install plasmazones-3.0.9-*.fc44.x86_64.rpmopenSUSE Tumbleweed (manual RPM):
sudo zypper install plasmazones-3.0.9-*.x86_64.rpmopenSUSE Tumbleweed (OBS):
sudo zypper addrepo https://download.opensuse.org/repositories/home:fuddlesworth/openSUSE_Tumbleweed/home:fuddlesworth.repo
sudo zypper refresh
sudo zypper install plasmazonesUniversal Linux (AppDir):
For Fedora Atomic, Steam Deck, or non-root user installation:
tar xzf plasmazones-3.0.9-linux-x86_64.tar.gz
cd plasmazones-linux-x86_64
./install.shNixOS (flake):
# flake.nix inputs
plasmazones.url = "github:fuddlesworth/PlasmaZones";
# configuration.nix
programs.plasmazones.enable = true;NixOS (standalone):
Download plasmazones.nix from the release assets, then:
# configuration.nix
environment.systemPackages = [
(pkgs.callPackage ./plasmazones.nix {})
];Post-Installation
systemctl --user enable --now plasmazones.service
systemsettings kcm_plasmazonesPlasmaZones v3.0.8
PlasmaZones v3.0.8
Fixed
- KWin crashed (SIGSEGV) when snapping a window to a zone on certain monitors (#511, #513): PlasmaZones' own overlay surfaces (zone overlays, snap-assist) are KWin internal windows, and
KWin::InternalWindow::minSize()dereferences its backingQWindowwith no null check. When that window was not yet realised the call faulted on a null pointer inside Qt and took down the whole compositor, closing every open application. EveryminSize()call site in the KWin effect now skips internal windows, and internal windows are rejected before they can enter the autotile pipeline. - A window snapped near a monitor boundary could jump onto the wrong screen (#513): the drop handler paired the zone rectangle from the last drag tick with the screen resolved at the release point without checking that the two referred to the same monitor. A fast drag across a monitor boundary could therefore apply one monitor's zone rectangle to a window committed on another. The drop path now resolves the captured rectangle's own physical screen and declines the snap on a mismatch, leaving the window at its drop position instead of teleporting it.
- The "Cancel Zone Overlay" Escape shortcut grabbed Esc system-wide (#461, #510): the transient drag-overlay cancel shortcut was written to
kglobalshortcutsrclike a user-customisable binding, so after an unexpected daemon exit the stale entry survived and KGlobalAccel kept routing Escape to a dead action, including over fullscreen games. Transient shortcuts now carry their non-persistent flag all the way to the backend, which scrubs stale on-disk records on registration and removes them on shutdown. - Per-monitor virtual-desktop and activity disable toggles got stuck off (#461, #510): disabling a virtual desktop or activity on a monitor assignment row left the switch frozen in the off position, because an imperative property write had severed its QML binding, and re-enabling never re-drove it. The switches are now read-only consumers of a revision-counter binding, so they track the underlying state correctly.
- Windows opened on monitors or desktops with snapping disabled were still auto-snapped (#461, #510): pending-restore entries already held in memory when a context was disabled leaked through on the next window open, so a window could snap to a zone on a screen the user had turned snapping off for, until the daemon was restarted. Snap restore now runs through the same disabled-context gate as the load, save, and close paths, and the effect's instant-restore cache funnels through it too.
- Electron child popups such as Steam image previews polluted focus tracking (#461, #510): transient popups that KWin does not flag with a reliable popup window type still set a transient parent, so the focus-tracking filter recorded them as the active window and downstream placement routed real windows into the popup's zone. The activation filter now rejects the same structural window types as the snap filter, including any window with a transient parent.
- Session-restored windows were missing from zone-occupancy tracking (#461, #510): when the effect's instant-restore cache placed a window it skipped the daemon round-trip that registers the window in the snap state, so the window sat visibly in its zone but counted as unoccupied, and snap assist and empty-zone placement treated the filled zone as free. Instant-restored windows are now registered with the daemon.
- Snap assist appeared after a bulk resnap that placed nothing (#461, #510): a resnap triggered by an autotile or snap toggle, a rotation, or a virtual-screen reconfigure fired the snap-assist continuation unconditionally, so it popped for every empty zone even though no per-window snap had happened. The continuation is now anchored to the active window and shows only when the resnap actually snapped it.
Installation
Arch Linux (AUR):
yay -S plasmazones # or plasmazones-binArch Linux (manual):
sudo pacman -U plasmazones-3.0.8-*-x86_64.pkg.tar.zstKDE Neon / Debian-based:
sudo dpkg -i plasmazones_3.0.8-*_amd64.deb
sudo apt-get install -f # Install dependencies if neededFedora (COPR):
sudo dnf copr enable fuddlesworth/PlasmaZones
sudo dnf install plasmazonesFedora (manual RPM):
# Fedora 43
sudo dnf install plasmazones-3.0.8-*.fc43.x86_64.rpm
# Fedora 44
sudo dnf install plasmazones-3.0.8-*.fc44.x86_64.rpmopenSUSE Tumbleweed (manual RPM):
sudo zypper install plasmazones-3.0.8-*.x86_64.rpmopenSUSE Tumbleweed (OBS):
sudo zypper addrepo https://download.opensuse.org/repositories/home:fuddlesworth/openSUSE_Tumbleweed/home:fuddlesworth.repo
sudo zypper refresh
sudo zypper install plasmazonesUniversal Linux (AppDir):
For Fedora Atomic, Steam Deck, or non-root user installation:
tar xzf plasmazones-3.0.8-linux-x86_64.tar.gz
cd plasmazones-linux-x86_64
./install.shNixOS (flake):
# flake.nix inputs
plasmazones.url = "github:fuddlesworth/PlasmaZones";
# configuration.nix
programs.plasmazones.enable = true;NixOS (standalone):
Download plasmazones.nix from the release assets, then:
# configuration.nix
environment.systemPackages = [
(pkgs.callPackage ./plasmazones.nix {})
];Post-Installation
systemctl --user enable --now plasmazones.service
systemsettings kcm_plasmazonesPlasmaZones v3.0.7
PlasmaZones v3.0.7
Changed
bouncedrops the window in from above its frame (#475):bouncepreviously revealed the window from its own top edge downward, clipped to the window box. Animation shaders can now opt into a full-surface render mode that gives them room to draw past the window, andbounceuses it to play niri's original drop-from-above motion — the window travels in from above its frame.- Overlay cards unified on one shared frame (#475): the layout OSD, navigation OSD, layout picker, and zone selector each hand-rolled their card background, border, and glow. They now share a single
PopupFramecomponent, so all four read as the same surface and the soft glow is captured into the transition and animates with the card rather than being clipped away for the duration. The layout picker and zone selector pick up the same glow the OSDs use. wave-warpgained afrontSpeedparameter (#475):wave-warpand the formercrosswarpran the identical moving-edge warp, differing only in a front-speed dial. That dial is nowwave-warp'sfrontSpeedparameter (default1.0).
Removed
crosswarptransition (#475): it waswave-warpwith a fixed front speed. Usewave-warpwith its newfrontSpeedparameter instead.plasma-flowtransition (#475): it was a re-skin ofsoft-warp-fade— the same noise-driven UV warp and fade, differing only in trivial constants.
Fixed
- Window open / close animations rendered as ghosted, multi-copy trails on KWin (#475): translation transitions (
bounce,fly-in) drew several overlapping copies of the window during an open or close.paintWindowcalledOffscreenEffect::drawWindowdirectly, leaving KWin's shared draw-window iterator parked at the start, so the offscreen capture re-entered the effect and drew the window's own texture into itself. The transition now routes througheffects->drawWindowso the capture reaches the real draw stage, and KWin's stock fade / scale / slide builtins are held off the window so they no longer render a second concurrent copy. - New windows flashed at their spawn position before animating into place (#475): KWin places a new window (centered or smart) before the effect sees it, and the reposition into a zone or tile is asynchronous on Wayland, so a snap-restored or autotiled window visibly flickered at the centered spawn position for one to three frames. New-window pixels are now withheld until the reposition lands (with a 250 ms safety deadline), so the window first becomes visible already animating into its zone.
- Snap-restored windows played their open animation from the screen center (#475): a snap-restored window ran its
bounce/fly-inopen animation from the centered spawn position and then jumped to the zone once KWin's asynchronous move landed. The in-flight open transition is now pinned to the resolved zone, so the effect plays into the zone from the first frame. - OSD glow popped in at the end of a transition (#475): the soft glow behind the layout and navigation OSDs was clipped away for the duration of a show / hide animation and snapped back into place when the animation ended. The glow is now captured together with the card so it scales and moves with it throughout the transition.
- Faint grey halo around daemon OSDs during
bounce/fly-in(#475): both effects painted a faint grey border around the OSD while animating — the effect's edge feather fell just outside the captured texture and tinted its clamped edge pixels. The edge crop is now a sub-pixel, edge-aligned antialias band, so the border is gone and the edge stays crisp.
Installation
Arch Linux (AUR):
yay -S plasmazones # or plasmazones-binArch Linux (manual):
sudo pacman -U plasmazones-3.0.7-*-x86_64.pkg.tar.zstKDE Neon / Debian-based:
sudo dpkg -i plasmazones_3.0.7-*_amd64.deb
sudo apt-get install -f # Install dependencies if neededFedora (COPR):
sudo dnf copr enable fuddlesworth/PlasmaZones
sudo dnf install plasmazonesFedora (manual RPM):
# Fedora 43
sudo dnf install plasmazones-3.0.7-*.fc43.x86_64.rpm
# Fedora 44
sudo dnf install plasmazones-3.0.7-*.fc44.x86_64.rpmopenSUSE Tumbleweed (manual RPM):
sudo zypper install plasmazones-3.0.7-*.x86_64.rpmopenSUSE Tumbleweed (OBS):
sudo zypper addrepo https://download.opensuse.org/repositories/home:fuddlesworth/openSUSE_Tumbleweed/home:fuddlesworth.repo
sudo zypper refresh
sudo zypper install plasmazonesUniversal Linux (AppDir):
For Fedora Atomic, Steam Deck, or non-root user installation:
tar xzf plasmazones-3.0.7-linux-x86_64.tar.gz
cd plasmazones-linux-x86_64
./install.shNixOS (flake):
# flake.nix inputs
plasmazones.url = "github:fuddlesworth/PlasmaZones";
# configuration.nix
programs.plasmazones.enable = true;NixOS (standalone):
Download plasmazones.nix from the release assets, then:
# configuration.nix
environment.systemPackages = [
(pkgs.callPackage ./plasmazones.nix {})
];Post-Installation
systemctl --user enable --now plasmazones.service
systemsettings kcm_plasmazonesPlasmaZones v3.0.6
PlasmaZones v3.0.6
Fixed
- Settings window (and any 5th+ window) left tiled on autotile→snap (#504):
calculateResnapFromAutotileOrdercapped both passes atmin(windowCount, zoneCount), silently dropping windows past the new layout's zone count even when their pre-autotile zone was unique and still available. With 5 autotiled windows resnapping into a 4-zone layout, the 5th was always left tiled — in practice usually the settings window (last in focus order). The first pass (restore-original-zone) now iterates ALL windows; the positional fallback iterates all windows but breaks once every zone is claimed.claimedZoneIndicesstill prevents double-booking. - 250+ ms stall before windows start moving on autotile→snap (#504):
slotScreensChangedran a synchronoussetNoBorder(false)loop on autotile disable. Each call is a Wayland decoration round-trip (30–120 ms per window) and the loop blocked kwin's main thread long enough that the queuedapplyGeometriesBatch("resnap")D-Bus signal couldn't dispatch. The affected window IDs are now stashed and drained fromslotApplyGeometriesBatch'sonCompleteonce the resnap has been dispatched — windows start animating to their snap positions within ~2 ms of the daemon emit instead of 250+ ms. The drain processes one window per event-loop tick so frames render between calls, keeping the concurrent OSD show animation smooth. A chunk-time check againstm_autotileScreensskips the restore if the user rapid-cycles back into autotile mid-drain (the new toggle'ssetWindowBorderless(true)is now authoritative). - Focus follows mouse not re-focusing after focus steal (#461, #503):
AutotileHandler::handleCursorMovedshort-circuited againstm_lastFocusFollowsMouseWindowId, a local cache of the window it had most recently auto-focused. The cache was only invalidated bysetFocusFollowsMouse(false),onWindowClosedfor the cached ID, andslotScreensChanged— not by Alt-Tab, a click, a daemon-driven activate, or a new window stealing focus. After any of those, the cache pointed at a window the compositor was no longer focusing on, and the next cursor pass-over matched the stale cache and skippedactivateWindow— focus stayed wherever it had drifted to. The cache is replaced with a live read againstKWin::effects->activeWindow(), so the no-op gate fires only when the cursor window actually still holds focus. - Tiling assignments saved on the settings page silently dropped (#497, #499):
LayoutAdaptor::m_algorithmRegistrywas never wired up after the DI refactor — the daemon's composition root set it onOverlayService,ZoneSelectorController, etc., but missedLayoutAdaptor. Every per-monitor / per-activity tiling-mode assignment hitsetAssignmentEntry's validation branch (!m_algorithmRegistry), loggedunknown tiling algorithm: "<id>", and was dropped before being stored. The cascade fell back to the global default, which read like "my changes reverted." Snapping assignments persisted; only tiling assignments vanished. The registry is now injected. - Daemon toggle re-enabling itself after disable (#497, #499):
setEnabled(false)ransystemctl --user disable, which only blocks boot-time autostart. The installed/usr/share/dbus-1/services/org.plasmazones.servicefile pinsSystemdService=plasmazones.service, so any subsequent D-Bus call from the KWin effect (window-lifecycle callbacks likesetWindowMetadata,windowClosed) routed through systemd and started the unit, and the toggle flipped back on within seconds. Switched tosystemctl --user mask, which blocks both autostart and D-Bus-routed activation. Re-enable chainsunmask→enable. - Snapping Assignments Monitor row reverted to old value after Save (#497, #501):
SettingsController::getLayoutForScreen(snapping side) called the daemon's contextualgetLayoutForScreenD-Bus method, which walks the current-desktop / current-activity cascade. The tiling counterpart already queried the explicit screen-level slot. The mismatch let a stored per-desktop or per-activity entry shadow the screen-level slot the user just wrote — the Monitor row's own re-read pulled the higher-priority entry's old value and the combo snapped back. The snapping path now mirrorsgetTilingLayoutForScreen's slot-level shape. - OSD announced the wrong layout name after editing a non-current-context slot (#497, #501): the OSD callback on
applyAssignmentChangesresolved the layout vialayoutForScreen(screen, currentDesktop, currentActivity), the same cascade as the Monitor-row bug. Editing a non-current-context slot (e.g. a screen-level row while aDesktop:1:Activity:Xentry held the visible context) produced an OSD that announced the cascade winner — the unchanged OLD layout — as if it were the change. TheassignmentChangesAppliedsignal now carries the full(screenId, virtualDesktop, activity)of every modified slot, and the OSD resolves the layout at that exact slot. - Windows on disabled monitors / desktops still tracked and resurrected after restart (#461, #498): a window closing on a monitor or desktop the user had disabled snap/autotile on still got a
PendingRestorerecorded, then resurfaced when the same app reopened or KWin rehomed it after the disabled screen slept. The persistedWindowZoneAssignmentsFull,PendingRestoreQueues, andAutotilePendingRestoresare now filtered on both load and save against the current disable lists, andWindowTrackingServicetakes an injectedShouldTrackPredicateso live closes on disabled contexts never write the entry in the first place. The autotile engine matches via an injectedShouldPersistRestorePredicateat three filter sites (live, save, load), so future engine changes can't drift from the snap side (#502). - Re-enabling a disabled virtual desktop sometimes silently failing (#461, #498):
setDesktopDisabled/setActivityDisableddid an exact-string remove using the screen-name form QML supplied, but the read-side check resolved both connector-name and screen-ID forms. After a screen redetect, the re-enable removed zero entries and the desktop stayed disabled. Both setters now try every variant on remove. - Popup menus and Steam image previews snapped to weird zones (#461, #498):
isTileableWindowrejected PopupMenu / DropdownMenu / Menu / Tooltip / keep-above windows;shouldHandleWindowdid not. The asymmetry let a window KWin classifies as e.g. PopupMenu (Steam's chat image-preview popup, on a steamwebhelper class with notransientFor) pass the snap-side filter while autotile rejected it — surfacing as "snapped to a zone in snap mode" depending on the screen's current assignment. Both filters now reject the same window types. - Stale snap assignments from deleted layouts lingering across first-launch (#500):
SnapEngine::onLayoutChanged()'sif (!prevLayout) return;early-out skipped the stale-assignment cleanup on first launch, so session-restored windows whose zone IDs referenced a deleted layout stayed inm_snapStateforever. The cleanup also kept multi-zone windows when any zone survived, leaving dangling zone IDs in the assignment list that downstreammultiZoneGeometry/zonesForWindowwould iterate. The cleanup now runs unconditionally on layout change and rebuilds multi-zone assignments to the surviving subset. - Critical-notification windows triggering focus tracking and appearing in the app picker (#500):
notifyWindowActivatedand the app-picker enumeration rejectedisNotificationbut notisCriticalNotification. KWin treats them as distinct window types, so a critical-notification could fire the focus shader or show up in the KCM exclusion-list picker. Both sites now reject both types. m_shuttingDownflag not reset on daemon restart (#500):stop()set the flag and nothing else cleared it, so anystop()→start()cycle (programmatic restart, tests) left every shutdown-guarded code path silenced on the second run.start()now resets the flag.- Per-screen autotile algorithm change overwrote the global default (#500): changing the autotile algorithm on a single monitor (e.g. spiral on screen B while screen A stays on default) wrote the new algorithm into
Tiling.Behavior.DefaultAlgorithm, so the next per-screen apply on screen A picked up screen B's choice as if it were the user's global default.