v0.1.0-beta.1
niri-wm/niriv0.1.0-beta.1Jan 20, 2024by YaLTeR
AI Summary
This beta release introduces IPC capabilities, a hotkey help overlay, config error overlays, and exit confirmation dialogs. It also implements popup grabs and the security-context protocol for sandboxed clients.
Key Highlights
- IPC implementation with `niri msg outputs` command.
- Hotkey help overlay at startup.
- Config error and exit confirmation overlays.
- Wayland popup grabs for better popup handling.
- Security-context protocol for Flatpak security.
New Features
- IPC command interface.
- Hotkey help overlay.
- Config error overlay.
- Exit confirmation dialog.
- Popup grabs.
- Client-side decoration fixes (SDL2 workaround).
- Security-context protocol.
- Config file watching for live reload.
Full Release Notes
I've made a ton of improvements since the last alpha tag. I am now happy enough with the feature set to make the first proper release. So, this is a **beta** tag, and 0.1.0 should follow several days later.
> [!NOTE]
> Packagers: niri now depends on pangocairo.
### IPC, output list
I've implemented the beginnings of IPC, and a new `niri msg outputs` subcommand that will list all connected monitors and their available modes. Finally, you no longer need to dig in niri's debug output to find this information.
```
┌ ~
└─ niri msg outputs
Output "eDP-1" (Unknown - Unknown - eDP-1)
Current mode: 2560x1600 @ 165.004 Hz
Physical size: 340x210 mm
Available modes:
2560x1600@165.004
2560x1600@60.002
2560x1600@120.028
2560x1600@96.030
2560x1600@72.005
2560x1600@60.001
1920x1200@165.004
1920x1080@165.004
1600x1200@165.004
1680x1050@165.004
1280x1024@165.004
1440x900@165.004
1280x800@165.004
1280x720@165.004
1024x768@165.004
800x600@165.004
640x480@165.004
```
### Output settings improvements
All output settings (scale, position, mode, on/off) are now live-reloaded without having to replug the monitors.
Additionally, monitors are now always repositioned from scratch on every change, with preference given to monitors with explicitly-configured positions. Practically this means that your monitor positions will be consistent regardless of the order they are connected in (especially relevant at startup where the order is random).
### More libinput settings, live-reload
* Added touchpad `accel-profile`, `dwt`, `tap-button-map` settings.
* Added mouse `natural-scroll`, `accel-speed`, `accel-profile` settings.
* Added live-reload for all libinput settings.
This should cover most of the important libinput settings. These are relatively straightforward to add, so feel free to open a PR if you need some libinput setting that is still missing.
### Hotkey help overlay
I've added Pango for text rendering, which unlocks a ton of useful features. One of them is the new Important Hotkeys list that shows up at startup and helps you learn your way around niri.

The list of actions to show is hardcoded, but the actual hotkeys come from the current config, so you will see the keys that you had configured. The bind to display this overlay is `show-hotkey-overlay`.
### More overlays
I've added two more overlays using text rendering. One shows up when there's an error in your config:

And the second one prompts for a confirmation when pressing the exit bind:

### Wayland popup grabs
Niri now correctly implements popup grabs. Practically, this means that:
* You can now dismiss popups by clicking anywhere on screen, including layer-shell popups like the ones from sfwbar.
* You can now navigate the layer-shell popups with the keyboard.
* Popups with grabs will be dismissed when focusing a different window (or in the case of layer-shell, a different monitor), and unfocused windows will be denied popup grabs.
### Client-side decoration fixes
By default (without the `prefer-no-csd` setting), niri wants clients to use client-side decorations. Turns out that SDL2 has a bug (already fixed but not released) in its xdg-decoration protocol implementation that prevents windows from showing up when the compositor insists on CSD.
To make all apps work properly, niri will now hide the xdg-decoration protocol from the clients when it wants client-side decorations, and only show it when `prefer-no-csd` is set.

### Improved security
Niri now implements the security-context Wayland protocol which lets it hide a number of sensitive protocols from sandboxed clients. This protocol is used by Flatpak, so now Flatpak apps can no longer steal your clipboard through wlr-data-control, as an example.
```
┌ ~
└─ wl-copy 'My secret clipboard contents!'
┌ ~
└─ flatpak run --command=bash --filesystem=home org.gnome.Adwaita1.Demo
[📦 org.gnome.Adwaita1.Demo ~]$ wl-paste
Error: A required Wayland protocol (zwlr_data_control_manager_v1 version 1) is not supported by the compositor
[📦 org.gnome.Adwaita1.Demo ~]$
exit
┌ ~ 1
└─ wl-paste
My secret clipboard contents!
```
### More improvements in this release
* Added `move-column-to-workspace*` and `move-column-to-monitor*` binds that operate on columns, as opposed to the existing `move-window-to-*` binds. I believe this behavior makes more sense, so I changed the default binds to the new column ones.
* Added a `center-focused-column` layout setting that can be set to `never` (the default), `always` (always center the focused column) and `on-overflow`, which will center the focused column when it doesn't fit together with the previously focused column. Thanks @tversteeg for working on this feature.
* Layer-shell surfaces are now properly notified of output removal, which for example fixes mako breaking when disconnecting a monitor that it was displaying a notification on.
* Fixed mouse clicks on layer-shell surfaces activating the windows below them.
* Fixed screencast session restore picking the wrong monitor. This is especially relevant in Chromium where session restore is part of the normal screencast workflow.
* Fixed screencast taking a while to startup if there are no new frames rendered by the compositor.
* Laptop displays will now show up as "Built-in display" in the xdp-gnome monitor selection dialog.
* Fixed niri not redrawing the screen upon changing focus. Usually this isn't a problem because windows redraw in response to changing focus, but it became more visible with popup grabs.
* Niri will now watch the config file path even if the config did not exist, or failed to parse at startup. This is especially relevant for new niri users which don't have a config yet. You can create a config after running niri for the first time, and it will now live-load it without having to restart.
* Added a `niri panic` subcommand that triggers a panic, which you can use to check that you have built / packaged niri with enough debuginfo to produce useful crash backtraces.
* Documented the debug settings in the default config file.
* Fixed windows receiving events that look like they left all outputs when consuming them into a column.
* Fixed windows receiving events that look like they left all outputs when replugging monitors.
* Fixed a crash that could happen when a window is closed during a workspace switch transition.
* Fixed a crash that could happen if workspaces are transferred back to their original monitor that was connected during a workspace switch transition.
* Updated Smithay, the Wayland compositor building library that underlies niri, which brought some fixes:
* The cursor plane will now work in more cases. If you needed the `disable-cursor-plane` setting, you might no longer need it.
* Fixes to graphical glitches on nouveau and possibly other configurations.
* Fixes to a deadlock when using an IME with certain clients.
> [!CAUTION]
> This is an beta tag. There may be breaking changes leading to the release.
Please check the [README](https://github.com/YaLTeR/niri/blob/main/README.md) for building and installation instructions. Also, if you're on Fedora, I've got a [COPR](https://copr.fedorainfracloud.org/coprs/yalter/niri/). NixOS users, check out https://github.com/sodiboo/niri-flake.