v25.11 #2917
Replies: 15 comments 6 replies
-
|
I'm trying to unwrap this 😭 |
Beta Was this translation helpful? Give feedback.
-
|
Genuinely INSANE work on this. Thank you so much. |
Beta Was this translation helpful? Give feedback.
-
|
Kudos for everyone! Impressive work 💙 |
Beta Was this translation helpful? Give feedback.
-
|
Damn, so many new and useful features man. Insane work guys, great work guys, really great work ❤️ |
Beta Was this translation helpful? Give feedback.
-
|
Nice |
Beta Was this translation helpful? Give feedback.
-
|
Congrats everyone & thanks YaLTeR! |
Beta Was this translation helpful? Give feedback.
-
|
Awesome job. Niri has quickly become my favorite compositor. I especially like that I can play games like Planetside2 without experiencing all the input bugs that I get in hyprland (like the mouse clicks being registered at a previous location of the mouse cursor), and which are persisting for almost a year now. And don't worry about clueless people looking at the CF snafu and commenting "but I thought Rust claimed to have solved these problems??!?" |
Beta Was this translation helpful? Give feedback.
-
|
even more than the great new features, what is impressive is the amount of thought put into each, and how performance is always at the core. that's why Niri still feels so smooth and fast compared to other options. |
Beta Was this translation helpful? Give feedback.
-
|
Incredible! Reading the release notes was pure joy. Super happy about every new feature. This is what great software engineering looks like! |
Beta Was this translation helpful? Give feedback.
-
|
Never imagined archlinux being too slow to release new packages, until yesterday. Really excited to see these changes. Thank you YaLTeR! |
Beta Was this translation helpful? Give feedback.
-
|
A massive thank you to @YaLTeR and everyone else contributing for putting so much thought into everything! |
Beta Was this translation helpful? Give feedback.
-
|
As someone with a second vertical monitor that eventually had to switch to hyprland, per monitor layouts has pulled me back baby! |
Beta Was this translation helpful? Give feedback.
-
|
Wow, it looks really amazing. I love Niri, and it makes me happy to know that it's growing by great strides |
Beta Was this translation helpful? Give feedback.
-
|
This breaks my works flow! |
Beta Was this translation helpful? Give feedback.
-
|
Hello Sir, I think it would be better if Alt+Tab only cycled through applications in the current workspace, and simply highlighted the selected app so we can easily see what we're switching to. Please avoid the “Windows-like” style, a simple highlight would look more minimalistic and fit better with Niri’s design. |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Two weeks ago, Cloudflare had a major outage that took down a good half of the internet. Their postmortem included a snippet of Rust code with an
unwrap(), causing much internet discourse. Now it is my turn to release Rust software with a healthy dose ofunwrap()s,assert!s, and checked arithmetic enabled in release builds.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 supports libdisplay-info 0.3. Most niri packages updated this dependency back in September using a patch—this patch is no longer necessary.
Alt-Tab
After multiple major iterations and a lot of work by @rustn00b, we have an Alt-Tab recent windows switcher!
niri-alt-tab.mp4
It's got live window previews, window titles that fade if they're too long, and supports windows blocked out from screencasts—they will draw as black rectangles with their titles hidden. Just like in GNOME, there's a small delay to drawing the interface, so that quickly hitting Alt-Tab will switch to the previous window with no visual disturbance.
There are some interesting design differences compared to Alt-Tab in other desktops. On niri, I expect it's common to have multiple terminals open, so Alt-Tab must go by windows (not by apps), and the previews must be big enough for you to be able to pick the right window. So, instead of a panel showing all windows at once, we have a scrolling layout with a few large previews.
Then, since niri is primarily tiling, you might frequently focus intermediate windows while navigating the workspace. Think pressing Super→ a few times to reach some window towards the end, or moving the mouse across the screen with
focus-follows-mouse. These intermediate windows shouldn't "pollute" the Alt-Tab list, so we have a small debounce delay before a focused window is marked as recent.Workspaces in niri can get long (especially if you forget how many terminals you open), so our Alt-Tab can scope windows by current workspace or by current output by pressing W or O.
The default binds are AltTab / ModTab to switch across all windows, and Alt` / Mod` to switch between windows of the current application. Note that if you bound something else to those keys, your existing binds will take precedence.
The recent windows configuration wiki page explains how to change these key bindings, as well as everything else: open delay, debounce, window preview size, and so on.
Finally, the niri IPC now exposes the window
focus_timestampand an event stream event, so you can use the recent windows list in your own desktop components and scripts.Un/fullscreen animations
The transitions for windows going to and from fullscreen are now fully animated. No more windows jumping and growing to fullscreen size in a single frame.
The black backdrop fades in and out and grows if needed, and
clip-to-geometryrounded corners smoothly transition between square and circular during this animation.fullscreen.anim.on.alacritty.mp4
fullscreen.anim.on.dialog.mp4
Even if you run with animations disabled, you will see an improvement: windows will no longer jump up and down when un/fullscreening.
fullscreen.anim.off.mp4
True maximize
One of the bigger changes in this release that required several weeks of work: niri now supports the true Wayland maximize. This is the normal "maximize button next to the X button" or "double-click on the titlebar" maximize.
niri-maximize.mp4
We historically didn't implement true Wayland maximize because it's very similar to, yet slightly different from, our full-width columns (the
maximize-columnbind). These preserve gaps, borders and struts, and can contain multiple windows. The true Wayland maximize, on the other hand, makes a single window occupy the entire working area, with no gaps or struts.After plenty of requests, and thinking about it, I reconsidered. Double-click-to-maximize and the maximize button are things that users (especially new users) expect to work; additionally, plenty of people had asked for variations of "maximize without borders and gaps".
Ironically, after implementing true maximize, it has by far become my favorite window sizing mode. I keep windows true-maximized all the time: the browser, code editor, terminal ssh'd into a remote server.
Since the
maximize-columnandopen-maximizednames are taken by full-width columns, the true-maximize action is calledmaximize-window-to-edges. This name reflects what it does—maximize to the entire working area, right up to the screen edges or exclusive layer-shell surfaces.Similarly to fullscreen, true maximize always puts the window into the scrolling layout (since otherwise it would easily obscure all windows below). Naturally, you can still scroll left and right from a maximized window.
You can read more about fullscreen and maximize on the new wiki page.
Drag windows horizontally to scroll
On a trackpad, you can swipe left and right with three fingers to scroll the view. With a mouse, however, you have to either do a SuperMMB drag, which requires reaching for the keyboard, or switch windows via the Overview hot corner, which causes a lot of movement on screen.
To make scrolling the view mouse-only less annoying, I added a new behavior directly inspired by PaperWM: dragging tiled windows by their titlebar horizontally will scroll the view instead of moving the window. To move the window, you can still drag vertically (or with Super, or in the Overview).
niri-horizontal-scroll-mouse.mp4
This also works on touchscreens, finally adding an easy way to scroll the view by touch. I opted to make the touchscreen gesture work even when holding Super, since with touch there's no concern of quickly moving windows across monitors, like you sometimes need to do with a mouse.
niri-horizontal-scroll-touch.mp4
As a bonus, tapping with a second finger while moving a window now switches it between floating and tiling, just like pressing the right mouse button does.
Per-output and per-workspace layout config
You can now put
layout {}sections insideoutput {}andworkspace "name" {}to override layout settings for specific outputs and named workspaces.While simple on the surface, this feature required a complete overhaul of niri's config loading and parsing to support merging settings from multiple definitions of the
layout {}section. As it happens, this was an important prerequisite for...Config includes
You can now include other files in your niri config.
Included files have the same structure as the main config file. Settings from included files are merged with the settings from the main config. Includes are positional: they will override options set prior to them in the file.
Includes are useful for splitting your config into manageable chunks, and they make it easy for third-party tools to robustly inject niri configuration. For example, my top-level niri config currently looks like this:
See the config includes wiki page for more details, for instance how different config sections are merged together.
DisplayLink support
Thanks to @cmeissl and @scottmckendry, niri now supports monitors connected through DisplayLink docks. This is especially important for Asahi Macs, which currently don't support any other way of connecting external displays.
Reduced screen blanking
In this release, I finally adapted the logic from cosmic-comp to avoid screen blanking when possible. If your login manager / TTY resolution and refresh rate match the ones in niri, your screen should switch to niri without flickering to black. This works both when starting niri and when switching the TTY back to a running niri session.
niri-flickerfree-login.mp4
niri-flickerfree-tty.mp4
Even if the screen does blank on your setup (common for high refresh rate monitors where the TTY tends to use a 60 Hz mode, since that's usually the monitor-preferred one), niri should start up faster, as it will do just one modeset instead of two.
Custom output modes
@ToxicMushroom, building upon the initial work of @cmeissl, implemented custom modes and modelines in niri. When configuring an output mode, you can set
custom=trueto force the use of a given mode, even if it's not advertised by the monitor. Alternatively, you can provide a full custom modeline.Custom modes can be useful when the monitor's EDID doesn't advertise the right mode for some reason. For example, some monitors can use a lower refresh rate than any of the advertised modes, which can be useful for reduced power consumption.
Keep in mind that custom modes are not guaranteed to work. Niri is asking the monitor to run in a mode that is not supported by the manufacturer. Trying a non-working mode will generally turn the monitor blank.
Caution
Custom modes may damage your monitor, especially if it's a CRT. Follow the maximum supported limits in your monitor's instructions.
Screen reader enhancements
Thanks to an issue report, I found out that niri wasn't entirely correctly signalling keyboard modifiers to screen readers. This has been fixed, so combos like Orca + Ctrl + Space and Orca + Shift + A now work on niri.
The new Alt-Tab switcher should also be a nice addition here; from what I understand, it's a common navigation method for screen reader users. I made it speak the selected window title, which, if I'm not mistaken, is the expected behavior. Watch with sound:
niri-alt-tab-orca.mp4
Other improvements in this release
niri --sessionin WSL.ignore-drm-devicedebug option that prevents niri from touching the given DRM device. This is useful for GPU passthrough when you need exclusive access to a certain device.calibration-matrixinput setting work for touchscreens.+10%,-10%,10%) to themove-floating-windowaction.--pathargument to thescreenshot,screenshot-windowandscreenshot-screenactions that sets the path where niri will write the screenshot.ScreenshotCapturedIPC event that fires whenever niri captures a screenshot, with the output file path.keep-max-bpc-unchangeddebug flag is now deprecated and does nothing.output { background-color "..."; }setting is now deprecated, use the newoutput { layout { background-color "..."; } }setting instead.hide-when-typingorhide-after-inactive-ms, it will still show up in the screenshot UI, letting you optionally include it in the screenshot.default-column-widthto a preset width when opening a window. This fixes the first ModR press (switch preset column width) "doing nothing" for certain windows, like foot in constrain-to-terminal-grid sizing mode.XF86ScreenSaverkey. Niri parses keys case-insensitively. Unfortunately, there's a collidingXF86_Screensaverkey (note the smalls) which is not the key that you generally want. Now, for this specific key, niri also checks for a case-sensitive match to disambiguate.background-color.set_exclusive_edge()request, and changed layer surface ordering to consider exclusive zone surfaces first.Funding
I work on niri in the spare time that I have from my university studies. If you like what I do, you can support my work on GitHub Sponsors. Big thanks to all current and past sponsors!
This discussion was created from the release v25.11.
Beta Was this translation helpful? Give feedback.
All reactions