-
-
Save zkat/beefc09ad8191dc7077290feceb19582 to your computer and use it in GitHub Desktop.
input { | |
touchpad { | |
tap | |
natural-scroll | |
} | |
mouse { | |
// natural-scroll | |
// accel-speed 0.2 | |
// accel-profile "flat" | |
} | |
tablet { | |
// Set the name of the output (see below) which the tablet will map to. | |
// If this is unset or the output doesn't exist, the tablet maps to one of the | |
// existing outputs. | |
map-to-output eDP-1 | |
} | |
} | |
output eDP-1 { | |
scale 2.0 | |
transform normal | |
} | |
layout { | |
focus-ring { | |
width 2 | |
active-color 127 200 255 255 | |
inactive-color 80 80 80 255 | |
} | |
border off { | |
width 4 | |
active-color 255 200 127 255 | |
inactive-color 80 80 80 255 | |
} | |
preset-column-widths { | |
proportion 0.33333 | |
proportion 0.5 | |
proportion 0.66667 | |
} | |
default-column-width { proportion 0.5 } | |
gaps 16 | |
center-focused-column never | |
} | |
spawn-at-startup waybar | |
spawn-at-startup swaync | |
spawn-at-startup /usr/lib/polkit-kde-authentication-agent-1 | |
spawn-at-startup wl-paste --type text --watch cliphist store | |
spawn-at-startup wl-paste --type image --watch cliphist store | |
spawn-at-startup swayidle timeout 300 "swaylock -f --clock --fade-in 1 --grace 30 --indicator-idle-visible &&\ | |
systemctl suspend" \ | |
lock "swaylock -f --clock --fade-in 1" \ | |
before-sleep "swaylock -f --clock --fade-in 1" | |
spawn-at-startup blueman-applet | |
spawn-at-startup trayscale --hide-window | |
spawn-at-startup rclone mount OneDrive: OneDrive | |
spawn-at-startup rclone mount isabelle:data isabelle --allow-non-empty | |
spawn-at-startup hyprpaper | |
spawn-at-startup wluma | |
spawn-at-startup udiskie --tray | |
spawn-at-startup 1password | |
spawn-at-startup firefox | |
spawn-at-startup code | |
spawn-at-startup discord | |
spawn-at-startup slack | |
spawn-at-startup element-desktop | |
spawn-at-startup signal-desktop | |
// Uncomment this line to ask the clients to omit their client-side decorations if possible. | |
// If the client will specifically ask for CSD, the request will be honored. | |
// Additionally, clients will be informed that they are tiled, removing some rounded corners. | |
// prefer-no-csd | |
// You can change the path where screenshots are saved. | |
// A ~ at the front will be expanded to the home directory. | |
// The path is formatted with strftime(3) to give you the screenshot date and time. | |
screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png" | |
// You can also set this to null to disable saving screenshots to disk. | |
// screenshot-path null | |
// Settings for the "Important Hotkeys" overlay. | |
hotkey-overlay { | |
// Uncomment this line if you don't want to see the hotkey help at niri startup. | |
// skip-at-startup | |
} | |
binds { | |
// Keys consist of modifiers separated by + signs, followed by an XKB key name | |
// in the end. To find an XKB name for a particular key, you may use a program | |
// like wev. | |
// | |
// "Mod" is a special modifier equal to Super when running on a TTY, and to Alt | |
// when running as a winit window. | |
// | |
// Most actions that you can bind here can also be invoked programmatically with | |
// `niri msg action do-something`. | |
// Mod-Shift-/, which is usually the same as Mod-?, | |
// shows a list of important hotkeys. | |
Mod Shift Slash { show-hotkey-overlay } | |
// Suggested binds for running programs: terminal, app launcher, screen locker. | |
Mod T { spawn kitty" } | |
Mod Space { spawn tofi-drun "--drun-launch=true" } | |
Mod L { spawn swaylock } | |
Mod Shift Space { spawn bash -c "tofi-run --prompt-text=exec: --require-match=false | xargs hyprctl dispatch exec --" } | |
Mod Shift Period { spawn emojimart } | |
Mod A { spawn swaync-client -t -sw } | |
Mod V { spawn bash -c "cliphist list | tofi | cliphist-decode | wl-copy" } | |
// You can also use a shell: | |
// Mod T { spawn bash -c "notify-send hello && exec alacritty" } | |
// Example volume keys mappings for PipeWire & WirePlumber. | |
XF86AudioRaiseVolume { spawn wpctl set-volume @DEFAULT_AUDIO_SINK@ "0.1+" } | |
XF86AudioLowerVolume { spawn wpctl set-volume @DEFAULT_AUDIO_SINK@ "0.1-" } | |
XF86AudioMute { spawn wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle } | |
Shift XF86AudioRaiseVolume { spawn wpctl set-volume @DEFAULT_AUDIO_SOURCE@ "0.1+" } | |
Shift XF86AudioLowerVolume { spawn wpctl set-volume @DEFAULT_AUDIO_SOURCE@ "0.1-" } | |
Shift XF86AudioMute { spawn wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle } | |
XF86AudioPlay { spawn playerctl play-pause } | |
XF86MonBrightnessDown { spawn brillo -q -U "5" } | |
XF86MonBrightnessUp { spawn brillo -q -A "5" } | |
Mod Q { close-window } | |
Mod Left { focus-column-left } | |
Mod Down { focus-window-down } | |
Mod Up { focus-window-up } | |
Mod Right { focus-column-right } | |
Mod H { focus-column-left } | |
Mod J { focus-window-down } | |
Mod K { focus-window-up } | |
Mod L { focus-column-right } | |
Mod Ctrl Left { move-column-left } | |
Mod Ctrl Down { move-window-down } | |
Mod Ctrl Up { move-window-up } | |
Mod Ctrl Right { move-column-right } | |
Mod Ctrl H { move-column-left } | |
Mod Ctrl J { move-window-down } | |
Mod Ctrl K { move-window-up } | |
Mod Ctrl L { move-column-right } | |
// Alternative commands that move across workspaces when reaching | |
// the first or last window in a column. | |
// Mod J { focus-window-or-workspace-down } | |
// Mod K { focus-window-or-workspace-up } | |
// Mod Ctrl J { move-window-down-or-to-workspace-down } | |
// Mod Ctrl K { move-window-up-or-to-workspace-up } | |
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 Down { focus-monitor-down } | |
Mod Shift Up { focus-monitor-up } | |
Mod Shift Right { focus-monitor-right } | |
Mod Shift H { focus-monitor-left } | |
Mod Shift J { focus-monitor-down } | |
Mod Shift K { focus-monitor-up } | |
Mod Shift L { focus-monitor-right } | |
Mod Shift Ctrl Left { move-column-to-monitor-left } | |
Mod Shift Ctrl Down { move-column-to-monitor-down } | |
Mod Shift Ctrl Up { move-column-to-monitor-up } | |
Mod Shift Ctrl Right { move-column-to-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 } | |
// Alternatively, there are commands to move just a single window: | |
// Mod Shift Ctrl Left { move-window-to-monitor-left } | |
// ... | |
// And you can also move a whole workspace to another monitor: | |
// Mod Shift Ctrl Left { move-workspace-to-monitor-left } | |
// ... | |
Mod Page_Down { focus-workspace-down } | |
Mod Page_Up { focus-workspace-up } | |
Mod U { focus-workspace-down } | |
Mod I { focus-workspace-up } | |
Mod Ctrl Page_Down { move-column-to-workspace-down } | |
Mod Ctrl Page_Up { move-column-to-workspace-up } | |
Mod Ctrl U { move-column-to-workspace-down } | |
Mod Ctrl I { move-column-to-workspace-up } | |
// Alternatively, there are commands to move just a single window: | |
// Mod Ctrl Page_Down { move-window-to-workspace-down } | |
// ... | |
Mod Shift Page_Down { move-workspace-down } | |
Mod Shift Page_Up { move-workspace-up } | |
Mod Shift U { move-workspace-down } | |
Mod Shift I { move-workspace-up } | |
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 } | |
// Alternatively, there are commands to move just a single window: | |
// Mod Ctrl 1 { move-window-to-workspace 1 } | |
Mod Comma { consume-window-into-column } | |
Mod Period { expel-window-from-column } | |
// There are also commands that consume or expel a single window to the side. | |
// Mod BracketLeft { consume-or-expel-window-left } | |
// Mod BracketRight { consume-or-expel-window-right } | |
Mod R { switch-preset-column-width } | |
Mod F { maximize-column } | |
Mod Shift F { fullscreen-window } | |
Mod C { center-column } | |
// Finer width adjustments. | |
// This command can also: | |
// * set width in pixels: "1000" | |
// * adjust width in pixels: "-5" or " 5" | |
// * set width as a percentage of screen width: "25%" | |
// * adjust width as a percentage of screen width: "-10%" or " 10%" | |
// Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0, | |
// set-column-width "100" will make the column occupy 200 physical screen pixels. | |
Mod Minus { set-column-width "-10%" } | |
Mod Equal { set-column-width "+10%" } | |
// Finer height adjustments when in column with other windows. | |
Mod Shift Minus { set-window-height "-10%" } | |
Mod Shift Equal { set-window-height "+10%" } | |
// Actions to switch layouts. | |
// Note: if you uncomment these, make sure you do NOT have | |
// a matching layout switch hotkey configured in xkb options above. | |
// Having both at once on the same hotkey will break the switching, | |
// since it will switch twice upon pressing the hotkey (once by xkb, once by niri). | |
// Mod Space { switch-layout "next" } | |
// Mod Shift Space { switch-layout "prev" } | |
Print { screenshot } | |
Ctrl Print { screenshot-screen } | |
Alt Print { screenshot-window } | |
// The quit action will show a confirmation dialog to avoid accidental exits. | |
// If you want to skip the confirmation dialog, set the flag like so: | |
// Mod Shift E { quit skip-confirmation=true } | |
Mod Shift E { quit } | |
Mod Shift P { power-off-monitors } | |
Mod Shift Ctrl T { toggle-debug-tint } | |
} | |
// Settings for debugging. Not meant for normal use. | |
// These can change or stop working at any point with little notice. | |
debug { | |
// Make niri take over its DBus services even if it's not running as a session. | |
// Useful for testing screen recording changes without having to relogin. | |
// The main niri instance will *not* currently take back the services; so you will | |
// need to relogin in the end. | |
// dbus-interfaces-in-non-session-instances | |
// Wait until every frame is done rendering before handing it over to DRM. | |
// wait-for-frame-completion-before-queueing | |
// Enable direct scanout into overlay planes. | |
// May cause frame drops during some animations on some hardware. | |
// enable-overlay-planes | |
// Disable the use of the cursor plane. | |
// The cursor will be rendered together with the rest of the frame. | |
// disable-cursor-plane | |
// Override the DRM device that niri will use for all rendering. | |
// render-drm-device "/dev/dri/renderD129" | |
} |
@morenathan the main highlights are some slight ergonomic improvements: you don't have to quote every single string anymore, so there's a lot less syntax noise in general, and when you have { foo }
blocks, you don't need to do { foo; }
every time anymore.
Since unquoted strings allow a wide range of characters, it also means you can end up with lines like this, without needing to quote anything:
XF86AudioMute { spawn wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle }
Whereas in v1 that would need to be one of:
XF86AudioMute { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle" }
XF86AudioMute { spawn "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" }
It's nothing earth-shattering at first glance, but the little things add up. There's also a lot more consistency and clarity when it comes to some issues around comments and whitespace that were actually kinda weird in v1, and even string escapes (did you know you have to escape /
inside v1 strings? I don't know how that got in, but that's there forever now).
The other advantage of upgrading is that the new kdl-rs v2 parser can do much better diagnostics, and editors that support LSP will show them for you. Stuff like this:
(I'm obviously still working on getting the diagnostics to be worded properly, but the validation is there)
Other than the missing + signs everywhere I don't see much difference :). Maybe you can help me understand the "upgrade" here in syntax by pointing me to the relevant documentation?
I did look through KDL 2.0 previously and understood it was an inplace change that is backward compatible.
Anyways, I just want to see where this helps.