github fuddlesworth/PlasmaZones v3.4.16
PlasmaZones v3.4.16

2 hours ago

PlasmaZones v3.4.16

Added

  • PlasmaZones decorates the mouse pointer: pointer packs are a new family of shader packs beside the ones for window animations, zone overlays and window decorations, and they draw around the cursor rather than around a window. A pack is given where the pointer is, how fast it is travelling, the trail of where it has just been, and the last button press and release, so it can taper a trail with age or expand a ring from a click. Thirteen packs ship with it. Phosphor Trail is one smooth stroke of light along the path you just took, a thin bright core inside a soft bloom, holding its width all the way back and going out by dimming. It is one colour at any moment and that colour drifts slowly through the brand gradient as the seconds pass, so you read the spectrum over time rather than as stripes. Comet is a single tapered tail with a bright head and a faint sparkle along it. Halo is a soft glow that brightens as you move and breathes slowly while you hold still. Click Ripple sends a ring out from every press and a thinner one from every release, in a different colour for each mouse button. Sparks sheds small particles from the trail, more of them the faster you move. WindTrail is a curved ribbon that appears once you move faster than a speed you set and shrinks back as you slow down, following a smoothed path so an unsteady hand still draws a clean line. It reimplements the WindTrail KWin effect by wesleyyach. Arc throws short jagged lightning between points you have just passed through, crackling while you move quickly and going quiet as you slow. Orbit puts a few small dots in a ring around the cursor, swinging wide as you pick up speed, trailing behind the cursor as it moves and settling back around it when you stop. It is the one pack that draws nothing along your path. Ink is a wet brush stroke with a clean edge that spreads a little into the paper, then dries and clears from the far end of the stroke first, and a click lands a blot. It is opaque and matte where the others are made of light. Afterglow keeps a faint image of wherever the pointer has just been, refreshed as it passes and dimming everywhere else a little each frame, and it holds that image on its own canvas from one frame to the next, so a long stroke fades along its whole length instead of being cut off behind the pointer. Four of the thirteen are led by the click rather than by movement, so they draw nothing at all until you press a button. Click Ripple sends its ring out. Burst throws a spray of bits that arc away under gravity and fall. Flash is a hard snap of light with spikes crossing it, gone in a fifth of a second. Brackets snaps four corner marks inward onto the point you clicked, the way a camera locks onto a subject. Every pack answers a click as well as movement, in whatever way suits it, and each click response has a setting whose lowest value turns it off if you want a trail and nothing else. Phosphor Trail, Comet, Sparks and WindTrail can also be given a speed to start at and a smoothing amount of their own, Ink a smoothing amount, and Comet and Sparks a reach that caps how far they may paint from the path. The cursor is another decorated surface, so it is configured where every other surface is: Settings → Appearance → Decorations → Surfaces → Pointer, with the same chain editor the window, OSD, popup and shell surfaces use. Packs stack in order, each with its own settings and a live preview of it running beside them. It follows from that the cursor needs no switch of its own, that a decoration set captures your pointer chain along with the rest of your decoration, and that Reset and Discard treat it like any other surface. The Shaders page lists the pointer packs beside the surface packs and filters between them. Your own packs go in ~/.local/share/plasmazones/pointer and are picked up without a restart. Nothing is drawn until you add a pack to the chain, and once a pack has finished fading after you stop moving it asks for no further frames. Each pack declares whether it draws under the cursor or over it, because drawing over it means taking the pointer off the hardware cursor plane for as long as the pack is drawing, which costs a composited frame for every pointer move. Only the click ring needs that, so the rest stay underneath and cost nothing extra. (#1083)
  • Decorations stop while a window is fullscreen: Stop while a window is fullscreen, under Settings → Appearance → Decorations → General, turns off every PlasmaZones decoration on a screen showing a fullscreen window, including the pointer packs and the ones drawn on the OSD and the popups. It is on by default, so a game or a video keeps the frame budget to itself without you having to clear your chains first. It is scoped to the screen, so a fullscreen window on one monitor leaves the decorations on your other monitors alone, and everything comes back the moment the window leaves fullscreen. (#1083)
  • Packages are rebuilt on their own when your distro updates KWin: the KWin effect only loads when it was compiled against the exact KWin version you are running, so every KWin update from your distro left PlasmaZones silently not loading until a rebuilt package arrived. A check every six hours now reads which KWin each package channel was built against, asks Arch, Debian unstable, Fedora and openSUSE Tumbleweed what they ship today, and republishes the current release with a new package revision as soon as any one of them has moved. Each distro updates on its own schedule, so the check watches them separately rather than waiting for all of them. Nix builds from source against your own system's KWin and never needed this. (#1086)
  • Shader sets for zone overlays: your zone overlay shader assignments can be saved as a named set and applied again later, the same way decoration sets and motion sets already work. The page is Appearance → Overlays → Library → Sets. A set holds the global default and every per-layout override in one JSON file you can keep and share, and it covers shader assignments only, matching what the other shader pages deal with. Applying a set merges, so anything it does not cover keeps what it has. Saving, renaming and deleting a set take effect immediately, matching decoration sets, and only applying one is a pending change that Discard undoes. A set from another computer still works even though layouts are identified per computer. The global default and any layout you also have are applied, and the rest are skipped with a count so you know what was left out. A set naming a shader pack you do not have installed is refused instead, because none of it could be applied. (#1006)

Changed

  • The three set pages are all called Sets: the Library pages under Animations, Decorations and Overlays were titled Motion Sets, Decoration Sets and Overlay Sets. Each now reads plain Sets, and the text on those pages says set rather than motion set, decoration set or overlay set. The section the page sits in already says which kind it is. Searching for motion set, decoration set or overlay set still finds the right page. (#1088)
  • The overlay shader rule picks a layout, like the animation rule picks an event: the Override overlay shader action now has a Layout field beside the shader. Leave it on Global default and the rule changes the shader for every layout on the matched screen, desktop or activity, which is what every existing rule already did. Rules from before the field existed are rewritten to the new shape with Layout set to Global default the first time PlasmaZones starts, so they keep doing exactly that. Pick a layout and the rule changes only that layout's shader, and only while it is the active one there. Rules for different layouts in the same place no longer replace one another, and a rule for a specific layout wins over a rule for the global default there. The shader list also gains None, so a rule can turn the overlay shader off for a place or a layout, the same way the Layouts page can. (#1006)
  • Exporting a layout no longer carries its overlay shader: which shader a layout draws is now kept with your settings rather than inside the layout file, so an exported layout file describes zones and layout settings and nothing about shaders. Import it on another computer and it draws whatever your global default is there. To move assignments between computers, save an overlay set under Appearance → Overlays → Library → Sets. A set carries the global default and every per-layout override together. (#1006)
  • Appearance → Overlays: a new section beside Decorations and Animations, laid out the way Decorations is. Appearance and Layouts lead, then a Library holding your saved sets and the shader pack browser. Appearance covers the overlay's colours, label font, opacity, border and zone numbers, and Layouts covers which shader each layout draws. Whether the overlay appears while you drag is still a Snapping setting, on the Overlay page there. (#1006)
  • Overlay shader assignment moved from the layout editor into the settings app: which shader a zone overlay draws is a display preference rather than part of a layout, so the editor's shader dialog is gone and assignments live on the Layouts page above. It has one card for the global default and one per layout, each with the shader picker and parameter editor the dialog had. Picking None on a layout's card is how you turn its shader off, in place of the dialog's enable checkbox. The card leaves out the image controls the dialog had, so a pack that declares an image parameter draws whatever that pack declares for it, or no image at all when it declares nothing. An image you had already picked in the old dialog is carried over and still drawn, you just cannot change it from the card. No bundled pack declares an image parameter, so none of this affects the shaders that ship with PlasmaZones. Your existing per-layout assignments are carried over the first time this version starts. An assignment made against an autotile algorithm rather than a layout is not carried over, because the overlay could never draw it in the first place. One thing this takes away: a layout file no longer records a shader, so a layout re-saved by this version and then opened by an earlier one comes back with nothing assigned. (#1006)
  • The bundled Luau runtime is updated from 0.730 to 0.737: tiling algorithms run on the Luau scripting engine that PlasmaZones builds in from a committed source tarball. The seven releases in between fix a handful of runtime bugs, among them the handling of upvalues in a repeat loop that uses continue, a rare case where an oversized jump was accepted rather than rejected, and unreachable close instructions left in statement blocks. They also make table.move faster in some cases, halve the cost of pcall and xpcall, and inline immediately invoked functions. No bundled algorithm is affected by any of the fixes, and none of the new embedder APIs are used, so this is a maintenance update rather than a feature. Packages built against a system Luau are unaffected. (#1090)
  • Animation timing is saved with the rest of your settings: how long each animation runs and which curve it follows were kept in loose files under ~/.local/share/plasmazones/profiles/, apart from everything else the Animations page writes, including which shader pack each event uses. A settings profile captures your configuration, so it captured the pack you chose for an event and lost the timing you chose beside it. Motion sets had the same split down the middle, and saving, renaming or deleting one behaved differently from the same action on a decoration set. Timing now lives in your configuration with everything else. Your existing per-event timings are read once and carried over the first time this version starts, and the old files are left where they are, so nothing is lost if you go back to an earlier version. A settings profile now carries a whole animation event, and a motion set writes both halves of one. Discard on the Animations page reverts exactly what it does everywhere else. Saving or deleting a motion set or a saved curve preset is immediate now, matching decoration sets, rather than something Discard could undo. One thing this takes away: those files were read as you edited them, so you could keep timings in a dotfile repository or change one by hand and see it apply. That no longer works. The files are read once during the upgrade and ignored after that, and the Animations page is the way to change timing. (#1084)

Fixed

  • The shader validator checks every animation pack for both places it can run: an animation pack can be drawn by the settings preview or by the KWin compositor, and the two compile it differently. The offline validator only compiled a pack for the one it thought the pack was for, so a pack could pass validation and still fail live. A geometry or desktop pack was never compiled the way the preview does, and the preview showed a flat grey card for it. An ordinary window pack was never compiled the way the compositor does. Every pack's fragment, and its vertex shader when it declares one, is now compiled for both. Its buffer passes are compiled for the preview, which is the only place they run. The validator uses the compositor's own include resolver for the compositor half, so a pack that includes a file the compositor cannot find fails here rather than on screen. It also catches several things that used to slip through to a live failure: a strip pack that defines its own main() or never samples the strip, a pack that declares more parameters than the shader can hold, a pack that defines its own main() without routing its output through the colour management the compositor applies, and a missing version line. A tree with the shared helpers beside it now resolves includes there and nowhere else, so a header missing from the repo can no longer be found in an installed copy. Validation needs the glslang compiler on the machine, and the validator says so once per pack family when it is missing. (#1089)
  • Glass and blur decorations on the OSD and popups fade out with them again: with a pack from the glass or blur family on an OSD or a popup, the card faded in and out but the decoration itself stayed on screen at full strength until the card was gone. Those packs render in several passes, and each of them was given a private drawing layer on the theory that their passes needed one. That layer is drawn by a helper item Qt puts beside the stage, and the fade animation hides and animates the stage while leaving the helper where it was. The passes never needed the layer, so it is gone, and every decoration now fades with the card it decorates. (#1087)
  • Animation previews that drift or spin no longer hold still: in the animation pack preview, packs that move a little every frame on their own clock, such as the vortex spin, the matrix and fire drift and the noise in the desktop switch packs, sat frozen except for the open or close sweep. The preview drove the sweep but never told the pack how much time had passed since the last frame or which frame it was on, and those packs add their motion up from exactly that. The preview now advances both every frame, the way the compositor does. (#1087)
  • Pressing the float shortcut a second time puts a tiled window back in the layout: in tiling mode the shortcut floated a window and then refused to take it back, so the window stayed floating however many times you pressed. The engine asked the layout state to flip the window's floating bit and read the answer as whether the flip had worked, but the answer was the bit's new value, so the press that turned floating back off read as a failure. The flip itself had already landed. Everything that follows it, re-tiling the screen and telling the rest of PlasmaZones the window came back, was skipped, which left the layout believing the window was tiled while the window stayed floating on screen. (#1076, #1085)

Installation

Arch Linux (AUR):

yay -S plasmazones  # or plasmazones-bin

Arch Linux (manual):

sudo pacman -U plasmazones-3.4.16-*-x86_64.pkg.tar.zst

Debian testing/unstable (apt repository):
Tracks KDE as it lands in Debian and rebuilds when KWin moves.

sudo curl -fsSL https://download.opensuse.org/repositories/home:fuddlesworth/Debian_Unstable/Release.key -o /etc/apt/keyrings/plasmazones.asc
echo 'deb [signed-by=/etc/apt/keyrings/plasmazones.asc] https://download.opensuse.org/repositories/home:/fuddlesworth/Debian_Unstable/ /' | sudo tee /etc/apt/sources.list.d/plasmazones.list
sudo apt update
sudo apt install plasmazones

On Debian testing, swap Debian_Unstable for Debian_Testing in both lines. Packages are built for x86_64 only.

Debian (manual .deb):
Built on Debian unstable. Prefer the apt repository above, which rebuilds when KWin moves.

sudo dpkg -i plasmazones_3.4.16-*_amd64.deb
sudo apt-get install -f  # Install dependencies if needed

Fedora (COPR):

sudo dnf copr enable fuddlesworth/PlasmaZones
sudo dnf install plasmazones

Fedora (manual RPM):

# Fedora 44
sudo dnf install plasmazones-3.4.16-*.fc44.x86_64.rpm

openSUSE Tumbleweed (OBS):

sudo zypper addrepo https://download.opensuse.org/repositories/home:fuddlesworth/openSUSE_Tumbleweed/home:fuddlesworth.repo
sudo zypper refresh
sudo zypper install plasmazones

Universal Linux (AppDir):
For Fedora Atomic, Steam Deck, or non-root user installation:

tar xzf plasmazones-3.4.16-linux-x86_64.tar.gz
cd plasmazones-linux-x86_64
./install.sh

NixOS (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.4.16.tar.gz"}/packaging/nix/package.nix"
    { version = "3.4.16"; })
];

Post-Installation

systemctl --user enable --now plasmazones.service
systemsettings kcm_plasmazones

Don't miss a new PlasmaZones release

NewReleases is sending notifications on new releases.