dots/configs/niri/config.kdl
2025-10-30 16:45:07 -03:00

490 lines
14 KiB
Text

// ╭─────────────────────────────────────────────────────────╮
// │ Windows Rules │
// ╰─────────────────────────────────────────────────────────╯
window-rule {
// This regular expression is intentionally made as specific as possible,
// since this is the default config, and we want no false positives.
// You can get away with just app-id="wezterm" if you want.
match app-id="^org\\.wezfurlong\\.wezterm$"
default-column-width {
}
}
// Floatin Windows
window-rule {
match app-id="firefox$" title="^Picture-in-Picture$"
match app-id="^brave-.*-Default$"
// Extensions popup open-floating true
}
window-rule {
match app-id="^org\\.keepassxc\\.KeePassXC$"
match app-id="^org\\.gnome\\.World\\.Secrets$"
// block-out-from "screen-capture"
// Use this instead if you want them visible on third-party screenshot tools.
block-out-from "screencast"
}
window-rule {
match app-id="brave-browser"
match at-startup=true
default-column-width {
proportion 0.75
}
}
window-rule {
match title="^Meet: .*" app-id="brave-browser"
open-floating true
}
window-rule {
geometry-corner-radius 4
clip-to-geometry true
}
// ╭─────────────────────────────────────────────────────────╮
// │ Auto Start Apps │
// ╰─────────────────────────────────────────────────────────╯
spawn-at-startup "/usr/lib/pam_kwallet_init"
spawn-at-startup "udieskie"
spawn-at-startup "brave"
// To run a shell command (with variables, pipes, etc.), use spawn-sh-at-startup:
// spawn-sh-at-startup "qs -c ~/source/qs/MyAwesomeShell"
// ╭─────────────────────────────────────────────────────────╮
// │ System Config │
// ╰─────────────────────────────────────────────────────────╯
// ── Layout Config ───────────────────────────────────────────────────
layout {
gaps 10
always-center-single-column
center-focused-column "never"
preset-column-widths {
// The default preset widths are 1/3, 1/2 and 2/3 of the output.
proportion 0.33333
proportion 0.5
proportion 0.66667
}
preset-window-heights {
}
default-column-width {
proportion 0.5
}
focus-ring {
// Uncomment this line to disable the focus ring.
// off
// How many logical pixels the ring extends out from the windows.
width 2
active-color "#7fc8ff"
inactive-color "#505050"
}
}
// ── Keybindings ─────────────────────────────────────────────────────
binds {
Mod+Shift+Slash {
show-hotkey-overlay
}
Mod+Return hotkey-overlay-title="Open a Terminal: kitty" {
spawn "kitty"
}
Mod+D hotkey-overlay-title="Run an Application: Rofi" {
spawn "rofi" "-show" "drun" "-run-command" "uwsm app -- {cmd}"
}
XF86AudioRaiseVolume allow-when-locked=true {
spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+"
}
XF86AudioLowerVolume allow-when-locked=true {
spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-"
}
XF86AudioMute allow-when-locked=true {
spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
}
XF86AudioMicMute allow-when-locked=true {
spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"
}
XF86MonBrightnessUp allow-when-locked=true {
spawn "brightnessctl" "--class=backlight" "set" "+10%"
}
XF86MonBrightnessDown allow-when-locked=true {
spawn "brightnessctl" "--class=backlight" "set" "10%-"
}
// Open/close the Overview: a zoomed-out view of workspaces and windows.
// You can also move the mouse into the top-left hot corner,
// or do a four-finger swipe up on a touchpad.
Mod+A repeat=false {
toggle-overview
}
Mod+Shift+Q repeat=false {
close-window
}
Mod+Tab {
focus-column-right-or-first
}
Mod+shift+Tab {
focus-column-left-or-last
}
Mod+Left {
focus-column-left
}
Mod+Down {
focus-window-or-workspace-down
}
Mod+Up {
focus-window-or-workspace-up
}
Mod+Right {
focus-column-right
}
Mod+H {
focus-column-left
}
Mod+J {
focus-window-or-workspace-down
}
Mod+K {
focus-window-or-workspace-up
}
Mod+L {
focus-column-right
}
Mod+Shift+Left {
move-column-left
}
Mod+Shift+Down {
move-window-down-or-to-workspace-down
}
Mod+Shift+Up {
move-window-up-or-to-workspace-up
}
Mod+Shift+Right {
move-column-right
}
Mod+Shift+H {
move-column-left
}
Mod+Shift+J {
move-window-down-or-to-workspace-down
}
Mod+Shift+K {
move-window-up-or-to-workspace-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
}
Mod+WheelScrollDown cooldown-ms=150 {
focus-column-right
}
Mod+WheelScrollUp cooldown-ms=150 {
focus-column-left
}
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 cooldown-ms=150 {
focus-workspace-down
}
Mod+Shift+WheelScrollUp cooldown-ms=150 {
focus-workspace-up
}
Mod+Ctrl+Shift+WheelScrollDown {
move-column-right
}
Mod+Ctrl+Shift+WheelScrollUp {
move-column-left
}
// Similarly, you can bind touchpad scroll "ticks".
// Touchpad scrolling is continuous, so for these binds it is split into
// discrete intervals.
// These binds are also affected by touchpad's natural-scroll, so these
// example binds are "inverted", since we have natural-scroll enabled for
// touchpads by default.
// Mod+TouchpadScrollDown { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02+"; }
// Mod+TouchpadScrollUp { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02-"; }
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+Shift+1 {
move-window-to-workspace 1
}
Mod+Shift+2 {
move-window-to-workspace 2
}
Mod+Shift+3 {
move-window-to-workspace 3
}
Mod+Shift+4 {
move-window-to-workspace 4
}
Mod+Shift+5 {
move-window-to-workspace 5
}
Mod+Shift+6 {
move-window-to-workspace 6
}
Mod+Shift+7 {
move-window-to-workspace 7
}
Mod+Shift+8 {
move-window-to-workspace 8
}
Mod+Shift+9 {
move-window-to-workspace 9
}
// Switches focus between the current and the previous workspace.
Mod+Bar {
focus-workspace-previous
}
// The following binds move the focused window in and out of a column.
// If the window is alone, they will consume it into the nearby column to the side.
// If the window is already in a column, they will expel it out.
Mod+BraceLeft {
consume-or-expel-window-left
}
Mod+BraceRight {
consume-or-expel-window-right
}
// Consume one window from the right to the bottom of the focused column.
Mod+Comma {
consume-window-into-column
}
// Expel the bottom window from the focused column to the right.
Mod+Period {
expel-window-from-column
}
Mod+R {
switch-preset-column-width
}
// Cycling through the presets in reverse order is also possible.
// Mod+R { switch-preset-column-width-back; }
Mod+Shift+R {
switch-preset-window-height
}
Mod+Ctrl+R {
reset-window-height
}
Mod+F {
maximize-column
}
Mod+Shift+F {
fullscreen-window
}
// Expand the focused column to space not taken up by other fully visible columns.
// Makes the column "fill the rest of the space".
Mod+Ctrl+F {
expand-column-to-available-width
}
Mod+C {
center-column
}
// Center all fully visible columns on screen.
Mod+Ctrl+C {
center-visible-columns
}
// 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+Plus {
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%"
}
// Move the focused window between the floating and the tiling layout.
Mod+Shift+Space {
toggle-window-floating
}
Mod+Space {
switch-focus-between-floating-and-tiling
}
// Toggle tabbed column display mode.
// Windows in this column will appear as vertical tabs,
// rather than stacked on top of each other.
Mod+W {
toggle-column-tabbed-display
}
Print {
screenshot
}
Shift+Print {
screenshot-window
}
Shift+Ctrl+Print hotkey-overlay-title="Edit image in Clipboard" {
spawn-sh "wl-paste | swappy -f -"
}
// Applications such as remote-desktop clients and software KVM switches may
// request that niri stops processing the keyboard shortcuts defined here
// so they may, for example, forward the key presses as-is to a remote machine.
// It's a good idea to bind an escape hatch to toggle the inhibitor,
// so a buggy application can't hold your session hostage.
//
// The allow-inhibiting=false property can be applied to other binds as well,
// which ensures niri always processes them, even when an inhibitor is active.
Mod+Escape allow-inhibiting=false {
toggle-keyboard-shortcuts-inhibit
}
// The quit action will show a confirmation dialog to avoid accidental exits.
Mod+Shift+E {
quit
}
Ctrl+Alt+Delete {
quit
}
}
// ── Environment Variables ───────────────────────────────────────────
environment {
QT_STYLE_OVERRIDE "kvantum"
QT_AUTO_SCREEN_SCALE_FACTOR "1"
QT_QPA_PLATFORM "wayland;xcb"
QT_WAYLAND_DISABLE_WINDOWDECORATION "1"
QT_QPA_PLATFORMTHEME "qt5ct"
MOZ_ENABLE_WAYLAND "1"
XCURSOR_SIZE "24"
GTK_THEME "catppuccin-macchiato-teal-standard-default"
SSH_AUTH_SOCK "$XDG_RUNTIME_DIR/rbw/ssh-agent-socket"
EDITOR "nvim"
VISUAL "nvim"
TERMINAL "/usr/bin/kitty"
}
// ── Display Options ─────────────────────────────────────────────────
output "eDP-1" {
off
}
output "HDMI-A-1" {
scale 1
mode "3440x1440"
}
output "DP-1" {
variable-refresh-rate on-demand=true
}
// ── Input Options ───────────────────────────────────────────────────
input {
keyboard {
xkb {
layout "latam"
options "caps:escape"
}
// Enable numlock on startup, omitting this setting disables it.
numlock
}
// Next sections include libinput settings.
// Omitting settings disables them, or leaves them at their default values.
// All commented-out settings here are examples, not defaults.
touchpad {
// off
tap
// dwt
// dwtp
// drag false
// drag-lock
natural-scroll
// accel-speed 0.2
// accel-profile "flat"
// scroll-method "two-finger"
// disabled-on-external-mouse
}
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
// scroll-button-lock
// middle-emulation
}
// warp-mouse-to-focus
focus-follows-mouse
}
// ── Animations ──────────────────────────────────────────────────────
animations {
// Uncomment to turn off all animations.
// off
// Slow down all animations by this factor. Values below 1 speed them up instead.
// slowdown 3.0
}
// ── Misc ────────────────────────────────────────────────────────────
cursor {
xcursor-theme "catppuccin-macchiato-lavender-cursors"
xcursor-size 24
}
hotkey-overlay {
skip-at-startup
}
// 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 client-side rounded corners.
// This option will also fix border/focus ring drawing behind some semitransparent windows.
// After enabling or disabling this, you need to restart the apps for this to take effect.
// prefer-no-csd
screenshot-path null