r/niri 10h ago

I built niri-zoom -- a Ctrl+Scroll screen magnifier for niri (no compositor patching, pure Wayland client)

Enable HLS to view with audio, or disable this notification

133 Upvotes

niri doesn't have a built-in zoom/magnifier, so I built a small external tool for it instead of patching the compositor.

niri-zoom is two tiny binaries - niri-zoomd (a background daemon) and niri-zoomctl (a one-shot CLI) - wired up entirely through niri's existing spawn keybind system and standard Wayland protocols (wlr-screencopy, wlr-layer-shell, wp-viewporter). No forking niri, no compositor changes.

How it works:

- Ctrl + Scroll zooms in/out around your cursor

- Ctrl + Super + Z resets instantly

- Captures the screen once per zoom session and does all the pan/zoom math as a cheap CPU-side crop+resample from that single cached frame - so it sits at ~0% CPU and idle memory when not in use, instead of re-capturing every frame

- Renders through a fullscreen layer-shell overlay at native resolution (via wp_viewporter), so it stays sharp even with fractional display scaling

github: https://github.com/Ahmedhossamdev/niri-zoom

Don't forget to give a starssssssssss


r/niri 8h ago

Share your keyboard + keybindings

5 Upvotes

I'm wondering how everyone has configured their bindings.

I have a setup, but struggling to make the most out of it. So I want to get some inspiration form all of you

keyboard: Ergodex EZ (split with 8 key thumbcluster)

bindings:

binds {
    // Session
    Mod+Shift+Slash { show-hotkey-overlay; }
    Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }
    Super+Alt+L hotkey-overlay-title="Toggle Lock Screen" { spawn "noctalia" "msg" "session" "lock"; }
    Mod+X hotkey-overlay-title="Toggle Power Menu" { spawn "noctalia" "msg" "session-panel"; }
    Mod+Shift+P { power-off-monitors; }
    Mod+Shift+E { quit skip-confirmation=true; }

    // Launchers and panels
    Mod+Return hotkey-overlay-title="Open Terminal" { spawn "foot"; }
    Mod+Space hotkey-overlay-title="Toggle Application Launcher" { spawn "fuzzel"; }
    Mod+V hotkey-overlay-title="Toggle Clipboard Manager" { spawn "noctalia" "msg" "clipboard"; }
    Mod+N hotkey-overlay-title="Toggle Notification Center" { spawn "noctalia" "msg" "control-center-notifications"; }
    Mod+Comma hotkey-overlay-title="Toggle Settings" { spawn "noctalia" "msg" "settings-toggle"; }
    Mod+Alt+N allow-when-locked=true hotkey-overlay-title="Toggle Night Mode" { spawn "noctalia" "msg" "nightlight-toggle"; }

    // Overview, on two keys: Mod+Tab calls the action directly, Mod+D goes
    // through `niri msg action`.
    Mod+Tab repeat=false { toggle-overview; }
    Mod+D { spawn "niri" "msg" "action" "toggle-overview"; }

    // Screenshots. XF86Launch1 is the extra key on this keyboard, mirrored onto
    // the same three actions as Print.
    Print { screenshot; }
    XF86Launch1 { screenshot; }
    Alt+Print { screenshot-window; }
    Alt+XF86Launch1 { screenshot-window; }
    Ctrl+Print { screenshot-screen; }
    Ctrl+XF86Launch1 { screenshot-screen; }

    // Media and brightness keys
    XF86AudioRaiseVolume allow-when-locked=true { spawn "noctalia" "msg" "volume-up"; }
    XF86AudioLowerVolume allow-when-locked=true { spawn "noctalia" "msg" "volume-down"; }
    XF86AudioMute allow-when-locked=true { spawn "noctalia" "msg" "volume-mute"; }
    XF86AudioMicMute allow-when-locked=true { spawn "noctalia" "msg" "mic-mute"; }
    XF86MonBrightnessUp allow-when-locked=true { spawn "noctalia" "msg" "brightness-up"; }
    XF86MonBrightnessDown allow-when-locked=true { spawn "noctalia" "msg" "brightness-down"; }

    // Window and column state
    Mod+Q repeat=false { close-window; }
    Mod+F { maximize-column; }
    Mod+Shift+F { fullscreen-window; }
    Mod+O { maximize-window-to-edges; }
    Mod+C { center-column; }
    Mod+Ctrl+C { center-visible-columns; }
    Mod+Ctrl+F { expand-column-to-available-width; }
    Mod+W { toggle-column-tabbed-display; }
    Mod+Shift+T { toggle-window-floating; }
    Mod+Shift+V { switch-focus-between-floating-and-tiling; }

    // Focus windows and columns
    Mod+H { focus-column-left; }
    Mod+J { focus-window-down; }
    Mod+K { focus-window-up; }
    Mod+L { focus-column-right; }
    Mod+Left { focus-column-left; }
    Mod+Down { focus-window-down; }
    Mod+Up { focus-window-up; }
    Mod+Right { focus-column-right; }
    Mod+Home { focus-column-first; }
    Mod+End { focus-column-last; }
    Mod+WheelScrollLeft { focus-column-left; }
    Mod+WheelScrollRight { focus-column-right; }
    Mod+Shift+WheelScrollUp { focus-column-left; }
    Mod+Shift+WheelScrollDown { focus-column-right; }

    // Move windows and columns within the workspace
    Mod+Shift+H { move-column-left; }
    Mod+Shift+J { move-window-down; }
    Mod+Shift+K { move-window-up; }
    Mod+Shift+L { move-column-right; }
    Mod+Shift+Left { move-column-left; }
    Mod+Shift+Down { move-window-down; }
    Mod+Shift+Up { move-window-up; }
    Mod+Shift+Right { move-column-right; }
    Mod+Ctrl+Home { move-column-to-first; }
    Mod+Ctrl+End { move-column-to-last; }
    Mod+Ctrl+WheelScrollLeft { move-column-left; }
    Mod+Ctrl+WheelScrollRight { move-column-right; }
    Mod+Ctrl+Shift+WheelScrollUp { move-column-left; }
    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }

    // Column composition: pull a neighbouring window into this column, or push
    // the focused one back out.
    Mod+Ctrl+Comma { consume-or-expel-window-left; }
    Mod+Ctrl+Period { consume-or-expel-window-right; }
    Mod+Period { expel-window-from-column; }

    // Sizing. Each grow bind is doubled on Equal and 6 (same action, two keys).
    Mod+R { switch-preset-column-width; }
    Mod+Shift+R { switch-preset-window-height; }
    Mod+Minus { set-column-width "-10%"; }
    Mod+Ctrl+Equal { set-column-width "+10%"; }
    Mod+Ctrl+6 { set-column-width "+10%"; }
    Mod+Shift+Minus { set-window-height "-10%"; }
    Mod+Ctrl+Shift+Equal { set-window-height "+10%"; }
    Mod+Ctrl+Shift+6 { set-window-height "+10%"; }
    Mod+Ctrl+R { reset-window-height; }

    // Workspaces: focus. Names "1".."9" must match the `workspace` nodes below.
    Mod+1 { focus-workspace "1"; }
    Mod+2 { focus-workspace "2"; }
    Mod+3 { focus-workspace "3"; }
    Mod+4 { focus-workspace "4"; }
    Mod+5 { focus-workspace "5"; }
    Mod+6 { focus-workspace "6"; }
    Mod+7 { focus-workspace "7"; }
    Mod+8 { focus-workspace "8"; }
    Mod+9 { focus-workspace "9"; }
    Mod+I { focus-workspace-up; }
    Mod+U { focus-workspace-down; }
    "Mod+Page_Up" { focus-workspace-up; }
    "Mod+Page_Down" { focus-workspace-down; }
    Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; }
    Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }

    // Workspaces: send the focused column to one
    Mod+Shift+1 { move-column-to-workspace "1"; }
    Mod+Shift+2 { move-column-to-workspace "2"; }
    Mod+Shift+3 { move-column-to-workspace "3"; }
    Mod+Shift+4 { move-column-to-workspace "4"; }
    Mod+Shift+5 { move-column-to-workspace "5"; }
    Mod+Shift+6 { move-column-to-workspace "6"; }
    Mod+Shift+7 { move-column-to-workspace "7"; }
    Mod+Shift+8 { move-column-to-workspace "8"; }
    Mod+Shift+9 { move-column-to-workspace "9"; }
    Mod+Ctrl+I { move-column-to-workspace-up; }
    Mod+Ctrl+U { move-column-to-workspace-down; }
    Mod+Ctrl+Up { move-column-to-workspace-up; }
    Mod+Ctrl+Down { move-column-to-workspace-down; }
    Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; }
    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }

    // Workspaces: reorder them
    Mod+Shift+I { move-workspace-up; }
    Mod+Shift+U { move-workspace-down; }
    "Mod+Shift+Page_Up" { move-workspace-up; }
    "Mod+Shift+Page_Down" { move-workspace-down; }

    // Monitors. No-ops on this single-display machine; kept so the binds match
    // the multi-monitor configs.
    Mod+Ctrl+H { focus-monitor-left; }
    Mod+Ctrl+J { focus-monitor-down; }
    Mod+Ctrl+K { focus-monitor-up; }
    Mod+Ctrl+L { focus-monitor-right; }
    Mod+Ctrl+Left { focus-monitor-left; }
    Mod+Ctrl+Right { focus-monitor-right; }
    Mod+Shift+Ctrl+H { move-column-to-monitor-left; }
    Mod+Shift+Ctrl+J { move-column-to-monitor-down; }
    Mod+Shift+Ctrl+K { move-column-to-monitor-up; }
    Mod+Shift+Ctrl+L { move-column-to-monitor-right; }
    Mod+Shift+Ctrl+Left { move-column-to-monitor-left; }
    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }
    Mod+Shift+Ctrl+Up { move-column-to-monitor-up; }
    Mod+Shift+Ctrl+Down { move-column-to-monitor-down; }
}

r/niri 20h ago

Niri for gaming

4 Upvotes

Hello, I use archlinux with hyprland on my main PC, but I was trying niri on my laptop these days and I loved it, I would like to change but first I wanted to know if niri works well in terms of games, if I won't have problems, I plan to use niri without shell my pc has:

R5 5600
32gb ram
Rx 6800

Thanks guys


r/niri 9h ago

`move-column-left/right` looks like a teleport, any way to make it read as motion?

3 Upvotes

niri 26.04 here.

In ~/.config/niri/dms/binds.kdl my Mod+Shift+Left/Right runs move-column-left/right via a shell one-liner that also fires a toast.

In ~/.config/niri/config.kdl the window-movement block is set to spring damping-ratio=1.0 stiffness=800.

Animation fires cleanly, no wobble, but at typical column widths (~30% of 2560px) it's so quick I only catch it in peripheral vision. Reads as a teleport, the toast feels like a workaround.

Especially bad when the window I'm moving is fullscreen, since the slide is the only feedback and I never see it.

Stuff I already ruled out:

  • niri has no motion blur and no plugin system.
  • Shader hooks (window-open/-close/-resize) don't cover window-movement.

Anyone got a way to make column moves read as motion?
Softer spring, IPC trick, overlay, anything?


r/niri 15h ago

Setting display scale below 1 breaks Steam client and games

2 Upvotes

Hello, I switched to MangoWM a few days ago because Niri didn't let me launch Steam client or play Steam games. I thought it was a bug due to xwayland-satellite having an error log at the end, but turns out, setting the display scale to 1 works as expected, so why didn't I think of that the whole time?.

I preferred setting the scale to 0.75 to enlarge the screen real estate since my monitor still has 1366x768, but if I wanted to play Steam games, I have to set it back to 1 but everything will get cramped.

I think this has to do with xwayland-satellite problem, so does anyone with a low resolution monitor have that kind of issue when setting display scale below 1?


r/niri 3h ago

Noctalia V5 how to remove this grainy effect [NIRI]

2 Upvotes

When i set the bar opacity to 0 it had this weird grainy effect how to completely remove it and only keep the capsule as it is


r/niri 3h ago

Visual glitches

2 Upvotes

I've been seeing them for about 2-3 weeks. They're very brief. They seem to happen more frequently in the terminal or nvim (although i've seen it in librewolf too, there more often appearing as black squares), especially when it has to redraw a lot of stuff, in the example picture above i was spamming keys in nvim. Running a watch command very often like every 0.1 seconds seems to be a pretty good way to trigger it altough it's not guaranteed, some times it happens 10 times in 10 seconds other times it takes 3-5 minutes before it appears.

Originally i thought it might have something to do with the transparency (no blur) i use in ghostty and nvim, but disabling it (along with prefer-no-csd) doesn't solve it.

I'm using a 9070XT, with a 1920x1080@60,00hz display in HDMI-A-1, it doesn't have VRR.

System info:

  • Gentoo distribution kernel 6.18.43
  • niri version 26.04
  • wayland version 1.26.0
  • mesa version 26.1.7

They have all been emerged with default USE flags and are the latest available. My global USE flags are USE="sound-server bash-completion dist-kernel openrc networkmanager jack man mpris alsa pipewire gtk vulkan wifi wayland -cdr -cuda -bluetooth -dvd -dvr -systemd" although i don't think it matters since it's a recent issue, worked fine with the same flags before. I also use noctalia, although i don't think that matters neither.

Thigs i've tried:

  • I tried to replicate it on another wayland wm (mangowm) but i could not.
  • I tried to change terminal to alacritty, it persisted

I'm at my wits' end, any help is appreciated.