docs(DE): full redesign sweep — desk profiles, keybinds, noctalia v5, handy fleet wiring, incident log
- niri: index/config-tree rework, displays.md desk-profile rewrite, tips/action-reference/default-bindings refresh (26.04), generated keybindings.md (119 bindings) - noctalia-shell.md: settings.toml lives in ~/.local/state, taskbar widget, v5 keybind table (Mod+D/Mod+V/Alt+Tab) - handy.md: NEW; live nested store shape, fleet endpoint, known thinking-model empty-content breaker + verified cure - log.md: DE redesign entry + pam_faillock sudo-lockout incident
This commit is contained in:
1 parent
37554b0fb0
commit
b441cfda56
10 files changed
+974
-166
No files matched your search
@@ -1,16 +1,18 @@
|
||||
---
|
||||
type: reference
|
||||
title: Niri Action Reference
|
||||
description: Complete reference of all available niri actions — window operations, focus, movement, spawning, and system actions.
|
||||
description: Curated reference of niri actions — window operations, focus, movement, spawning, and system actions. For complete command-line options, see `niri msg action <ACTION> --help`.
|
||||
tags:
|
||||
- niri
|
||||
- actions
|
||||
- reference
|
||||
verified: 2026-08-28
|
||||
verified: 2026-10-09
|
||||
---
|
||||
|
||||
# Action Reference
|
||||
|
||||
> **Note:** This is a curated subset. For complete options and parameters, run `niri msg action <ACTION> --help` (authoritative, live).
|
||||
|
||||
## Window/Column Actions
|
||||
|
||||
- `close-window` — Close focused window
|
||||
@@ -55,15 +57,49 @@ verified: 2026-08-28
|
||||
- `spawn "program"` — Run program (no shell expansion)
|
||||
- `spawn-sh "command"` — Run command through shell
|
||||
- `spawn-at-startup "program"` — Run at startup
|
||||
- `quit` — Quit compositor (with confirmation)
|
||||
- `quit` — Quit compositor (with confirmation, `--skip-confirmation` available)
|
||||
- `show-hotkey-overlay` — Show keybind cheat sheet
|
||||
- `toggle-overview` — Toggle overview
|
||||
- `screenshot` — Interactive screenshot
|
||||
- `screenshot-screen` — Screenshot monitor
|
||||
- `screenshot-window` — Screenshot window
|
||||
- `screenshot-screen` — Screenshot monitor (`--write-to-disk`, `--show-pointer` options)
|
||||
- `screenshot-window` — Screenshot window (`--write-to-disk`, `--show-pointer` options)
|
||||
- `power-off-monitors` — Turn off displays
|
||||
- `toggle-keyboard-shortcuts-inhibit` — Toggle inhibitor
|
||||
- `do-screen-transition` — Smooth screen transition (for theme switching)
|
||||
- `do-screen-transition` — Smooth screen transition (for theme switching, `--delay-ms` option)
|
||||
- `stop-cast --session-id <ID>` — Stop a PipeWire screencast
|
||||
- `toggle-window-rule-opacity` — Toggle opacity of focused window
|
||||
- `focus-column-or-monitor-left/right` — Focus column or monitor horizontally
|
||||
- `focus-column-or-monitor-up/down` — Focus column or monitor vertically
|
||||
- `focus-window-or-monitor-up/down` — Focus window or monitor vertically
|
||||
- `focus-window-or-monitor-down/up` — Focus window or monitor vertically
|
||||
- `focus-column-or-monitor-left/right` — Focus column or monitor horizontally
|
||||
- `focus-window-or-monitor-down/up` — Focus window or monitor vertically
|
||||
- `focus-window-or-workspace-down/up` — Focus window or workspace vertically
|
||||
- `focus-window-or-workspace-up/down` — Focus window or workspace vertically
|
||||
|
||||
## Bind Properties
|
||||
|
||||
Actions and bindings support optional properties:
|
||||
|
||||
| Property | Description |
|
||||
|----------|-------------|
|
||||
| `repeat=false` | Disable repeat for the binding |
|
||||
| `cooldown-ms=N` | Rate-limit to N milliseconds (commonly 150 for wheel binds) |
|
||||
| `allow-when-locked=true` | Execute even when session is locked |
|
||||
| `allow-inhibiting=false` | Process even when inhibitor is active |
|
||||
| `hotkey-overlay-title="..."` | Custom title for overlay (supports `=null` to hide or Pango markup) |
|
||||
|
||||
### Mod+Mouse* Binds (25.01+)
|
||||
|
||||
Since 25.01, `Mod+Mouse*` binds are supported for advanced navigation.
|
||||
|
||||
### TouchpadScroll Binds
|
||||
|
||||
`Mod+TouchpadScroll*` binds are available for touchpad-based navigation.
|
||||
|
||||
### Mouse-Click Binds
|
||||
|
||||
Mouse-click actions operate on the **focused window**, not the clicked window.
|
||||
|
||||
## Related
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ tags:
|
||||
- niri
|
||||
- keybindings
|
||||
- reference
|
||||
- unverified
|
||||
verified: 2026-10-09
|
||||
---
|
||||
|
||||
# Default Key Bindings
|
||||
@@ -61,7 +61,7 @@ tags:
|
||||
|
||||
| Key | Action |
|
||||
|-----|--------|
|
||||
| `Mod+R` | Switch preset column width (1/3, 1/2, 2/3) |
|
||||
| `Mod+R` | Switch preset column width (1/3, 1/2, 2/3, 87.5%) |
|
||||
| `Mod+Shift+R` | Switch preset width (reverse) |
|
||||
| `Mod+Minus` | Decrease column width by 10% |
|
||||
| `Mod+Equal` | Increase column width by 10% |
|
||||
@@ -129,12 +129,12 @@ tags:
|
||||
| `Mod+WheelScrollLeft` | Focus column left |
|
||||
| `Mod+Ctrl+WheelScrollDown` | Move column to workspace down |
|
||||
| `Mod+Ctrl+WheelScrollUp` | Move column to workspace up |
|
||||
| `Mod+Ctrl+WheelScrollRight` | Move column right |
|
||||
| `Mod+Ctrl+WheelScrollLeft` | Move column left |
|
||||
| `Mod+Ctrl+WheelScrollRight` | Move column to workspace right |
|
||||
| `Mod+Ctrl+WheelScrollLeft` | Move column to workspace left |
|
||||
| `Mod+Shift+WheelScrollDown` | Focus column right |
|
||||
| `Mod+Shift+WheelScrollUp` | Focus column left |
|
||||
| `Mod+Ctrl+Shift+WheelScrollDown` | Move column right |
|
||||
| `Mod+Ctrl+Shift+WheelScrollUp` | Move column left |
|
||||
| `Mod+Ctrl+Shift+WheelScrollDown` | Move column to workspace right |
|
||||
| `Mod+Ctrl+Shift+WheelScrollUp` | Move column to workspace left |
|
||||
|
||||
## Overview
|
||||
|
||||
|
||||
@@ -1,126 +1,135 @@
|
||||
---
|
||||
type: reference
|
||||
title: Display Configuration
|
||||
description: Niri output configuration for a multi-monitor desk rig — portrait transforms, position pinning, scale, and iGPU display ownership.
|
||||
description: Niri output configuration on blankpad — EDID-identity-keyed desk profiles, hotplug auto-switching, portrait transforms, position pinning, and GPU notes (AMD Cezanne now; Intel Arc render-node pin is dankware-legacy).
|
||||
tags:
|
||||
- niri
|
||||
- display
|
||||
- monitors
|
||||
- rotation
|
||||
verified: 2026-08-28
|
||||
- desk-profiles
|
||||
verified: 2026-10-09
|
||||
---
|
||||
|
||||
# Display Configuration
|
||||
|
||||
How a multi-monitor desk rig is configured in niri: portrait external panels
|
||||
flanking a laptop panel, positions pinned by hand, and the integrated GPU kept
|
||||
as the display owner.
|
||||
Niri output config on **blankpad** is a **desk-profile system**: the laptop
|
||||
travels between desks, connector names (`DP-2`, `HDMI-A-1`) reshuffle per
|
||||
dock, so panels are configured by **EDID identity** (manufacturer model
|
||||
serial), and *positions* live in per-desk files. A hotplug watcher and a
|
||||
manual picker keep the live layout matched to reality.
|
||||
|
||||
**Config:** `~/.config/niri/cfg/display.kdl`
|
||||
**Probe:** `wlr-randr` (installed by CachyOS) reports what the compositor
|
||||
actually committed — connectors, preferred modes, transforms, scale, positions.
|
||||
**Mechanism:** `~/.config/niri/cfg/display.kdl` is a **symlink** to the
|
||||
active profile (`desk-1-home.kdl`, `desk-2-portable.kdl`, …).
|
||||
`config.kdl` includes it with `include optional=true` so a missing link is a
|
||||
warning, not a parse failure.
|
||||
**Probe:** `niri msg outputs` is authoritative (connector, full EDID long
|
||||
name, modes, transform, scale, position, VRR). `wlr-randr` remains available.
|
||||
|
||||
---
|
||||
|
||||
## The rig
|
||||
|
||||
Three outputs in a row: two external monitors rotated to portrait, one
|
||||
internal laptop panel in landscape at the right.
|
||||
## The desk-1 rig (home)
|
||||
|
||||
```
|
||||
┌──────────────┬──────────────┬──────────────┐
|
||||
│ │ │ │
|
||||
│ DP-1 │ DP-3 │ eDP-1 │
|
||||
│ external │ external │ internal │
|
||||
│ 1920x1200 │ 1920x1200 │ 2560x1600 │
|
||||
│ Portrait │ Portrait │ Landscape │
|
||||
│ 90° rotate │ 270° rotate │ 1.5x scale │
|
||||
│ │ │ │
|
||||
└──────────────┴──────────────┴──────────────┘
|
||||
x=0,0 x=1200,0 auto-placed
|
||||
┌──────────────┬──────────────────────────────┬──────────┐
|
||||
│ PM1601 │ Sceptre M34 ultrawide │ eDP-1 │
|
||||
│ portrait │ 3440x1440 @ 239.999 │ 1920x1080│
|
||||
│ 1200x1920 │ landscape, scale 1 │ scale 1 │
|
||||
│ rot 90 │ position 1581,-600 │ 5021,-240│
|
||||
└──────────────┴──────────────────────────────┴──────────┘
|
||||
HDMI-A-1 DP-2 (focus-at-startup) eDP-1 (fallback focus)
|
||||
```
|
||||
|
||||
| Output | Role | Transform | Position | Scale |
|
||||
|--------|------|-----------|----------|-------|
|
||||
| `DP-1` | External, left | `90` (portrait) | `x=0 y=0` | 1.0 |
|
||||
| `DP-3` | External, center | `270` (portrait) | `x=1200 y=0` | 1.0 |
|
||||
| `eDP-1` | Internal panel | none (landscape) | auto-placed | 1.5 |
|
||||
| Panel | EDID long name | Keyed by | Notes |
|
||||
|-------|----------------|----------|-------|
|
||||
| Sceptre M34 ultrawide | `Sceptre Tech Inc Sceptre M34 Unknown` | identity | `mode "3440x1440@239.999"`, `focus-at-startup` |
|
||||
| PM1601 portrait | *not captured* | connector `HDMI-A-1` | dock-dependent; run `desk.sh capture` when plugged in, then re-key |
|
||||
| eDP-1 laptop panel | `Lenovo Group Limited 0x40A9 Unknown` | identity | scale **1.0** (deliberate; Ghostty grid at 1.25 rejected 2026-10-09), second `focus-at-startup` |
|
||||
|
||||
The two portrait panels are 1200 px wide after rotation, which is why the
|
||||
second one starts at `x=1200`. The internal panel declares no position at
|
||||
all — niri auto-places it to the right of the explicitly positioned outputs.
|
||||
That is the only reliable way to keep a third panel from landing on top of
|
||||
the rig when a cable is re-seated.
|
||||
VRR: DP-2 supports it; **left disabled by decision** (2026-10-09). Add
|
||||
`variable-refresh-rate` per output if that ever changes.
|
||||
|
||||
---
|
||||
`focus-at-startup` on both M34 and eDP-1: niri focuses in config order, so
|
||||
the ultrawide wins when present and the laptop panel is the fallback.
|
||||
|
||||
## Desk switching
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
P[plug / unplug] --> E[niri event-stream<br/>OutputsChanged]
|
||||
E --> M[desk-autoswitch.sh<br/>debounced matcher]
|
||||
M --> R{profile requires<br/>subset of connected?}
|
||||
R -->|best match| A[desk.sh apply:<br/>validate - relink - reload - notify]
|
||||
R -->|none| K[keep current + notify]
|
||||
D[Mod+Shift+D] --> C[desk.sh cycle] --> A
|
||||
```
|
||||
|
||||
- **Matcher:** each profile declares `// requires: <long name>` (all must be
|
||||
connected) and `// optional:` comment lines; the most-specific eligible
|
||||
profile wins.
|
||||
- **Apply order is load-config-safe:** `niri validate` the *current* config
|
||||
first, relink `display.kdl`, then `niri msg action load-config-file`,
|
||||
then a noctalia notification names the active desk. A profile that fails
|
||||
validation can never go live.
|
||||
- **Manual override:** `Mod+Shift+D` cycles profiles (wrong auto-pick, or
|
||||
same panels, new layout).
|
||||
- **New desk:** `desk.sh capture` prints connected long names → copy into a
|
||||
new `desk-N-<name>.kdl` (see `desk-2-portable.kdl` skeleton, portable
|
||||
monitor EDID pending first capture).
|
||||
- Unit: `blankpad-desk-autoswitch.service` (systemd user,
|
||||
`ConditionHost=blankpad`).
|
||||
|
||||
## The config pattern
|
||||
|
||||
```kdl
|
||||
output "DP-1" {
|
||||
transform "90"
|
||||
position x=0 y=0
|
||||
}
|
||||
|
||||
output "DP-3" {
|
||||
transform "270"
|
||||
position x=1200 y=0
|
||||
}
|
||||
|
||||
output "eDP-1" {
|
||||
// no position — auto-placed to the right of the DP-* outputs
|
||||
scale 1.5
|
||||
// desk-1-home.kdl — one block per panel, keyed by identity
|
||||
output "Sceptre Tech Inc Sceptre M34 Unknown" {
|
||||
mode "3440x1440@239.999"
|
||||
scale 1
|
||||
transform "normal"
|
||||
position x=1581 y=-600
|
||||
focus-at-startup
|
||||
}
|
||||
```
|
||||
|
||||
Three rules learned the hard way:
|
||||
Four rules learned the hard way:
|
||||
|
||||
1. **One output, one block.** A second block keyed by the make/model string
|
||||
(`output "Samsung Electric Company …"`) that also sets `transform` fights
|
||||
the connector-keyed block. Use the make/model form only to pin a `mode`
|
||||
for an output whose connector name is unstable across boots, and never
|
||||
set a transform in both places.
|
||||
2. **Positions are absolute, not relational.** Niri does not reflow the rig
|
||||
when one panel is disconnected — a missing output leaves a hole at its
|
||||
coordinates. Verify with `wlr-randr` after any cable or dock change.
|
||||
3. **Re-assert rotation after a config reload, then confirm.** A transform
|
||||
silently reverting to landscape is the usual symptom of a duplicate
|
||||
output block, not of a failed reload.
|
||||
|
||||
Modes must match what the panel reports. Check `wlr-randr` for the preferred
|
||||
mode before writing a `mode` line; a `mode` the panel cannot drive leaves the
|
||||
output dark or drops it.
|
||||
|
||||
---
|
||||
1. **One output, one block.** Two blocks matching the same output (connector
|
||||
name *and* long name) fight over properties — transform reverts are the
|
||||
classic symptom. Desk profiles are self-contained: a panel's identity,
|
||||
mode, transform, **and** position live in exactly one block per file.
|
||||
2. **Key by EDID identity, not connector.** Connector names swap between
|
||||
docks; the EDID long name travels with the panel. Serials on these panels
|
||||
read `Unknown`, so the full long name (manufacturer model serial) is the
|
||||
match string — copy it verbatim from `niri msg outputs`.
|
||||
3. **Positions are absolute, not relational.** A disconnected panel leaves
|
||||
a hole; that is exactly why positions belong to the *desk profile*, not a
|
||||
global file.
|
||||
4. **Modes must match what the panel reports** (`niri msg outputs` →
|
||||
`Mode: current …`). A mode the panel cannot drive leaves the output dark.
|
||||
|
||||
## GPU assignment
|
||||
|
||||
The integrated GPU drives all display output; the discrete GPU is available
|
||||
for compute but must not take the outputs. Pin the render node explicitly in
|
||||
`~/.config/niri/cfg/misc.kdl`:
|
||||
blankpad is a **single AMD Cezanne iGPU** (`/dev/dri/renderD128`, PCI
|
||||
`07:00.0`). No render-node pin exists in `misc.kdl` — and must not: the
|
||||
blankpad override file deliberately deletes the pin.
|
||||
|
||||
```kdl
|
||||
environment {
|
||||
render-node "/dev/dri/renderD129"
|
||||
}
|
||||
```
|
||||
|
||||
Without the pin, the session's render node follows probe order and can land
|
||||
on the discrete GPU — which costs display-linked copies and, on hybrid
|
||||
graphics laptops, is a common trigger of the suspend/resume deadlock covered
|
||||
in the sleep-wake investigation report.
|
||||
|
||||
---
|
||||
The `environment { render-node "/dev/dri/renderD129" }` pin found in the
|
||||
*base* `misc.kdl` is **dankware-legacy** (Intel Arc iGPU + discrete GPU
|
||||
hybrid; pin kept the iGPU as display owner and sidesteps the suspend/resume
|
||||
deadlock documented in the sleep-wake investigation). Deploying that base
|
||||
file on blankpad pins a render node that does not exist — this is why
|
||||
blankpad runs the `zz-blankpad` override layer (see [[index|the per-host
|
||||
symlink matrix]]).
|
||||
|
||||
## Reload
|
||||
|
||||
`niri msg action load-config-file` reloads live. Never `SIGHUP` the process
|
||||
— see [[tips]].
|
||||
|
||||
---
|
||||
|
||||
## See Also
|
||||
|
||||
- [Niri](/tools/niri/index.md) — compositor overview and config layout
|
||||
- [[tips|tips]] — reload path and other gotchas
|
||||
- [[tips|tips]] — reload path, `niri msg layers/casts`, includes
|
||||
- [[noctalia-shell|noctalia-shell]] — notification shown on desk switch
|
||||
- [[cachyos|cachyos]] — operating system, including `wlr-randr`
|
||||
@@ -12,15 +12,19 @@ Niri is a scrollable-tiling Wayland compositor. Windows are arranged in columns
|
||||
```
|
||||
~/.config/niri/
|
||||
├── config.kdl # Main entry, includes all modules
|
||||
├── noctalia.kdl # Generated by noctalia (theme colors)
|
||||
└── cfg/
|
||||
├── animation.kdl # Spring and curve animations
|
||||
├── autostart.kdl # Startup applications
|
||||
├── display.kdl # Output configuration
|
||||
├── autostart.kdl # Startup applications (noctalia, handy --start-hidden)
|
||||
├── display.kdl # SYMLINK to the active desk-*.kdl profile (see displays)
|
||||
├── desk-1-home.kdl # Desk profile: home rig (EDID-keyed)
|
||||
├── desk-2-portable.kdl # Desk profile: portable monitor (skeleton)
|
||||
├── input.kdl # Keyboard, touchpad, mouse
|
||||
├── keybinds.kdl # All key bindings
|
||||
├── layout.kdl # Gaps, column widths, struts
|
||||
├── rules.kdl # Window and layer rules
|
||||
└── misc.kdl # Environment, cursor, debug
|
||||
├── switch-events.kdl # Lid-close -> noctalia lock-and-suspend (blankpad)
|
||||
└── misc.kdl # Environment, cursor, blur
|
||||
```
|
||||
|
||||
## Layout
|
||||
@@ -32,7 +36,7 @@ Column-based scrollable tiling. Columns are cycled with Mod+Left/Right (or Mod+H
|
||||
| **Gaps** | 16px |
|
||||
| **Center focused column** | Never |
|
||||
| **Background** | Transparent (for Noctalia wallpaper) |
|
||||
| **Column presets** | 33%, 50%, 67% |
|
||||
| **Column presets** | 12.5%, 25%, 33%, 50%, 67%, 75%, 87.5% (Mod+R / Mod+Shift+R) |
|
||||
|
||||
## Input
|
||||
|
||||
@@ -42,7 +46,6 @@ Column-based scrollable tiling. Columns are cycled with Mod+Left/Right (or Mod+H
|
||||
| **Workspace back-and-forth** | Enabled |
|
||||
| **Numlock** | Enabled on startup |
|
||||
| **Touchpad tap** | Enabled |
|
||||
| **Natural scroll** | Enabled |
|
||||
|
||||
## Window Rules
|
||||
|
||||
@@ -52,6 +55,8 @@ Column-based scrollable tiling. Columns are cycled with Mod+Left/Right (or Mod+H
|
||||
| Steam (non-window) | `app-id="steam"`, exclude title `Steam` | Open floating |
|
||||
| Steam notifications | `app-id="steam"`, title `notificationtoasts_*` | Floating, bottom-right |
|
||||
| Noctalia wallpaper | namespace `noctalia-wallpaper*` | Place in backdrop |
|
||||
| Noctalia settings | `app-id="dev.noctalia.Noctalia"` | Floating 1080x920 |
|
||||
| Noctalia layers | namespace `^noctalia-(bar|notification|dock|panel|attached-panel|osd)` | blur xray=false |
|
||||
|
||||
## Environment Variables
|
||||
|
||||
@@ -63,17 +68,16 @@ Column-based scrollable tiling. Columns are cycled with Mod+Left/Right (or Mod+H
|
||||
| `QT_WAYLAND_DISABLE_WINDOWDECORATION` | `1` | Remove Qt CSD |
|
||||
| `XDG_CURRENT_DESKTOP` | `niri` | Desktop identification |
|
||||
| `XDG_SESSION_TYPE` | `wayland` | Session type |
|
||||
| `render-node` | `/dev/dri/renderD129` | Intel Arc iGPU |
|
||||
|
||||
## Animations
|
||||
|
||||
| Animation | Type | Parameters |
|
||||
|-----------|------|------------|
|
||||
| Workspace switch | Spring | damping=1.0, stiffness=1000 |
|
||||
| Workspace switch | Spring | damping-ratio=1.0 stiffness=1000 |
|
||||
| Window open | Duration | 200ms, ease-out-quad |
|
||||
| Window close | Duration | 200ms, ease-out-cubic |
|
||||
| Window movement | Spring | damping=1.0, stiffness=800 |
|
||||
| Window resize | Spring | damping=1.0, stiffness=1000 |
|
||||
| Window movement | Spring | damping-ratio=1.0 stiffness=800 |
|
||||
| Window resize | Spring | damping-ratio=1.0 stiffness=1000 |
|
||||
|
||||
---
|
||||
|
||||
@@ -81,11 +85,12 @@ Column-based scrollable tiling. Columns are cycled with Mod+Left/Right (or Mod+H
|
||||
|
||||
| File | Type | Description |
|
||||
|------|------|-------------|
|
||||
| [[action-reference|action-reference.md]] | reference | Complete reference of all available niri actions |
|
||||
| [[action-reference|action-reference.md]] | reference | Curated reference of niri actions |
|
||||
| [[default-bindings|default-bindings.md]] | reference | Default key bindings organized by category |
|
||||
| [[key-bindings-syntax|key-bindings-syntax.md]] | reference | KDL configuration syntax for key bindings |
|
||||
| [[tips|tips.md]] | howto | Practical tips for working with niri |
|
||||
| [[displays|displays.md]] | reference | Multi-monitor display rig: portrait transforms, positions, scale, iGPU display ownership |
|
||||
| [[displays|displays.md]] | reference | Desk-profile system: EDID-keyed outputs, hotplug auto-switch, portrait transforms, GPU notes |
|
||||
| [[keybindings|keybindings.md]] | reference | GENERATED keybinding cheat sheet (scripts/gen-keybinds.sh) |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -0,0 +1,183 @@
|
||||
# Niri Keybindings
|
||||
|
||||
> GENERATED by `scripts/gen-keybinds.sh` from `keybinds.kdl` — do not edit by hand.
|
||||
|
||||
## Keybindings
|
||||
|
||||
| Key | Action |
|
||||
|-----|--------|
|
||||
|
||||
## noctalia-shell keybinds
|
||||
|
||||
| Key | Action |
|
||||
|-----|--------|
|
||||
| `Mod+Shift+ESCAPE` | show-hotkey-overlay |
|
||||
|
||||
## Applications
|
||||
|
||||
| Key | Action |
|
||||
|-----|--------|
|
||||
| `Mod+Return` | Open Terminal: Ghostty |
|
||||
| `Mod+B` | Open Browser: firefox |
|
||||
| `Mod+Shift+Return` | Open Wallpaper Selector: noctalia wallpaper toggle |
|
||||
| `Mod+S` | Open Control Center: noctalia controlCenter |
|
||||
| `Mod+Shift+S` | Open Settings: noctalia settings |
|
||||
| `Mod+D` | Open App Launcher: noctalia launcher |
|
||||
| `Mod+ALT+L` | Lock Screen: noctalia lock |
|
||||
| `Mod+Shift+Q` | Session Menu: noctalia sessionMenu |
|
||||
| `Mod+V` | Clipboard History: noctalia panel |
|
||||
| `Alt+TAB` | Window Switcher: noctalia |
|
||||
| `Mod+Shift+Space` | Handy: toggle post-process recording |
|
||||
| `Mod+Shift+D` | Cycle Desk Profile |
|
||||
| `Mod+E` | File Manager: Nautilus |
|
||||
|
||||
## Media Controls
|
||||
|
||||
| Key | Action |
|
||||
|-----|--------|
|
||||
| `XF86AudioRaiseVolume` | spawn-sh "noctalia msg volume-up" |
|
||||
| `XF86AudioLowerVolume` | spawn-sh "noctalia msg volume-down" |
|
||||
| `XF86AudioMute` | spawn-sh "noctalia msg volume-mute" |
|
||||
| `XF86AudioMicMute` | spawn-sh "noctalia msg mic-mute" |
|
||||
| `XF86AudioNext` | spawn-sh "noctalia msg media next" |
|
||||
| `XF86AudioPrev` | spawn-sh "noctalia msg media previous" |
|
||||
| `XF86AudioPlay` | spawn-sh "noctalia msg media play" |
|
||||
| `XF86AudioPause` | spawn-sh "noctalia msg media stop" |
|
||||
|
||||
## Brightness Controls
|
||||
|
||||
| Key | Action |
|
||||
|-----|--------|
|
||||
| `XF86MonBrightnessUp` | spawn-sh "noctalia msg brightness-up" |
|
||||
| `XF86MonBrightnessDown` | spawn-sh "noctalia msg brightness-down" |
|
||||
|
||||
## Window Movement and Focus
|
||||
|
||||
| Key | Action |
|
||||
|-----|--------|
|
||||
| `Mod+Q` | close-window |
|
||||
| `Mod+Left` | focus-column-left |
|
||||
| `Mod+H` | focus-column-left |
|
||||
| `Mod+Right` | focus-column-right |
|
||||
| `Mod+L` | focus-column-right |
|
||||
| `Mod+Up` | focus-window-up |
|
||||
| `Mod+K` | focus-window-up |
|
||||
| `Mod+Down` | focus-window-down |
|
||||
| `Mod+J` | focus-window-down |
|
||||
| `Mod+CTRL+Left` | swap-window-left |
|
||||
| `Mod+CTRL+H` | swap-window-left |
|
||||
| `Mod+CTRL+Right` | swap-window-right |
|
||||
| `Mod+CTRL+L` | swap-window-right |
|
||||
| `Mod+CTRL+Alt+Left` | move-column-left |
|
||||
| `Mod+CTRL+Alt+H` | move-column-left |
|
||||
| `Mod+CTRL+Alt+Right` | move-column-right |
|
||||
| `Mod+CTRL+Alt+L` | move-column-right |
|
||||
| `Mod+CTRL+UP` | move-window-up |
|
||||
| `Mod+CTRL+K` | move-window-up |
|
||||
| `Mod+CTRL+Down` | move-window-down |
|
||||
| `Mod+CTRL+J` | move-window-down |
|
||||
| `Mod+Home` | focus-column-first |
|
||||
| `Mod+End` | focus-column-last |
|
||||
| `Mod+CTRL+Home` | move-column-to-first |
|
||||
| `Mod+CTRL+End` | move-column-to-last |
|
||||
| `Mod+Shift+Left` | focus-monitor-left |
|
||||
| `Mod+Shift+Right` | focus-monitor-right |
|
||||
| `Mod+Shift+UP` | focus-monitor-up |
|
||||
| `Mod+Shift+Down` | focus-monitor-down |
|
||||
| `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 |
|
||||
| `Mod+Shift+V` | switch-focus-between-floating-and-tiling |
|
||||
| `Mod+BracketLeft` | consume-or-expel-window-left |
|
||||
| `Mod+BracketRight` | consume-or-expel-window-right |
|
||||
| `Mod+Comma` | consume-window-into-column |
|
||||
| `Mod+Period` | expel-window-from-column |
|
||||
| `Mod+R` | switch-preset-column-width |
|
||||
| `Mod+Shift+R` | switch-preset-column-width-back |
|
||||
| `Mod+Ctrl+Shift+R` | switch-preset-window-height |
|
||||
| `Mod+Ctrl+R` | reset-window-height |
|
||||
|
||||
## Workspace Switching
|
||||
|
||||
| Key | Action |
|
||||
|-----|--------|
|
||||
| `Mod+WheelScrollDown` | focus-workspace-down |
|
||||
| `Mod+WheelScrollUp` | focus-workspace-up |
|
||||
| `Mod+CTRL+WheelScrollDown` | move-column-to-workspace-down |
|
||||
| `Mod+CTRL+WheelScrollUp` | move-column-to-workspace-up |
|
||||
| `Mod+WheelScrollRight` | focus-column-right |
|
||||
| `Mod+WheelScrollLeft` | focus-column-left |
|
||||
| `Mod+CTRL+WheelScrollRight` | move-column-right |
|
||||
| `Mod+CTRL+WheelScrollLeft` | move-column-left |
|
||||
| `Mod+Shift+WheelScrollDown` | focus-column-right |
|
||||
| `Mod+Shift+WheelScrollUp` | focus-column-left |
|
||||
| `Mod+CTRL+Shift+WheelScrollDown` | move-column-right |
|
||||
| `Mod+CTRL+Shift+WheelScrollUp` | move-column-left |
|
||||
| `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+CTRL+1` | move-column-to-workspace 1 |
|
||||
| `Mod+CTRL+2` | move-column-to-workspace 2 |
|
||||
| `Mod+CTRL+3` | move-column-to-workspace 3 |
|
||||
| `Mod+CTRL+4` | move-column-to-workspace 4 |
|
||||
| `Mod+CTRL+5` | move-column-to-workspace 5 |
|
||||
| `Mod+CTRL+6` | move-column-to-workspace 6 |
|
||||
| `Mod+CTRL+7` | move-column-to-workspace 7 |
|
||||
| `Mod+CTRL+8` | move-column-to-workspace 8 |
|
||||
| `Mod+CTRL+9` | move-column-to-workspace 9 |
|
||||
| `Mod+TAB` | focus-workspace-previous |
|
||||
|
||||
## Layout Controls
|
||||
|
||||
| Key | Action |
|
||||
|-----|--------|
|
||||
| `Mod+CTRL+F` | expand-column-to-available-width |
|
||||
| `Mod+C` | center-column |
|
||||
| `Mod+CTRL+C` | center-visible-columns |
|
||||
| `Mod+Minus` | set-column-width "-10%" |
|
||||
| `Mod+Equal` | set-column-width "+10%" |
|
||||
| `Mod+Shift+Minus` | set-window-height "-10%" |
|
||||
| `Mod+Shift+Equal` | set-window-height "+10%" |
|
||||
|
||||
## Modes
|
||||
|
||||
| Key | Action |
|
||||
|-----|--------|
|
||||
| `Mod+T` | toggle-window-floating |
|
||||
| `Mod+F` | maximize-column |
|
||||
| `Mod+Shift+F` | fullscreen-window |
|
||||
| `Mod+W` | toggle-column-tabbed-display |
|
||||
| `Mod+M` | maximize-window-to-edges |
|
||||
|
||||
## Screenshots
|
||||
|
||||
| Key | Action |
|
||||
|-----|--------|
|
||||
| `CTRL+Shift+1` | Screenshot: flameshot full |
|
||||
| `CTRL+Shift+2` | Screenshot: flameshot screen |
|
||||
| `CTRL+Shift+3` | Screenshot: flameshot region |
|
||||
| `Print` | Screenshot: flameshot full |
|
||||
| `Ctrl+Print` | Screenshot: flameshot region |
|
||||
| `Alt+Print` | Screenshot: flameshot screen |
|
||||
|
||||
## Emergency Escape Key
|
||||
|
||||
| Key | Action |
|
||||
|-----|--------|
|
||||
| `Mod+ESCAPE` | toggle-keyboard-shortcuts-inhibit |
|
||||
|
||||
## Exit / Power
|
||||
|
||||
| Key | Action |
|
||||
|-----|--------|
|
||||
| `CTRL+ALT+Delete` | quit |
|
||||
| `Mod+Shift+P` | power-off-monitors |
|
||||
| `Mod+O` | toggle-overview |
|
||||
|
||||
@@ -6,7 +6,7 @@ tags:
|
||||
- niri
|
||||
- tips
|
||||
- gotchas
|
||||
verified: 2026-08-28
|
||||
verified: 2026-10-09
|
||||
---
|
||||
|
||||
# Helpful Tips
|
||||
@@ -30,6 +30,12 @@ Correct reload options, in order of preference:
|
||||
|
||||
Niri reads `~/.config/niri/config.kdl` (or `config.kdl` relative to its CWD). Split config lives in `~/.config/niri/cfg/` — each `.kdl` file is `include`d from the main config, so a reload picks up edits to any included module.
|
||||
|
||||
### 26.04 Config Loading Features
|
||||
|
||||
`niri msg action load-config-file --path <file>` switches configs at runtime (26.04). It includes:
|
||||
- `optional=true` support — allows loading configs that may not exist
|
||||
- `~` expansion — tilde paths are expanded to the niri user's home directory
|
||||
|
||||
## 4. Alternative navigation
|
||||
|
||||
Vim-like keys (H/J/K/L) are bound by default alongside arrow keys.
|
||||
@@ -38,9 +44,16 @@ Vim-like keys (H/J/K/L) are bound by default alongside arrow keys.
|
||||
|
||||
Every action can be invoked via `niri msg action <action-name>`.
|
||||
|
||||
## 6. Find XKB keys
|
||||
### 26.04 IPC Enhancements
|
||||
|
||||
Use `wev` to discover key names.
|
||||
- `niri msg layers` — lists layer-shell namespaces per output
|
||||
- `niri msg casts` — lists active PipeWire screencasts
|
||||
- `Escape` cancels drag-and-drop operations
|
||||
- Duplicate-bind parse errors now show the **first definition** in the file
|
||||
|
||||
### Pointer Behavior
|
||||
|
||||
Pointer warps across the screen during `view-scroll` gestures.
|
||||
|
||||
## Related
|
||||
|
||||
|
||||
Reference in new issue
Block a user