Files
dotfiles/fedora/niri/config.kdl
Mikhail Kilin 8cedd606f5 fixes
2026-06-21 16:22:06 +03:00

627 lines
19 KiB
Plaintext

debug {
// preview-render "screencast"
// preview-render "screen-capture"
// dbus-interfaces-in-non-session-instances
// wait-for-frame-completion-before-queueing
// enable-overlay-planes
disable-cursor-plane
// disable-direct-scanout
// render-drm-device "/dev/dri/renderD129"
// render-drm-device "/dev/dri/card1"
// enable-color-transformations-capability
// emulate-zero-presentation-time
}
input {
keyboard {
xkb {
}
repeat-delay 500
repeat-rate 30
// track-layout "window"
}
touchpad {
tap
// dwt
// dwtp
natural-scroll
accel-speed 0.4
// click-method "clickfinger"
// accel-profile "flat"
// tap-button-map "left-middle-right"
}
mouse {
// natural-scroll
// accel-speed -1.0
// accel-profile "flat"
}
tablet {
// map-to-output "eDP-1"
// map-to-output "HDMI-A-1"
}
// disable-power-key-handling
// warp-mouse-to-focus
// focus-follows-mouse
// workspace-auto-back-and-forth
}
output "winit" {
// scale 2.0
// scale 3.0
// transform "flipped-90"
position x=100 y=200
}
output "DP-1" {
// off
scale 1.0
// transform "90"
position x=0 y=0
// mode "1920x1200"
mode "2560x1440@170.001"
// mode "1280x1024"
// mode "1280x720"
// mode "640x480"
// variable-refresh-rate
}
layout {
focus-ring {
off
width 2
// catppuccin-mocha Sapphire
active-color "#74c7ec"
// catppuccin-mocha Surface2
inactive-color "#585b70"
// active-gradient from="#80c8ff" to="#bbddff" angle=45
}
border {
// off
width 2
// width 128
// active-color "#f38ba8"
// inactive-color "#585b70"
active-gradient from="#f38ba8" to="#f9e2af" angle=45 relative-to="workspace-view"
inactive-gradient from="#585b70" to="#7f849c" angle=45 relative-to="workspace-view"
// inactive-gradient from="green" to="lightblue" angle=45 relative-to="workspace-view"
// active-gradient from="#f00" to="#0f0" angle=90
// active-gradient from="yellow" to="red" angle=45 relative-to="workspace-view"
// inactive-gradient from="yellow" to="red" angle=45
}
preset-column-widths {
proportion 0.3333333333333333
proportion 0.5
proportion 0.66667
// proportion 0.25
// fixed 1000
}
default-column-width { proportion 0.3333333333333333; }
// default-column-width { }
gaps 4
struts {
// left 64
// right 64
// top 44
// bottom 64
// top 64
}
// center-focused-column "on-overflow"
// center-focused-column "always"
}
cursor {
// xcursor-theme "breeze_cursors"
// xcursor-theme "arstieonart"
// xcursor-size 48
}
prefer-no-csd
// spawn-at-startup "alacritty" "-e" "fish"
environment {
// GSK_RENDERER "cairo"
// WAYLAND_DISPLAY null
}
// screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png"
spawn-at-startup "sh" "-c" "exec swaybg -i ~/Pictures/Wallpapers/raspberry.png -m fill"
spawn-at-startup "waybar"
hotkey-overlay {
// skip-at-startup
}
animations {
// off
// slowdown 10.0
// slowdown 4.0
// slowdown 2.0
// slowdown 1.5
workspace-switch {
// off
// duration-ms 2500
// curve "ease-out-cubic"
// spring damping-ratio=1.0 stiffness=1000 epsilon=0.0001
}
window-open {
// off
// duration-ms 2500
// curve "ease-out-expo"
// spring damping-ratio=0.8 stiffness=1000 epsilon=0.0001
}
window-close {
// off
// duration-ms 2500
// curve "ease-out-cubic"
// spring damping-ratio=0.8 stiffness=1000 epsilon=0.0001
}
horizontal-view-movement {
// off
// duration-ms 500
// curve "ease-out-cubic"
// spring damping-ratio=1.0 stiffness=20 epsilon=0.00001
// spring damping-ratio=10.0 stiffness=800 epsilon=0.0001
}
window-movement {
// off
// duration-ms 750
// curve "ease-out-cubic"
// spring damping-ratio=1.0 stiffness=20 epsilon=0.00001
// spring damping-ratio=0.2 stiffness=800 epsilon=0.0001
}
window-resize {
// off
// duration-ms 500
// duration-ms 2500
// curve "ease-out-cubic"
// spring damping-ratio=0.2 stiffness=800 epsilon=0.0001
custom-shader r"
vec4 resize_color(vec3 coords_curr_geo, vec3 size_curr_geo) {
vec3 coords_next_geo = niri_curr_geo_to_next_geo * coords_curr_geo;
vec3 coords_prev_geo = niri_curr_geo_to_prev_geo * coords_curr_geo;
vec3 coords_crop = niri_geo_to_tex_next * coords_next_geo;
vec3 coords_stretch = niri_geo_to_tex_next * coords_curr_geo;
vec3 coords_stretch_prev = niri_geo_to_tex_prev * coords_curr_geo;
// We can crop if the current window size is smaller than the next window
// size. One way to tell is by comparing to 1.0 the X and Y scaling
// coefficients in the current-to-next transformation matrix.
bool can_crop_by_x = niri_curr_geo_to_next_geo[0][0] <= 1.0;
bool can_crop_by_y = niri_curr_geo_to_next_geo[1][1] <= 1.0;
bool crop = can_crop_by_x && can_crop_by_y;
vec4 color;
if (crop) {
// However, when we crop, we also want to crop out anything outside the
// current geometry. This is because the area of the shader is unspecified
// and usually bigger than the current geometry, so if we don't fill pixels
// outside with transparency, the texture will leak out.
//
// When stretching, this is not an issue because the area outside will
// correspond to client-side decoration shadows, which are already supposed
// to be outside.
if (coords_curr_geo.x < 0.0 || 1.0 < coords_curr_geo.x ||
coords_curr_geo.y < 0.0 || 1.0 < coords_curr_geo.y) {
color = vec4(0.0);
} else {
color = texture2D(niri_tex_next, coords_crop.st);
}
} else {
// If we can't crop, then crossfade.
color = texture2D(niri_tex_next, coords_stretch.st);
vec4 color_prev = texture2D(niri_tex_prev, coords_stretch_prev.st);
color = mix(color_prev, color, niri_clamped_progress);
}
return color;
}
"
}
config-notification-open-close {
// off
// duration-ms 250
// curve "ease-out-cubic"
// spring damping-ratio=0.1 stiffness=1000 epsilon=0.001
}
}
window-rule {
// match app-id="Alacritty"
// match app-id="Adwaita"
// opacity 0.9
// opacity 0.5
// opacity 0.98
// open-on-output "eDP-1"
// default-column-width { proportion 0.5; }
// default-column-width { fixed 400; }
// default-column-width {}
// open-maximized true
// open-fullscreen true
// block-out-from "screencast"
// min-width 400
// max-width 400
// min-height 400
// max-height 400
focus-ring {
// on
// active-gradient from="red" to="green"
// active-color "lightgreen"
// width 1
}
border {
// off
// on
// width 12
// width 0
// active-color "#ff808080"
// active-color "red"
}
// draw-border-with-background true
// draw-border-with-background false
// geometry-corner-radius 12 24 32 64
// geometry-corner-radius 999
// geometry-corner-radius 1
geometry-corner-radius 6
clip-to-geometry true
}
/-window-rule {
match app-id="Adwaita"
// opacity 0.5
block-out-from "screencast"
geometry-corner-radius 12
clip-to-geometry false
border {
// off
width 12
}
}
/-window-rule {
match app-id="terminal"
clip-to-geometry false
geometry-corner-radius 8 8 0 0
border {
// width 4
}
}
/-window-rule {
match app-id="code"
// opacity 0.98
border {
// off
}
}
/-window-rule {
match app-id="weston."
// block-out-from "screencast"
geometry-corner-radius 12 24 32 64
// geometry-corner-radius 999
clip-to-geometry true
}
// window-rule {
// match app-id="Alacritty"
// geometry-corner-radius 12 12 0 0
// border {
// width 2
// }
// }
window-rule {
match title="simple-egl"
// min-width 128
// max-width 128
// min-height 128
// max-height 128
// match is-focused=true
// match is-active=false
// opacity 0.9
// block-out-from "screencast"
// block-out-from "screen-capture"
// min-width 1000
draw-border-with-background false
// match app-id="mpv"
// open-on-output "HDMI-A-1"
// open-maximized true
// default-column-width { proportion 0.5; }
// open-fullscreen false
}
window-rule {
match title="khal-popup"
open-floating true
default-floating-position x=0 y=0 relative-to="top-right"
default-column-width { fixed 600; }
default-window-height { fixed 400; }
}
window-rule {
match is-active=false
// opacity 0.95
}
window-rule {
match app-id=r#"^org\.telegram\.desktop$"# title="^Media viewer$"
open-fullscreen false
default-column-width { proportion 0.5; }
}
window-rule {
match app-id=r#"^org\.wezfurlong\.wezterm$"#
match app-id="^mpv$"
default-column-width {}
}
// Qt used by OBS doesn't signal min size yet, so do it manually.
window-rule {
match app-id=r#"^com\.obsproject\.Studio$"#
min-width 876
}
window-rule {
match app-id="^blender$"
match app-id="^gimp"
default-column-width { fixed 1200; }
}
window-rule {
match app-id="^obsidian$"
default-column-width { fixed 1000; }
}
window-rule {
match app-id=r#"^org\.mozilla\.firefox$"#
match app-id=r#"^org\.telegram\.desktop$"#
exclude app-id=r#"^org\.telegram\.desktop$"# title="^Media viewer$"
open-on-output "DP-1"
}
window-rule {
match app-id=r#"^org\.mozilla\.firefox$"#
default-column-width { proportion 0.66667; }
}
window-rule {
match app-id=r#"^org\.keepassxc\.KeePassXC$"#
match app-id=r#"^org\.gnome\.World\.Secrets$"#
match app-id=r#"^org\.telegram\.desktop$"#
// Doesn't quite work: Firefox changes the title one frame early.
match app-id=r#"^org\.mozilla\.firefox$"# title="- Gmail "
match app-id=r#"^org\.mozilla\.firefox$"# title="^Google Calendar "
match app-id=r#"^org\.mozilla\.firefox$"# title="Todoist "
match app-id=r#"^org\.mozilla\.firefox$"# title=r#"^GNOME( \*)? \| "#
match app-id=r#"^org\.mozilla\.firefox$"# title=r#"^Element "#
match app-id=r#"^org\.mozilla\.firefox$"# title=r#"Discord \| "#
block-out-from "screencast"
// block-out-from "screen-capture"
border {
// active-color "red"
}
}
binds {
Mod+Shift+Slash { show-hotkey-overlay; }
Mod+Shift+C { spawn "sh" "-c" "env DISPLAY=:0 xsel -ob | wl-copy"; }
Mod+Shift+V { spawn "sh" "-c" "wl-paste -n | env DISPLAY=:0 xsel -ib"; }
// Mod+T { spawn "sh" "-c" "alacritty msg create-window -e fish -C t || alacritty -e fish -C t"; }
Mod+T { spawn "sh" "-c" "alacritty msg create-window || alacritty"; }
Mod+Shift+T { spawn "alacritty"; }
// Mod+Shift+T { spawn "sh" "-c" "alacritty msg create-window || alacritty"; }
// Mod+Return { spawn "~/arst"; }
// Mod+T { spawn "flatpak" "run" "org.gnome.Ptyxis.Devel" "-s"; }
// Mod+T { spawn "~/.local/bin/spawn-ptyxis.sh"; }
// Mod+T { spawn "bash" "-c" "notify-send hello && exec alacritty"; }
// Mod+T { spawn "kgx" "-e" "fish -C t"; }
Mod+D { spawn "fuzzel"; }
Mod+H { spawn "nautilus"; }
Super+Alt+L allow-when-locked=true { spawn "swaylock"; }
Mod+W { spawn "sh" "-c" "mpv --pause \"$(wl-paste)\""; }
// refresh.sh was a local Bazzite helper; keep these disabled until a Fedora helper exists.
// Super+Alt+H { spawn "refresh.sh" "144"; }
// Super+Alt+Comma { spawn "refresh.sh" "120"; }
XF86AudioRaiseVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+"; }
XF86AudioLowerVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-"; }
XF86AudioMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; }
XF86AudioMicMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; }
Mod+Q { close-window; }
Mod+BackSpace { close-window; }
Mod+M { focus-column-left; }
Mod+N { focus-window-down; }
Mod+E { focus-window-up; }
Mod+I { focus-column-right; }
Mod+Left { focus-column-left; }
Mod+Down { focus-window-down; }
Mod+Up { focus-window-up; }
Mod+Right { focus-column-right; }
Mod+Ctrl+M { move-column-left; }
Mod+Ctrl+N { move-window-down; }
Mod+Ctrl+E { move-window-up; }
Mod+Ctrl+I { move-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+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+M { focus-monitor-left; }
Mod+Shift+N { focus-monitor-down; }
Mod+Shift+E { focus-monitor-up; }
Mod+Shift+I { focus-monitor-right; }
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+Ctrl+M { move-column-to-monitor-left; }
Mod+Shift+Ctrl+N { move-column-to-monitor-down; }
Mod+Shift+Ctrl+E { move-column-to-monitor-up; }
Mod+Shift+Ctrl+I { move-column-to-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+Alt+M { move-workspace-to-monitor-left; }
Mod+Shift+Alt+N { move-workspace-to-monitor-down; }
Mod+Shift+Alt+E { move-workspace-to-monitor-up; }
Mod+Shift+Alt+I { move-workspace-to-monitor-right; }
Mod+Shift+Alt+Left { move-workspace-to-monitor-left; }
Mod+Shift+Alt+Down { move-workspace-to-monitor-down; }
Mod+Shift+Alt+Up { move-workspace-to-monitor-up; }
Mod+Shift+Alt+Right { move-workspace-to-monitor-right; }
Mod+L { focus-workspace-down; }
Mod+U { focus-workspace-up; }
Mod+Page_Down { focus-workspace-down; }
Mod+Page_Up { focus-workspace-up; }
Mod+Ctrl+L { move-column-to-workspace-down; }
Mod+Ctrl+U { move-column-to-workspace-up; }
Mod+Ctrl+Page_Down { move-column-to-workspace-down; }
Mod+Ctrl+Page_Up { move-column-to-workspace-up; }
Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }
Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; }
Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }
Mod+Ctrl+WheelScrollUp cooldown-ms=150 { 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+TouchpadScrollUp allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02-"; }
Mod+TouchpadScrollDown allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02+"; }
// Mod+TouchpadScrollLeft { focus-column-left; }
// Mod+TouchpadScrollRight { focus-column-right; }
Mod+Shift+L { move-workspace-down; }
Mod+Shift+U { move-workspace-up; }
Mod+Shift+Page_Down { move-workspace-down; }
Mod+Shift+Page_Up { 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; }
// Mod+Tab { focus-workspace-previous; }
Mod+Comma { consume-window-into-column; }
Mod+Period { expel-window-from-column; }
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; }
Mod+Minus { set-column-width "-10%"; }
Mod+Equal { set-column-width "+10%"; }
Mod+Ctrl+Minus { set-column-width "-1"; }
Mod+Ctrl+Equal { set-column-width "+1"; }
Mod+Shift+Minus { set-window-height "-10%"; }
Mod+Shift+Equal { set-window-height "+10%"; }
Mod+Shift+Ctrl+Minus { set-window-height "-1"; }
Mod+Shift+Ctrl+Equal { set-window-height "+1"; }
Mod+0 { set-column-width "960"; }
Mod+Shift+0 { set-window-height "540"; }
Mod+Alt+0 { set-column-width "1280"; }
Mod+Shift+Alt+0 { set-window-height "720"; }
Mod+Ctrl+0 { set-column-width "1920"; }
Mod+Shift+Ctrl+0 { set-window-height "1080"; }
Mod+Space { switch-layout "next"; }
Mod+Shift+Space { switch-layout "prev"; }
Print { screenshot; }
Ctrl+Print { screenshot-screen; }
Alt+Print { screenshot-window; }
Mod+P { screenshot; }
Mod+Shift+Y { quit; }
Mod+Shift+P { power-off-monitors; }
Mod+Shift+Ctrl+T { toggle-debug-tint; }
Mod+Shift+Ctrl+O { debug-toggle-opaque-regions; }
Mod+Shift+Ctrl+D { debug-toggle-damage; }
}