# niri v0.1.9 - Product: niri (https://whatsnew.fyi/product/niri) - Vendor: niri - Date: 2024-09-14 - Version: v0.1.9 - Original notes: https://github.com/niri-wm/niri/releases/tag/v0.1.9 - Permalink: https://whatsnew.fyi/product/niri/releases/v0.1.9 - Labels: Platforms: Linux What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. --- - **added** — Implement event stream in IPC that lets you continuously listen to compositor events like workspace or window changes - **added** — Add unique IDs to IPC windows and workspaces with ability to address specific windows or workspaces by ID - **added** — Add niri msg windows command to list all windows with their IDs - **added** — Add --id argument to window commands to target a specific window - **added** — Add niri msg action focus-window --id action - **added** — Add niri msg keyboard-layouts command - **added** — Document programmatic access to the niri IPC socket - **added** — Set up online rustdoc for the niri-ipc crate - **added** — Implement preset-window-heights layout option and switch-preset-window-height bind - **changed** — Make all unit Action enum variants struct variants in JSON, a breaking change to ensure future backward compatibility - **changed** — Rework window height distribution so columns of two or more windows always try to match monitor height - **changed** — Make resizing one window resize all other windows in a column proportionally - **changed** — Change default bind for resetting window height to Mod+Ctrl+R - **changed** — Use libdisplay-info to display actual monitor names instead of generic identifiers - **fixed** — Fix windows in a column occasionally snapping to a smaller size when resizing - **security** — niri now requires libdisplay-info Niri is a scrollable-tiling Wayland compositor. Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize. Here are the improvements from the last release. > [!NOTE] > Packagers: niri now requires libdisplay-info. ##### New IPC functionality In this release, I designed and implemented an [event stream](https://github.com/YaLTeR/niri/wiki/IPC#event-stream) in niri's IPC which lets you continuously listen to compositor events like workspace or window changes. The event stream enables taskbar applications to make correct and efficient widgets for niri. I implemented the [niri modules](https://github.com/Alexays/Waybar/wiki/Module:-Niri) for workspaces, focused window, and keyboard layout in Waybar, available in its fresh [0.11.0 release](https://github.com/Alexays/Waybar/releases/tag/0.11.0). Pull requests are open for [yambar](https://codeberg.org/dnkl/yambar/pulls/405) and [ironbar](https://github.com/JakeStanger/ironbar/pull/726) thanks to their contributors. https://github.com/user-attachments/assets/6fe9fc99-9246-45e3-a3b2-48ec79282cdd IPC windows and workspaces now have unique IDs, and all individual window and workspace actions can address a specific window or workspace by its ID. On the command line, a new `niri msg windows` command lists all windows with their IDs, and window commands accept an `--id ` argument to target a specific window, for example: ``` $ niri msg action fullscreen-window --id 2 ``` Also, there's a new `niri msg action focus-window --id ` action and a new `niri msg keyboard-layouts` command. I wrote some documentation on the [programmatic access](https://github.com/YaLTeR/niri/wiki/IPC#programmatic-access) to the niri IPC socket. I also set up an [online rustdoc](https://yalter.github.io/niri/niri_ipc/) for the niri-ipc crate where I documented every IPC type and request. Please refer there when working with the niri IPC. Unfortunately, while adding ID arguments to IPC actions, I discovered a backward incompatibility trap in serde-json. The default enum representation—externally tagged—prevents you from changing a unit variant to a struct variant, because the representation gains an extra dictionary. `"FullscreenWindow"` becomes `{"FullscreenWindow":{}}`, and the former does not parse with the new definition. I decided to make a JSON breaking change, converting all unit `Action` enum variants to struct variants (with or without fields). I doubt anyone used them directly through JSON since these actions could only address the focused window or column. All enum variants that already had fields are unchanged, and the `niri msg` CLI is also unaffected. With this breaking change out of the way, any further JSON additions should remain backward compatible, so that existing scripts and programs communicating with niri will keep working with new niri versions. ##### Height distribution changes One common complaint about niri's layout was the ability to make a multi-window column not "add up" to the total height of the monitor. The behavior was also fairly unobvious: with two windows in a column, you resize one, and the other resizes along as expected. Then, you resize the other, but the first window doesn't react. It felt like a bug. Last time there was a design problem (unwanted scrolling with focus-follows-mouse), we quickly found a solution by brainstorming in a Discussion. So, I made a big write-up about window heights in https://github.com/YaLTeR/niri/discussions/593. While there hasn't been much *discussion*, the act of laying out in writing all considerations and constraints had spawned a potential solution in my mind, which turned out to work quite well. In this release, I reworked the window height distribution to do the *expected thing* in more cases. A column of two or more windows will always try to match the monitor height, as long as the minimum window sizes allow _[Truncated at 4000 characters — full notes: https://github.com/niri-wm/niri/releases/tag/v0.1.9]_