PlasmaZones v3.2.0
Added
- Theater, a widescreen layout: keeps a single window centered at a width you set per monitor, so one window never has to stretch across a wide display. With more windows the focused one sits in a centered spotlight and the rest line up on rails in the margins on both sides, and focusing a rail window brings it into the spotlight (#704).
- Window appearance and gaps are now rules: window borders, title bars, corner radius, border colors, and gaps are controlled through the rule system instead of separate per-mode settings pages. A new Windows page under the Appearance category edits the managed defaults, and per-window or per-context overrides are ordinary rules on the Rules page (#699).
- Match by placement mode: a new Mode match condition matches snapped or tiled windows, so snapping and tiling can carry different gaps or appearance. Mode is a context condition, resolved per screen and layout (#699).
- Per-monitor gaps: pick a monitor from the scope chip on the Gaps card to set that screen's gaps independently. The values are stored as a screen-scoped rule (#699).
- Separate focused and unfocused border colors: the border color is now two actions, "Set focused border color" and "Set unfocused border color", each with its own swatch (#699).
- App-managed default rules: the default rules (Default borders, Default title bars, Default gaps) cannot be deleted and stay pinned to the lowest priority (#699).
- Choose which windows the appearance defaults apply to: the Borders and Title bars cards on the Appearance Windows page have an "Apply to" option with three scopes, tiled and snapped windows, all normal windows, and all windows. New installs default to tiled and snapped windows, so the default border and hidden title bar stay off the desktop, panels, popups, and on-screen displays. Existing setups keep their current scope and can switch at any time (#721).
- Show desktop animations: peeking at the desktop can now play a full-screen transition. Pick a pack for the new "Peeked at Desktop" event on the Animations → Transitions → Desktop page. Hiding the windows plays the pack forward and bringing them back plays it in reverse. Every desktop transition pack works here, and three new packs ship with it, Peek Recede, Peek Blinds, and Phosphor Peek. While a pack is set, PlasmaZones takes over from KWin's own show desktop animation and hands it back when the pack is cleared (#777).
- Reset or discard one settings page at a time: most settings pages now have a menu in the breadcrumb row with "Reset page to defaults" and "Discard changes on this page". Both stage the change so you can review it and then Save or Discard like any other edit, and discarding one page leaves your edits on other pages alone (#726).
- More starting points in the New Algorithm wizard: the template picker offers nine templates instead of four, adding Aligned Grid, Dwindle (Memory), Cluster, Theater, and Deck so the resize-aware, split-remembering, custom-parameter, focus-driven, and overlapping layout styles each have a working example to build on. The blank skeleton's capability checkboxes now also cover script state, single window, and follows focus, and the generated body shows the tiny-area guard pattern (#779).
- Genie and Phosphor Siphon, two minimize-to-icon animations: Genie pours the window into its task manager icon like the classic magic lamp, with the edge nearest the icon leading, and restoring pours it back out. Phosphor Siphon does the same journey as separated luminous streams that carry the brand gradient and shed ember sparks, each stream fading into the icon as it lands. A window that is not in any task manager drains into its own bottom edge instead (#776).
- Window decoration effects: a new Decoration category adds shader effects that draw behind and around your windows, picked from a pack browser and saved as reusable sets. Glass, Frosted Glass, and Rippled Glass refract the real blurred backdrop, Blur softens it, and Drop Shadow and Glow sit behind the frame. Border packs replace the plain border with animated ones such as Sweep Border, Circuit Border, Pulse Border, RGB Cycle, Gradient Border, and Marching Ants, and effect packs such as Duotone, Fireflies, Focus Fade, Mosaic, and Rain on Glass tint or texture the window. A window uses either the plain border setting or a decoration pack, and any layer of a pack can be turned off on its own. Per-window and per-context overrides are ordinary rules (#624, #757, #762, #764, #768, #770).
- Audio-reactive window decorations: the Audio Border pack drives its border from the audio spectrum through the same CAVA capture the shaders use, and the compositor animation shaders can read the spectrum as well. The full CAVA parameter set is now editable in settings, covering the bar count, smoothing, noise reduction, frequency range, and channel handling (#624, #752, #763).
- Virtual desktop switch animations: switching virtual desktops can now play a full-screen transition. Turn it on for the new desktop switch event on the Animations → Transitions → Desktop page and pick a pack. Eleven packs ship with it, including Desktop Fade, Desktop Slide, Desktop Wipe, Desktop Cube, and Desktop Dissolve, and the motion follows the direction you switch. It is off by default (#747).
- Set window layer, a new rule action: a rule can keep a matched window above or below other windows, in the spirit of Krohnkite's layers, and PlasmaZones puts the layer back the way it was when the rule stops matching (#759).
- Per-context autotile rule actions: Set algorithm parameter, Set insert position, Set overflow behavior, and Set drag behavior, together with per-context overrides for the maximum window count, split ratio, and master count. A screen, virtual desktop, or activity can tune its tiling without moving the global default (#733).
- New match conditions for rules: Tiled window count matches on how many windows are currently tiled, so a rule can switch algorithm as the count grows (#703), and Active layout scopes a rule to the layout in use (#733).
- Centered, a single-window layout: a bundled algorithm that holds the focused window centered at a width you set and keeps the rest behind it, built on new support for single-window layouts in scripts (#703).
- Back and forward navigation in settings: the settings app remembers the pages you visit, so you can step back to where you were and forward again from the breadcrumb row (#749).
- Randomize and reset for algorithm and shader parameters: the parameter editor gains a randomize control on each parameter and a button to randomize or reset a whole group at once, which makes it quick to explore how a shader or algorithm's settings look (#737).
- Discord community link: the Links card on the About page now has a Discord Community button that opens the project's invite.
Changed
- The Rules page is one flat priority list: rules show in a single, drag-reorderable list ordered by precedence, with the highest-priority rule on top, instead of per-section groups. Drag any rule up or down to set which one wins. The filter button narrows the list by source (system or user-created), category, and status. Search and the monitor strip narrow it further (#720).
- "Window Rules" is now "Rules": the page and the config file (
windowrules.jsonbecomesrules.json) are renamed, because rules now cover gaps, layout, and animation as well as windows. Existing rules carry over automatically (#699). - Window Appearance and Animations are grouped under an Appearance category in the settings sidebar (#699).
- Gaps use one shared model: snapping zone padding and tiling inner gap are now the same setting. Set per-monitor gaps on the Appearance Windows page where a monitor should differ (#699).
- The action and condition pickers are reorganized: both are alphabetized, and the action picker groups the context conditions above the window conditions with a divider (#699).
- Old per-mode appearance and gap settings are unified on upgrade: the snapping and tiling border, title bar, and gap values you had customized collapse into shared Window and Gap settings, and per-monitor gaps move into per-monitor settings. A default configuration is unchanged (#699, #730).
- Dragging a window is its own animation page: drag animations are physics driven and follow the pointer while you hold the window, so they use their own shader type instead of the crossfade shaders. The new Window Dragging page under Animations → Motion holds the event, its picker offers only drag shaders such as Wobbly Move, and it no longer takes the "All Windows" shader from the Window Motion page. If you had Wobbly Move set on "All Windows", pick it again on the new page (#756).
- Layout and zone names are limited to 40 characters everywhere: the zone editor previously allowed zone names up to 100 characters, and names arriving over D-Bus or from imported files were not limited at all. An existing name that is longer keeps working and is shortened the next time the layout is saved (#779).
- Layouts that opt out of minimum window sizes are now left alone: Tatami, Floating Center, Cluster, and Theater each declare that they do not work with minimum window sizes, but the correction pass ran over their zones anyway and reshaped them. Zones from a layout that opts out are now used as the layout produced them. If a window in one of these four had been nudged to meet its minimum size, it keeps the size the layout gives it instead (#779).
- Zone numbers are yours to set: the number shown on a zone in the editor is now a value the zone carries rather than its position in the list, so reordering or editing the zones no longer renumbers them (#779).
- Floating windows restore across monitors: a window you float and then close now reopens on the monitor and position it closed on when you log back in, the same as snapped windows already did. A guard that limited this to a single monitor was removed (#727).
Removed
- The Resized animation event: an interactive resize repaints the window live while you drag its edge, so there is no before and after moment for an animation to play. The event showed a default that never ran and did nothing useful when configured. Size changes from snapping, layout switches, and maximizing keep their animations through those events (#756).
Migration
- Config schema bumped v4 → v5. On first launch after upgrade, the per-mode border, title bar, corner radius, and gap values are converted into rules, and per-monitor gaps become screen-scoped rules. The conversion runs once, keeps the values you had customized, and needs no interaction (#699, #730, #733).
Fixed
- Creating an algorithm from a template keeps its behavior intact: the New Algorithm wizard used to rewrite a template's metadata from the wizard's own four checkboxes, which silently dropped settings that shape how the template behaves, such as the template's own custom parameters, split ratio, and window cap. Only the name and id are personalized now, and the rest of the metadata travels with the copy, which is what lets the wizard offer the newer templates safely (#779).
- Double-clicking Create in the New Layout wizard made two layouts: the Create button stayed live through the dialog's closing animation, so a second click, or holding Return, landed a second layout you then had to delete. The wizard now ignores anything after the first Create, and re-enables it if the create fails so you can correct the name and retry (#779).
- The New Layout wizard tagged layouts with the wrong monitor shape: every choice in the monitor picker stored the shape one step below the one you picked, so a 16:9 layout was filed as suiting any monitor, a 21:9 layout was filed as 16:9, and a Portrait layout was filed as 32:9. Portrait could not be stored at all. The picker now records the shape you chose, and its first option is named "Any" rather than "Auto" because it always meant "offered on every monitor" and never read a monitor to detect anything (#779).
- Some settings and editor animations ignored your animation speed: the hover feedback in the position picker and the settings button groups, the sidebar rows, the wizard template cards, the page fade-in, and the zone editor's own transitions (its top bar, property panel, notification banner, divider handles, zones, and zone buttons) ran at fixed durations, so turning Plasma's animation speed up or down left them alone while the rest of the app followed it. They now read the same theme duration everything else does. At the default speed they keep the timing they have today, so nothing looks different until you ask it to (#779).
- Exporting your settings over the file they live in deleted them: the export made room for the new file by removing whatever was already at the destination, so picking your own
config.jsonremoved the very file it was about to copy, and every setting you had was gone with no backup to fall back on. The message blamed the folder for not being writable. Exporting to the file already in use is now refused, and the export no longer clears the destination at all. It writes to a temporary file and swaps it in only once the write has succeeded, so an export that fails leaves whatever was already there untouched. Importing a file onto itself is refused the same way instead of reporting a failure for what is really a no-op (#779). - Exporting or importing a layout said nothing when it failed: exporting sent the layout off to the daemon and never waited to hear back, so a folder it could not write to, or a disk with no room left, closed the file picker and told you nothing. Importing a file that was not a layout was just as quiet: the page refreshed and you were left to notice that nothing had arrived. Both now say what went wrong, and the export writes to a temporary file and swaps it in only once it has succeeded, so a failed export leaves whatever was already there untouched (#779).
- Exporting your settings saved them as well: Export wrote your unsaved changes into the settings file the app is using, as though you had pressed Save, and moved the point that Discard reverts to. Edits you had not committed became permanent and there was no longer anything to undo them back to. Exporting now writes the settings you can see to the file you picked and leaves the live one alone (#779).
- Exporting or importing your settings said nothing at all: the file picker closed and you were left to guess whether it had worked, or whether it had failed on a path it would not write to, a file that was not a settings file, or a backup it could not take. Both now confirm when they succeed and say what went wrong when they don't. If an import lands but the animation pages cannot be refreshed to match, it now says so rather than reporting plain success, and if your old settings cannot be put back after a failed import it tells you where the backup is (#779).
- Turning animations off made some of them play at full length: with Plasma's animation speed at zero, the animations that scale from the shorter theme durations asked for a zero-length animation, which was read as "no duration set" and fell back to the animation's own full duration. So the setting meant to remove animation gave those the longest one they had. Zero now means zero, and the affected animations are instant as intended (#779).
- Importing an algorithm reported the same failure twice: a refused file toasted both the specific reason and a generic "could not import" behind it. Only the reason shows now (#779).
- The zone picker did not show which zone a window would snap to: while dragging a window, every zone in a layout lit up at once instead of only the one under the cursor, so there was no way to tell where the window would land. Only the zone under the cursor highlights now. The cursor also lands on the right zone more reliably, because the picker used to measure zones against the whole card rather than the smaller preview it draws inside it. That was off by a few pixels for most layouts, and by considerably more for a layout tagged with an aspect ratio that does not match the shape of the preview, such as an ultrawide layout shown in a 16:9 preview (#780).
- Minimizing a window skipped its animation: the Minimized animation event used to fire only when a window was restored, so the way down was always an instant blink. Any animation assigned to the event now plays in both directions, in reverse while minimizing and forward while restoring. Windows excluded from tiling also play their minimize animation now, matching how the other window events already treated them (#776).
- Peek at Desktop did nothing while the effect was loaded: activating Peek at Desktop left every window exactly where it was. KDE reveals the desktop through its Window Aperture effect, which keeps windows on screen and slides them out to the screen edges, and the PlasmaZones effect ended each window's paint step by jumping straight to the draw stage. That skipped the paint step of every effect that runs after PlasmaZones in KWin's chain, so Window Aperture held the windows visible but never got to move them. The effect now continues the paint chain properly, which also restores any other effect that paints after PlasmaZones in KWin's chain. Decorated windows additionally honor opacity fades from other effects instead of always drawing fully opaque, and focus follows mouse pauses during a peek so the hidden window under the cursor is not re-activated (#775).
- Dragging a window stuttered at the start and end of the drag on disks with slow write flushing: the daemon bound a temporary global Escape shortcut on every drag and released it on drop, and each bind made KWin rewrite its shortcut config to disk with an fsync. On a drive with slow flush latency that briefly stalled the compositor at pickup and at drop, while a continuous drag stayed smooth. The per-drag binding is gone, because the KWin effect already grabs Escape for the whole drag, so dragging is smooth regardless of disk. Thanks @arinl for the report and the bpftrace diagnosis (#714, discussion #167).
- Maximize and restore animations never played: maximizing a window with an animation assigned made it vanish for the length of the animation and pop in at full size, and restoring played the wrong motion with every pack except Window morph. The maximize event never told the animation which rectangles it was moving between, and the restore leg ran the timeline backwards for the grid-deformation packs. Both directions now morph between the old and new frame with any geometry pack. Restore also waits for the window's real size change before starting, so an app that is slow to shrink no longer snaps first and animates late, and dragging a maximized window free by its title bar no longer fires a stray maximize animation over the drag (#755).
- "Move Window Left" skipped through overlapping zones: in a layout where zones overlap each other, moving a window left jumped straight to the leftmost zone in one keypress, while moving right stepped one zone at a time. The zone picker broke ties between overlapping zones by their storage order, which only happened to match the expected zone when moving right. Ties now break by distance, so moving, focusing, and swapping a window all step to the nearest zone in every direction. Thanks @Nathorr for the report (#773, discussion #771).
Installation
Arch Linux (AUR):
yay -S plasmazones # or plasmazones-binArch Linux (manual):
sudo pacman -U plasmazones-3.2.0-*-x86_64.pkg.tar.zstKDE Neon / Debian-based:
sudo dpkg -i plasmazones_3.2.0-*_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 44
sudo dnf install plasmazones-3.2.0-*.fc44.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.2.0-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 (without flakes):
Build this tag's source against your host's pkgs (no release asset needed):
# configuration.nix
environment.systemPackages = [
(pkgs.callPackage
"${builtins.fetchTarball "https://github.com/fuddlesworth/PlasmaZones/archive/v3.2.0.tar.gz"}/packaging/nix/package.nix"
{ version = "3.2.0"; })
];Post-Installation
systemctl --user enable --now plasmazones.service
systemsettings kcm_plasmazones