diff --git a/stow/.config/niri/config.kdl b/stow/.config/niri/config.kdl new file mode 100644 index 0000000..4a81481 --- /dev/null +++ b/stow/.config/niri/config.kdl @@ -0,0 +1,316 @@ +// +// Startup +// + +spawn-at-startup "swww-daemon" +spawn-at-startup "waybar" +spawn-at-startup "swaync" +spawn-at-startup "walker --gapplication-service" + +spawn-at-startup "opensnitch-ui" +spawn-at-startup "steam -silent" +spawn-at-startup "xwayland-satellite" + +// +// Environment +// + +environment { + DISPLAY ":0" +} + +// +// Display +// + +output "eDP-1" { + // Disable output + // off + + // Resolution and, optionally, refresh rate of the output. + // The format is "x" or "x@". + // If the refresh rate is omitted, niri will pick the highest refresh rate + // for the resolution. + // If the mode is omitted altogether or is invalid, niri will pick one automatically. + // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes. + mode "1920x1080@60" + + // You can use integer or fractional scale, for example use 1.5 for 150% scale. + scale 1 + + // Transform allows to rotate the output counter-clockwise, valid values are: + // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270. + transform "normal" + + // Position of the output in the global coordinate space. + position x=1280 y=0 +} + +// Inputs + +input { + keyboard { + xkb { + // You can set rules, model, layout, variant and options. + // For more information, see xkeyboard-config(7). + options "caps:super" + } + } + + touchpad { + // off + tap + dwt // disable trackpad when typing + disabled-on-external-mouse + natural-scroll + // dwtp + // drag-lock + // accel-speed 0.2 + // accel-profile "flat" + // scroll-method "two-finger" + } + + mouse { + // off + // natural-scroll + // accel-speed 0.2 + // accel-profile "flat" + // scroll-method "no-scroll" + } + + trackpoint { + // off + // natural-scroll + // accel-speed 0.2 + // accel-profile "flat" + // scroll-method "on-button-down" + // scroll-button 273 + // middle-emulation + } +} + +// +// Decorations +// + +// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout +layout { + // Set gaps around windows in logical pixels. + gaps 16 + + // When to center a column when changing focus, options are: + // - "never", default behavior, focusing an off-screen column will keep at the left + // or right edge of the screen. + // - "always", the focused column will always be centered. + // - "on-overflow", focusing a column will center it if it doesn't fit + // together with the previously focused column. + center-focused-column "never" + + // You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between. + preset-column-widths { + // Proportion sets the width as a fraction of the output width, taking gaps into account. + proportion 0.33333 + proportion 0.5 + proportion 0.66667 + proportion 0.8 + } + + // You can change the default width of the new windows. + default-column-width { proportion 0.5; } + // If you leave the brackets empty, the windows themselves will decide their initial width. + // default-column-width {} + + focus-ring { + // Window borders + + // off + // How many logical pixels the ring extends out from the windows. + width 2 + + // Colors can be set in a variety of ways: + // - CSS named colors: "red" + // - RGB hex: "#rgb", "#rgba", "#rrggbb", "#rrggbbaa" + // - CSS-like notation: "rgb(255, 127, 0)", rgba(), hsl() and a few others. + + active-color "#7fc8ff" + inactive-color "#505050" + // active-gradient from="#80c8ff" to="#bbddff" angle=45 + } + + // Struts shrink the area occupied by windows, similarly to layer-shell panels. + // You can think of them as a kind of outer gaps. They are set in logical pixels. + // Left and right struts will cause the next window to the side to always be visible. + // Top and bottom struts will simply add outer gaps in addition to the area occupied by + // layer-shell panels and regular gaps. + struts { + left 8 + right 8 + // top 64 + // bottom 64 + } +} + + +animations { + // Slow down all animations by this factor. Values below 1 speed them up instead. + // slowdown 3.0 + // off +} + +// If the client will specifically ask for CSD, the request will be honored. +// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners. +// This option will also fix border/focus ring drawing behind some semitransparent windows. +prefer-no-csd + +// Rounded Corners +window-rule { + geometry-corner-radius 12 + clip-to-geometry true +} + +// +// Window Rules +// + +window-rule { + // Open Firefox picture-in-picture as floating + match app-id=r#"firefox$"# title="^Picture-in-Picture$" + open-floating true +} + +window-rule { + // Blockout password managers from screen capture + match app-id=r#"^org\.keepassxc\.KeePassXC$"# + match app-id=r#"^org\.gnome\.World\.Secrets$"# + + block-out-from "screen-capture" +} + +// +// "Static" Workspaces +// +workspace "a" +workspace "b" +workspace "c" +workspace "d" +workspace "e" +workspace "f" +workspace "g" +workspace "h" + +// +// Binds +// + +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. + + // Essential keys + Super+Q { spawn "ghostty"; } + Super+D { spawn "walker"; } + Super+B { spawn "firefox"; } + Super+V { spawn "~/.config/hypr/hyprlock.sh"; } + Super+W { close-window; } + + // Volume Keys + XF86AudioRaiseVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "2%+"; } + XF86AudioLowerVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "2%-"; } + 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"; } + + // Brightness Keys + XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "s" "+2%"; } + XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "s" "2%-"; } + + // Window Management + Mod+H { focus-column-left; } + Mod+J { focus-window-down; } + Mod+K { focus-window-up; } + Mod+L { focus-column-right; } + 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+Home { focus-column-first; } + Mod+End { focus-column-last; } + Mod+Ctrl+Home { move-column-to-first; } + Mod+Ctrl+End { move-column-to-last; } + + // Workspaces + Mod+1 { focus-workspace "a"; } + Mod+2 { focus-workspace "b"; } + Mod+3 { focus-workspace "c"; } + Mod+4 { focus-workspace "d"; } + Mod+5 { focus-workspace "e"; } + Mod+6 { focus-workspace "f"; } + Mod+7 { focus-workspace "g"; } + Mod+8 { focus-workspace "h"; } + Mod+9 { focus-workspace 1; } + Mod+Shift+1 { move-window-to-workspace "a"; } + Mod+Shift+2 { move-window-to-workspace "b"; } + Mod+Shift+3 { move-window-to-workspace "c"; } + Mod+Shift+4 { move-window-to-workspace "d"; } + Mod+Shift+5 { move-window-to-workspace "e"; } + Mod+Shift+6 { move-window-to-workspace "f"; } + Mod+Shift+7 { move-window-to-workspace "g"; } + Mod+Shift+8 { move-window-to-workspace "h"; } + Mod+Shift+9 { move-window-to-workspace 9; } + + // Move Focus between workspaces sequentially + Mod+Shift+U { move-workspace-down; } + Mod+Shift+I { move-workspace-up; } + + // Switches focus between the current and the previous workspace. + Mod+Tab { focus-workspace-previous; } + + // Sizing + Mod+R { switch-preset-column-width; } + Mod+Shift+R { switch-preset-window-height; } + Mod+Ctrl+R { reset-window-height; } + Mod+F { maximize-column; } + Mod+Shift+F { fullscreen-window; } + Mod+Ctrl+F { expand-column-to-available-width; } + Mod+C { center-column; } + + // Sizing + Mod+BracketLeft { consume-or-expel-window-left; } + Mod+BracketRight { consume-or-expel-window-right; } + Super+C { consume-or-expel-window-right; } + Mod+Comma { consume-window-into-column; } + Mod+Period { expel-window-from-column; } + + // Finer width adjustments. + 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%"; } + + // Screenshots + Super+S { screenshot; } + Print { screenshot; } + Ctrl+Print { screenshot-screen; } + Alt+Print { screenshot-window; } + + // Toggling Floating + Mod+Space { toggle-window-floating; } + Mod+Shift+Space { switch-focus-between-floating-and-tiling; } + + // Misc + Mod+M { quit; } // exits niri + Ctrl+Alt+Delete { quit; } + Mod+Shift+P { power-off-monitors; } // turns off monitors until input + Mod+Shift+Slash { show-hotkey-overlay; } // show an overlay of keybinds + Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; } // turn off applications inhibiting/stealing keyboard shortcuts +} + +// +// Misc +// + +// 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 "/tmp/screenshots-niri"