Repository navigation
Halley v0.9.0 — A Steadier Experience
Halley 0.9 brings a steadier everyday desktop: fullscreen applications stay on the right monitor, XWayland games recover cleanly from mode changes, input methods survive locking, and pinned windows stay open. It also adds fractional display scaling, more expressive window rules, separate screenshot and screencast privacy, and new ways to capture and move windows.
The Field remains yours to arrange. Existing configurations are not rewritten, and new actions are available when you choose to bind them.
Highlights
Fullscreen that follows your work
Alt+Tab, Apogee, and centered navigation preserve fullscreen on other monitors. On the same monitor, ordinary applications leave fullscreen when you select another window; identified games park until you return. Previewing or cancelling navigation leaves fullscreen intact.
XWayland fullscreen, game-menu mode changes, minimize, and restore now keep client state, geometry, and animations together. Fullscreen transitions follow the client's accepted frame, keep outgoing content live while waiting, and return decorations smoothly. Moving between fullscreen and maximize no longer starts competing animations. Resizing GTK windows also retains the size you chose.
Control what you share
Portal screencast rules can exclude individual windows and layer surfaces. Monitor shares show the content behind excluded windows, including blurred ones. Directly shared windows have a local indicator, and the source selector supports keyboard navigation.
Built-in screenshots have a separate block-screenshot rule. Protected windows and their popups are omitted from screen and region screenshots; direct screenshots of those windows fail. These controls apply to their documented capture paths, not third-party direct capture protocols.
The CLI and SDK can capture an explicit output, node, or region without opening the selection overlay. Authorized capture tools can also use ext-image-capture-source-v1 and ext-image-copy-capture-v1 for output capture. The initial implementation supports native-size XRGB8888 SHM buffers and optional embedded cursors; capture stops on lock, suspend, or output loss.
Make each display and window fit
Set view.output.scale independently for each monitor, including fractional values, and reload it live. Applications, compositor UI, pointer coordinates, and native-resolution screenshots follow the same scale. The pointer and dragged windows can cross gaps in the monitor layout.
Window rules gain composable matches and exclusions, parent and transient conditions, startup, focus and screencast conditions, initial output and position, fullscreen and maximized states, and border, shadow and corner controls. Existing rules remain first-match; opt into window-rule-mode compose to combine matching rules. Gaussian and box blur join the default Dual Kawase method.
Move with precision
Keyboard and CLI moves animate using independent animations.window-move easing or spring settings. Use halleyctl node move to X Y for an exact position or --distance UNITS for a chosen directional distance.
The optional pan-field-always action starts a camera drag over windows, titlebars, nodes, or wallpaper. It respects fullscreen and other camera owners, shell overlays, and client pointer constraints. Pans end with the button that started them, so any pointer button can be used. Contributed by @Ketari-G in #187.
More in this release
- Native Wayland input methods stay connected across lock and resume after unlock. Keyboard grabs and composition are suspended during locking, lock-screen input stays isolated, and unfinished composition is discarded.
- Pinned windows no longer collapse through automatic decay. Manual collapse remains available; unpinning starts a fresh decay timer.
- Empty clusters retain their close-binding hints across monitor focus changes, with two-press deletion scoped to the selected monitor.
- Keys held on multiple keyboards remain pressed until the last device releases them. Lock modifiers follow Wayland event order, and Caps, Num and Scroll Lock indicators stay synchronized across devices and session recovery.
xdg-dialog-v1andxdg-foreign-v2keep modal and portal dialogs with their parents. Closing a focused dialog returns focus to its nearest eligible parent.- API and Lift window retrieval selects the right monitor and workspace, reveals stack or overflow members, restores collapsed windows, and centers Field targets.
fifo-v1andcommit-timing-v1add client frame-pacing support without blocking input or unrelated clients.- Approved tools can control individual native outputs through
wlr-output-power-management-unstable-v1. The nativeorg.freedesktop.ScreenSaverservice supports GTK's idle-inhibition fallback. - Initial compositor accessibility is exposed through AccessKit, with optional supervision of a trusted Orca executable.
- A pinned Nix flake supplies the compositor, companion tools, portal integration, development shell, overlay and NixOS session module. @pirate-boop fixed the accessibility supervisor test's executable path for Nix builds in #251.
- GPU frame waits and capture synchronization no longer block the native event loop. Output recovery, session shutdown, autostart logging, cursor-theme propagation and XWayland disconnect cleanup are more reliable.
- Scene assembly, capture, fullscreen, input, configuration reload and session startup now have clearer ownership. Rust, Nix and headless XWayland checks run for pull requests.
Upgrading
Build the compositor, halleyctl, and portal together: private IPC is now 28, while the public API remains 1. Install the updated portal alongside the compositor. Lift remains independently released; use Lift 0.4.1 with Halley 0.9 for compatible live subscriptions.
Existing configuration files are preserved. Omitted settings use built-in defaults. Add optional actions such as pan-field-always or distance-specific movement bindings if you want them, then verify and reload:
halleyctl config verify
halleyctl reloadFor a source build:
git clone https://github.com/saltnpepper97/halley
cd halley
git checkout v0.9.0
cargo build --locked --release --workspaceArch users can install halley and xdg-desktop-portal-halley, or the halley-full bundle. The halley-git package follows main.
Package versions
| Package | Version |
|---|---|
| Halley compositor | 0.9.0 |
halley-cli / halleyctl |
0.9.0 |
halley-config |
0.9.0 |
halley-core |
0.8.0 |
halley-ipc |
0.8.0 |
halley-api |
0.5.0 |
halley-portal |
0.3.0 |
See the complete changelog and configuration example for details.
Thank you
Thank you to @Ketari-G for pan-field-always, and @pirate-boop for the Nix build fix. Thank you as well to everyone testing Halley in daily use and reporting the issues that shaped this release.