Window zone management for Wayland compositors
Define zones on your screen. Drag windows into them. Done.
- How It Works
- Features
- Installation
- Quick Start
- Keyboard Shortcuts
- Configuration
- Troubleshooting
- D-Bus API
- Project Structure
- Contributing
- Support
Hold Alt (or your configured modifier) while dragging a window. Zones light up. Drop the window into one and it resizes to fill that zone.
Snapping
- Drag with modifier key or mouse button to snap windows to zones
- Always-active mode: zones activate on every drag without a modifier
- Enable/disable snapping globally
- Snap all visible windows to zones at once
- Auto-assign windows to first empty zone per layout
- Snap to multiple zones at once
- App-to-zone rules: auto-snap apps to specific zones on launch
Movement
- Move windows between zones with keyboard shortcuts
- Swap windows between zones directionally
- Rotate windows clockwise/counterclockwise through zones
- Push window to first empty zone
- Restore original size on unsnap
- Per-window floating toggle
- Staggered animations with elastic and bounce easing curves
Focus & Cycling
- Focus adjacent zones without mouse
- Cycle through windows stacked in the same zone
- Visual canvas for drawing and resizing zones
- 26 built-in templates (columns, grids, fibonacci, master-stack, focus+stack, and more)
- Undo/redo, copy/paste, cut, duplicate
- Split zones horizontally or vertically
- Grid and edge snapping
- Fill available space / auto-expand
- Fullscreen editing mode
- Per-zone colors and styling
- Restrict layouts to specific screens, desktops, or activities
24 built-in JavaScript tiling algorithms including master+stack, dwindle, BSP, spiral, grid, monocle, and more. All algorithms run in a sandboxed engine and support hot-reload. You can create your own custom algorithms — see the full list and authoring guide on the Tiling Algorithms wiki page.
- Per-screen algorithm selection with independent settings
- Configurable master ratio and master count (separate settings for Centered Master vs Master+Stack)
- Inner and outer gaps with per-side control (top/bottom/left/right)
- Smart gaps — no gaps when only one window is tiled
- Max windows cap — overflow windows float automatically
- Hide title bars on tiled windows, with colored borders
- Window insertion position: end, after focused, or as master
- Focus follows mouse and focus new windows
- Minimized windows float, unminimized windows rejoin tiling
- Per-window floating toggle
- Staggered tiling animations
- Respect window minimum sizes (toggleable) — tiles expand to honor size hints reported by the application
Tip: Some apps enforce a minimum size that prevents tiles from reaching their intended geometry. To fix this, create a KWin Window Rule: System Settings → Window Management → Window Rules → add a rule matching the window class, set Minimum Size to Force
0×0under the Size & Position tab. This removes the constraint so PlasmaZones can tile the window at any size.
23 built-in GLSL shader effects for zone overlays, including audio-reactive visuals, distro-themed drifts, and procedural effects. Supports up to 4 custom image textures per shader plus desktop wallpaper sampling.
Custom shaders supported — see the full effect list and authoring guide in the Shader Guide on the wiki.
After snapping a window, an overlay shows the remaining empty zones with thumbnails of other windows. Click a thumbnail to snap it into a zone.
Drag to screen edge to reveal a layout picker. Jump straight to any layout and zone.
Press Meta+Alt+Space to open a fullscreen layout picker. Click any layout to switch.
See a preview of the layout when switching, not just text.
Move, focus, swap, rotate, and push actions show a brief overlay with the affected zone numbers.
- Per-monitor layouts (same or different)
- Per-virtual-desktop layouts
- Per-activity layouts (optional, requires PlasmaActivities)
- Per-monitor zone selector settings
- Per-screen shader selection
- Screen-targeted app-to-zone rules
Standalone settings app (plasmazones-settings) with sidebar navigation:
- Overview — Per-screen mode (snapping/tiling) with live context display
- Layouts — Create, duplicate, import/export zone layouts with 26 templates
- Snapping — Activation, zone appearance (colors, opacity, borders, blur, shaders), animations, zone selector, per-monitor/desktop/activity assignments
- Tiling — Per-screen algorithm selection, master ratio/count, gaps, title bar hiding, insertion order, focus behavior, per-monitor/desktop/activity assignments
- App Rules — Per-app zone assignment rules with interactive window picker
- Exclusions — Window class exclusion lists with interactive picker, minimum size thresholds
- Editor — Layout editor preferences and shortcut configuration
- General — OSD style, layout switch notifications, global behavior
- About — Version info, update checker, daemon status
On KDE Plasma, a System Settings entry provides version info and a launcher to the settings app.
- Any Wayland compositor with layer-shell support
- Qt 6.6+
- qt6-wayland / Wayland::Client
- CMake 3.16+
- C++20 compiler
- wayland-scanner (build-time only)
Optional (for full KDE integration):
- KDE Frameworks 6.6+ (KWin effect, System Settings, KGlobalAccel shortcuts)
- PlasmaActivities (activity-based layouts)
# Binary package (prebuilt)
yay -S plasmazones-bin
# Source package (builds locally)
yay -S plasmazonessudo dnf copr enable fuddlesworth/PlasmaZones
sudo dnf install plasmazonesCommunity-maintained package by ilFrance:
sudo zypper addrepo https://download.opensuse.org/repositories/home:ilFrance/openSUSE_Tumbleweed/home:ilFrance.repo
sudo zypper refresh
sudo zypper install plasmazonesNote: Do not use the Fedora RPM on openSUSE — it has incompatible Qt private API dependencies.
nix profile install github:fuddlesworth/PlasmaZonesOr add to your flake inputs. A flake.nix is included in the repository.
git clone https://github.com/fuddlesworth/PlasmaZones.git
cd PlasmaZones
cmake -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr
cmake --build build -j$(nproc)
sudo cmake --install buildPortable build (no KDE dependencies):
cmake -B build -DUSE_KDE_FRAMEWORKS=OFF \
-DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr
cmake --build build -j$(nproc)
sudo cmake --install buildThis builds only the daemon and editor — no KWin effect or KCM. See Compositor Integration for shortcut and config setup on non-KDE compositors.
After installation, enable the daemon:
systemctl --user enable --now plasmazones.serviceOn KDE Plasma, also refresh the service cache for KCM:
kbuildsycoca6 --noincrementalOpen the settings app:
plasmazones-settingsOn KDE Plasma, PlasmaZones also appears in System Settings → Window Management → PlasmaZones with a launcher to the settings app.
Local install (no root)
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$HOME/.local
cmake --build . -j$(nproc)
cmake --install .Add these to your ~/.bashrc or ~/.zshrc:
export QT_PLUGIN_PATH=$HOME/.local/lib/qt6/plugins:$QT_PLUGIN_PATH
export QML2_IMPORT_PATH=$HOME/.local/lib/qt6/qml:$QML2_IMPORT_PATH
export XDG_DATA_DIRS=$HOME/.local/share:$XDG_DATA_DIRSThen reload your shell and refresh the cache:
source ~/.bashrc # or ~/.zshrc
kbuildsycoca6 --noincremental
systemctl --user enable --now plasmazones.serviceRPM-based distros (Fedora/openSUSE)
An RPM spec is included in packaging/rpm/plasmazones.spec for building packages on Fedora, openSUSE, and other RPM-based distributions.
Universal Linux / Fedora Atomic (Portable Tarball)
For distributions where installing system packages is difficult (Fedora Atomic/Silverblue) or if you lack root privileges:
- Download
plasmazones-linux-x86_64.tar.gzfrom the Latest Release. - Extract the archive.
- Run the installer script:
tar xzf plasmazones-linux-x86_64.tar.gz
cd plasmazones-linux-x86_64
./install.shThe script installs PlasmaZones to ~/.local and sets up your environment variables.
Or use the one-liner:
bash <(curl -s https://raw.githubusercontent.com/fuddlesworth/PlasmaZones/main/packaging/local-install/web-install.sh)Upgrading:
Run the installer again with a newer tarball. It will detect the existing installation and upgrade in place.
Uninstalling:
~/.local/share/plasmazones/uninstall.sh- Enable the daemon:
systemctl --user enable --now plasmazones.service - Open settings:
plasmazones-settings(or System Settings → PlasmaZones on KDE) - Click Open Editor to create a layout
- Draw zones or pick a template
- Save with Ctrl+S
- Drag any window while holding Alt — zones appear, drop to snap
Tip: The settings app works on any compositor. On KDE, it also appears in System Settings.
All configurable in System Settings → Shortcuts → PlasmaZones (KDE) or in the PlasmaZones settings app.
Layout switching
| Action | Default Shortcut |
|---|---|
| Previous layout | Meta+Alt+[ |
| Next layout | Meta+Alt+] |
| Quick layout 1–9 | Meta+Alt+1 through Meta+Alt+9 |
| Open layout picker | Meta+Alt+Space |
| Resnap windows to new layout | Meta+Ctrl+Z |
Window movement & snapping
| Action | Default Shortcut |
|---|---|
| Snap to zone 1–9 | Meta+Ctrl+1 through Meta+Ctrl+9 |
| Move window left/right/up/down | Meta+Alt+Shift+Arrow |
| Swap window left/right/up/down | Meta+Ctrl+Alt+Arrow |
| Push to empty zone | Meta+Alt+Return |
| Snap all windows to zones | Meta+Ctrl+S |
| Restore window size | Meta+Alt+Escape |
| Toggle float | Meta+F |
Focus & cycling
| Action | Default Shortcut |
|---|---|
| Focus zone left/right/up/down | Alt+Shift+Arrow |
| Cycle window forward | Meta+Alt+. |
| Cycle window backward | Meta+Alt+, |
| Rotate windows clockwise | Meta+Ctrl+] |
| Rotate windows counterclockwise | Meta+Ctrl+[ |
Autotiling
| Action | Default Shortcut |
|---|---|
| Toggle autotile | Meta+Shift+T |
| Toggle float | Meta+F |
| Focus master window | Meta+Shift+M |
| Swap with master | Meta+Shift+Return |
| Increase master ratio | Meta+Shift+L |
| Decrease master ratio | Meta+Shift+H |
| Increase master count | Meta+Shift+] |
| Decrease master count | Meta+Shift+[ |
| Retile windows | Meta+Shift+R |
Other
| Action | Default Shortcut |
|---|---|
| Open editor | Meta+Shift+E |
| Open settings | Meta+Shift+P |
| Toggle layout lock | Meta+Ctrl+L |
Shortcut pattern (avoids conflicts with KDE defaults):
Meta+Alt+{key}— Layout operations and actionsMeta+Alt+Shift+Arrow— Zone movement (avoids KDE'sMeta+Shift+Arrowscreen movement)Meta+Ctrl+Alt+Arrow— Swap windows (avoids KDE'sMeta+Ctrl+Arrowdesktop switching)Alt+Shift+Arrow— Focus navigation (avoids KDE'sMeta+Arrowquick tile)
| Action | Shortcut |
|---|---|
| Save | Ctrl+S |
| Undo / Redo | Ctrl+Z / Ctrl+Shift+Z |
| Select all | Ctrl+A |
| Copy / Cut / Paste | Ctrl+C / Ctrl+X / Ctrl+V |
| Paste with offset | Ctrl+Shift+V |
| Delete zone | Delete |
| Duplicate zone | Ctrl+D |
| Split horizontal | Ctrl+Shift+H |
| Split vertical | Ctrl+Alt+V |
| Fill available space | Ctrl+Shift+F |
| Toggle fullscreen | F11 |
| Move zone | Arrow keys |
| Resize zone | Shift+Arrow keys |
| Next / previous zone | Ctrl+Tab / Ctrl+Shift+Tab |
Open the settings app:
plasmazones-settings # opens on overview page
plasmazones-settings -p layouts # opens directly to layouts page
plasmazones-settings --page tiling-behavior # opens to tiling behavior pageThe app is single-instance — launching it again while running raises the existing window and switches to the requested page.
Settings stored in ~/.config/plasmazones/config.json. Layouts stored as JSON in ~/.local/share/plasmazones/layouts/.
Refresh the KDE service cache after installing from source:
kbuildsycoca6 --noincrementalOr log out and back in. The standalone settings app is always available:
plasmazones-settings# Check status
systemctl --user status plasmazones.service
# View logs
journalctl --user -u plasmazones.service -f
# Restart
systemctl --user restart plasmazones.service- Ensure daemon is running:
systemctl --user status plasmazones.service - Check drag modifier in settings (default: Alt)
- Verify you have at least one layout with zones
- Check if the application is excluded in settings
PlasmaZones exposes 10 D-Bus interfaces on org.plasmazones for scripting and integration — Autotile, Control, LayoutManager, Overlay, Screen, Settings, Shader, and more.
# Quick examples
qdbus6 org.plasmazones /PlasmaZones org.plasmazones.LayoutManager.getLayoutList
qdbus6 org.plasmazones /PlasmaZones org.plasmazones.Overlay.showOverlayFull API reference, scripting examples, and per-interface documentation: D-Bus API on the wiki.
See the full directory tree and data locations on the Project Structure wiki page.
See CONTRIBUTING.md for guidelines on code style, license headers, testing, and translations.
If PlasmaZones is useful to you, consider supporting development:
Bug reports and feature requests: GitHub Issues
GPL-3.0-or-later
Inspired by FancyZones from PowerToys.
Works on KDE Plasma, Hyprland, Sway, GNOME, and any Wayland compositor with layer-shell support.










