- Rust 90.5%
- Python 9.3%
- Makefile 0.2%
The frame decoration texture cache was its only consumer, where it gated a removal-only prune walk. That prune now retains entries by frame/output rect overlap, which subsumes the removal check (a removed frame's rect is gone) and also catches cross-output moves the epoch could never signal -- so the counter has no remaining purpose. - Drops the LayoutManager field, its bump in frame_slot_remove, and its tests. |
||
|---|---|---|
| .cargo | ||
| _misc | ||
| config | ||
| doc | ||
| scripts | ||
| share/ionwl | ||
| src | ||
| tests | ||
| .gitignore | ||
| Cargo.toml | ||
| LICENSE | ||
| Makefile | ||
| pyproject.toml | ||
| readme.rst | ||
IonWL
A Wayland compositor inspired by Ion3, built on Smithay.
Why IonWL?
Most tiling compositors on Wayland use automatic layouts that rearrange windows when you open or close them. Ion3 took a different approach: you manually split the screen into frames, and windows open inside those frames as tabs. This gives you full control over your layout - it stays exactly how you set it up.
At the time of writing, nothing on Wayland offers this model. IonWL brings it to Wayland with a Python scripting API for configuration and key-bindings.
Features
- Manual tiling: Split the screen into frames and manage windows as tabs. Layouts stay fixed - opening or closing windows doesn't rearrange anything.
- Floating windows: Full floating layer with z-ordering.
- Scratch workspaces: Workspaces can float as overlays, acting as toggle-able scratch-pads.
- Shared desktops: All outputs belong to one desktop. Switching desktops switches all outputs at once.
- Python API: Key-bindings and configuration written in Python, with direct access to windows, frames, workspaces, and outputs. The Python API may also be invoked from external commands to run custom scripts.
- Flexible key-bindings: Separate bindings for press, release, and click for both mouse and keyboard. Modifier keys can be bound as tap actions. Key-bindings can optionally consume events and/or pass them through to the client.
- IPC: Unix socket interface with
ionwl-cmdfor scripting and external tools.
Support For
- XWayland: Optional X11 application support with clipboard sync.
- Multi-GPU: Automatic GPU detection.
- VRR: Variable refresh rate for supported displays.
- Direct scanout: Zero-copy rendering for full-screen applications.
Limitations
- Output scale is global (no support for mixed output scaling).
In Development
These areas are likely to change.
- Python defined operator callbacks.
Requirements
- Rust 1.87+.
- Python 3.
- libseat, libinput, udev, freetype.
- GPU with DRM/KMS support.
- Sphinx (for building Python API docs).
Building
cargo build --releaseTo disable XWayland support:
cargo build --release --no-default-featuresInstallation
- Arch Linux
-
Install ionwl-git from the AUR.
- From Source
-
Build and install with
make:make make install PREFIX=/opt/ionwl mkdir -p ~/.config/ionwl cp config/ion_init.py ~/.config/ionwl/
Type Checking
Validate your configuration with mypy using the installed stubs:
MYPYPATH=/opt/ionwl/share/ionwl/python mypy --strict ~/.config/ionwl/ion_init.pyRunning
# From a TTY (not inside another compositor).
./target/release/ionwlAttribution
- Tuomo Valkonen Original author of the Ion3 (window-manager)
- Pinnacle (protocol implementations, backend initialization, cursor management, input handling, XWayland integration).
- Niri (window creation logic, DMABUF allocation, foreign toplevel protocol).
- Cosmic (layer shell deferred mapping, window mapping gate, interactive resize, output management).
- Note
-
This was written with the assistance of an LLM, in some cases using existing open-source code as a reference, full credit goes to those projects on which this is based.
License
GPL 3 or later, See LICENSE file for details.