feat(niri): split config into modules and port hyprlua keybinds

Split monolithic config.kdl into modules/ (input, outputs, layout,
animations, environment, autostart, window-rules, binds), mirroring
the hyprlua modular structure.

Keybind additions and fixes:
- Port all missing hyprlua binds (Mod+0, mouse drag/resize, Mod+Ctrl+M,
  Mod+Shift+Return→overview, Mod+Shift+Alt group move aliases)
- Enforce modifier semantics: Shift=move window, Ctrl=workspace,
  Alt=resize across all directional keys
- Add Mod+Ctrl+J/K/Down/Up → focus-workspace-down/up
- Add Mod+Ctrl+Shift+J/K/Down/Up → move-column-to-workspace-down/up
- Fix Mod+Ctrl+K/Up (was toggle-overview, now focus-workspace-up)
- Fix Mod+Ctrl+Shift+Up (was move-to-recent, now move-to-workspace-up)
- Relocate toggle-overview to Mod+Ctrl+Space
- Remove Mod+Shift+Alt+* aliases (violated Alt=resize rule)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
main
Amir Alexander Abdelbaki 2026-06-03 10:25:19 +02:00
parent 814080cc04
commit 0fcb9fb193
9 changed files with 438 additions and 414 deletions

View File

@ -1,421 +1,15 @@
// ~/.config/niri/config.kdl // ~/.config/niri/config.kdl
// Niri scrollable-tiling Wayland compositor — CyberQueer config // Niri scrollable-tiling Wayland compositor — CyberQueer config
// Translated from hyprlua setup: https://github.com/the_miro/Dotfiles
// https://github.com/YaLTeR/niri/wiki/Configuration:-Overview // https://github.com/YaLTeR/niri/wiki/Configuration:-Overview
// ── Input ───────────────────────────────────────────────────────────────────── include "modules/input.kdl"
input { include "modules/outputs.kdl"
keyboard { include "modules/layout.kdl"
xkb { include "modules/animations.kdl"
layout "de" include "modules/environment.kdl"
options "caps:swapescape" include "modules/autostart.kdl"
} include "modules/window-rules.kdl"
repeat-delay 300 include "modules/binds.kdl"
repeat-rate 50
track-layout "window"
}
touchpad {
tap
natural-scroll
accel-speed 0.0
accel-profile "flat"
}
mouse {
left-handed
accel-speed 0.0
accel-profile "flat"
}
warp-mouse-to-focus
focus-follows-mouse max-scroll-amount="0%"
}
// ── Outputs ───────────────────────────────────────────────────────────────────
// Niri auto-detects monitors. Uncomment and adjust for fixed setups:
// output "eDP-1" {
// scale 2.0
// position x=0 y=0
// }
// output "HDMI-A-1" {
// scale 1.0
// position x=1920 y=0
// }
// ── Layout ────────────────────────────────────────────────────────────────────
layout {
gaps 6
center-focused-column "never"
// Preset widths cycled by Mod+Backspace
preset-column-widths {
proportion 0.333
proportion 0.5
proportion 0.667
proportion 1.0
}
default-column-width { proportion 0.5; }
// CyberQueer focus ring
focus-ring {
width 4
active-color "#E40046"
inactive-color "#5018DD"
active-gradient from="#E40046" to="#f50505" angle=35 relative-to="window"
inactive-gradient from="#5018DD" to="#5018DD" angle=35 relative-to="window"
}
border {
off
}
shadow {
on
softness 30
spread 5
offset x=0 y=5
color "#00000080"
}
// Reserve space for the eww bar
struts {
top 30
}
}
// ── Animations ────────────────────────────────────────────────────────────────
animations {
window-open {
spring damping-ratio=0.9 stiffness=800 epsilon=0.0001
}
window-close {
spring damping-ratio=0.9 stiffness=800 epsilon=0.0001
}
window-movement {
spring damping-ratio=0.9 stiffness=800 epsilon=0.0001
}
horizontal-view-movement {
spring damping-ratio=0.9 stiffness=800 epsilon=0.0001
}
workspace-switch {
spring damping-ratio=0.9 stiffness=800 epsilon=0.0001
}
config-notification-open-close {
spring damping-ratio=0.9 stiffness=800 epsilon=0.0001
}
screenshot-ui-open {
duration-ms 200
curve "ease-out-cubic"
}
}
// ── Environment Variables ─────────────────────────────────────────────────────
environment {
GTK_THEME "cyberqueer"
XCURSOR_SIZE "40"
XCURSOR_THEME "Nordzy-cursors-lefthand"
QT_QPA_PLATFORMTHEME "gtk3"
QT_WAYLAND_DISABLE_WINDOWDECORATION "1"
MOZ_ENABLE_WAYLAND "1"
ELECTRON_OZONE_PLATFORM_HINT "auto"
NIXOS_OZONE_WL "1"
GDK_SCALE "2"
}
// ── Cursor ────────────────────────────────────────────────────────────────────
cursor {
xcursor-theme "Nordzy-cursors-lefthand"
xcursor-size 40
hide-after-inactive-ms 5000
hide-when-typing
}
// ── Prefer no client-side decorations ─────────────────────────────────────────
prefer-no-csd prefer-no-csd
// ── Screenshot path ───────────────────────────────────────────────────────────
screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png" screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png"
// ── Autostart ─────────────────────────────────────────────────────────────────
spawn-at-startup "bash" "-c" "~/.config/scripts/monitorhandler.sh"
spawn-at-startup "bash" "-c" "vicinae server"
spawn-at-startup "bash" "-c" "~/.config/scripts/bluetooth-applet.sh"
spawn-at-startup "bash" "-c" "~/.config/scripts/ulwatchdog.sh"
spawn-at-startup "udiskie" "-t" "-m" "nested" "-n"
spawn-at-startup "xfce-polkit"
spawn-at-startup "bash" "-c" "gammastep -O 4500"
spawn-at-startup "nm-applet"
spawn-at-startup "dunst"
spawn-at-startup "bash" "-c" "swayidle -w timeout 300 'swaylock -f' timeout 600 'systemctl suspend' before-sleep 'swaylock -f'"
spawn-at-startup "blueman-applet"
// ── Window Rules ──────────────────────────────────────────────────────────────
// Launcher / utility floating windows
window-rule {
match app-id=r"^ulauncher$"
open-floating true
}
window-rule {
match app-id=r"^vicinae$"
open-floating true
}
window-rule {
match app-id=r"^org\.gnome\.Calculator$"
open-floating true
default-column-width { fixed 400; }
}
window-rule {
match app-id=r"^qalculate-gtk$"
open-floating true
default-column-width { fixed 600; }
}
// Mixer — top-right float (approximating tag+mixer behavior)
window-rule {
match app-id=r"^pavucontrol$"
open-floating true
default-column-width { fixed 800; }
}
window-rule {
match app-id=r"^nm-connection-editor$"
open-floating true
default-column-width { fixed 800; }
}
window-rule {
match app-id=r"^blueman-manager$"
open-floating true
default-column-width { fixed 700; }
}
// File manager dialogs
window-rule {
match app-id=r"^thunar$" title=r"^(Copy|Move|Rename|Delete|Progress)"
open-floating true
}
window-rule {
match app-id=r"^xfce4-terminal$"
open-floating true
default-column-width { fixed 900; }
}
// Global window dimming — all windows at 85% opacity by default
window-rule {
opacity 0.85
}
// Firefox — no transparency
window-rule {
match app-id=r"^firefox$"
opacity 1.0
}
window-rule {
match app-id=r"^zen$"
opacity 1.0
}
// Screen sharing / video — exclude from dimming
window-rule {
match app-id=r"^vesktop$"
opacity 1.0
}
// ── Keybindings ───────────────────────────────────────────────────────────────
binds {
// ── Applications ──────────────────────────────────────────────────────────
Mod+T { spawn "kitty"; }
Mod+Shift+T { spawn "bash" "-c" "cool-retro-term -p ~/Dotfiles/desktopenvs/niri/CRT"; }
Mod+M { spawn "bash" "-c" "kitty -e nvim"; }
Mod+E { spawn "thunar"; }
Mod+Alt+E { spawn "pcmanfm-qt"; }
Mod+X { spawn "bash" "-c" "wofi --show=run"; }
Mod+N { spawn "nextcloud"; }
Mod+I { spawn "bash" "-c" "iwmenu --launcher walker"; }
Mod+Alt+I { spawn "bash" "-c" "bzmenu --launcher walker"; }
Mod+Shift+I { spawn "nm-connection-editor"; }
Mod+R { spawn "bash" "-c" "vicinae toggle"; }
Mod+Return { spawn "bash" "-c" "vicinae toggle"; }
Mod+Shift+R { spawn "bash" "-c" "wofi --show drun"; }
Ctrl+Shift+R { spawn "bash" "-c" "vicinae toggle"; }
Mod+F { spawn "bash" "-c" "~/.config/scripts/wofi-file-search.sh"; }
Mod+Shift+F { spawn "bash" "-c" "~/.config/scripts/foldersearch.sh"; }
Mod+Alt+F { spawn "wofi-calc"; }
Mod+S { spawn "pavucontrol"; }
Mod+U { spawn "bash" "-c" "kitty -e btop"; }
Mod+W { spawn "bash" "-c" "kitty -e ~/.config/scripts/wallpaper-picker ~/Pictures"; }
Mod+Ctrl+R { spawn "bash" "-c" "kitty -e ~/.config/scripts/amssh"; }
Mod+F1 { spawn "bash" "-c" "kitty -e ~/.config/scripts/helpmenu.sh"; }
Mod+Ctrl+T { spawn "bash" "-c" "kitty -e ~/.config/scripts/timer-pick"; }
// Edit niri config directly:
Mod+Shift+F1 { spawn "bash" "-c" "kitty -e nvim ~/.config/niri/config.kdl"; }
Mod+Ctrl+P { spawn "bash" "-c" "~/.config/scripts/screenrec.sh"; }
// App drawer
Mod+D { spawn "bash" "-c" "~/.config/scripts/drawer.sh"; }
Mod+Shift+A { spawn "bash" "-c" "~/.config/scripts/drawer.sh"; }
// ── Screenshots ───────────────────────────────────────────────────────────
Print { screenshot; }
Mod+P { screenshot; }
Mod+Shift+P { screenshot-screen; }
// Mod+Ctrl+P is screenrec (defined above)
// ── Window Management ─────────────────────────────────────────────────────
Mod+Q { close-window; }
Mod+Shift+Q { close-window; }
Mod+V { toggle-window-floating; }
Mod+Shift+V { center-column; }
Mod+C { center-column; }
// ── Niri-native layout actions ─────────────────────────────────────────────
Mod+Backspace { switch-preset-column-width; }
Mod+Shift+Backspace { maximize-column; }
Mod+Ctrl+Backspace { fullscreen-window; }
// Consume/expel from column (Niri's grouping analog)
Mod+A { consume-window-into-column; }
Mod+Y { expel-window-from-column; }
Mod+Alt+C { consume-or-expel-window-left; }
Mod+Alt+V { consume-or-expel-window-right; }
// ── Focus ─────────────────────────────────────────────────────────────────
Mod+H { focus-column-left; }
Mod+L { focus-column-right; }
Mod+J { focus-window-down; }
Mod+K { focus-window-up; }
Mod+Left { focus-column-left; }
Mod+Right { focus-column-right; }
Mod+Down { focus-window-down; }
Mod+Up { focus-window-up; }
Mod+Tab { focus-window-down-or-column-right; }
Mod+Shift+Tab { focus-window-up-or-column-left; }
// ── Move Window ───────────────────────────────────────────────────────────
Mod+Shift+H { move-column-left; }
Mod+Shift+L { move-column-right; }
Mod+Shift+J { move-window-down; }
Mod+Shift+K { move-window-up; }
Mod+Shift+Left { move-column-left; }
Mod+Shift+Right { move-column-right; }
Mod+Shift+Down { move-window-down; }
Mod+Shift+Up { move-window-up; }
// ── Resize ────────────────────────────────────────────────────────────────
Mod+Alt+L { set-column-width "+10%"; }
Mod+Alt+H { set-column-width "-10%"; }
Mod+Alt+K { set-window-height "-10%"; }
Mod+Alt+J { set-window-height "+10%"; }
Mod+Alt+Right { set-column-width "+10%"; }
Mod+Alt+Left { set-column-width "-10%"; }
Mod+Alt+Up { set-window-height "-10%"; }
Mod+Alt+Down { set-window-height "+10%"; }
// ── Workspaces ────────────────────────────────────────────────────────────
// Note: Niri workspaces are vertical (stacked top-to-bottom per output)
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-column-to-workspace 1; }
Mod+Shift+2 { move-column-to-workspace 2; }
Mod+Shift+3 { move-column-to-workspace 3; }
Mod+Shift+4 { move-column-to-workspace 4; }
Mod+Shift+5 { move-column-to-workspace 5; }
Mod+Shift+6 { move-column-to-workspace 6; }
Mod+Shift+7 { move-column-to-workspace 7; }
Mod+Shift+8 { move-column-to-workspace 8; }
Mod+Shift+9 { move-column-to-workspace 9; }
// Relative workspace navigation (Ctrl+L/R → down/up in vertical stack)
Mod+Ctrl+Right { focus-workspace-down; }
Mod+Ctrl+Left { focus-workspace-up; }
Mod+Ctrl+L { focus-workspace-down; }
Mod+Ctrl+H { focus-workspace-up; }
Mod+Ctrl+Shift+Right { move-column-to-workspace-down; }
Mod+Ctrl+Shift+Left { move-column-to-workspace-up; }
Mod+Ctrl+Shift+L { move-column-to-workspace-down; }
Mod+Ctrl+Shift+H { move-column-to-workspace-up; }
// Scroll workspaces
Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }
Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; }
Mod+Shift+WheelScrollDown { move-column-to-workspace-down; }
Mod+Shift+WheelScrollUp { move-column-to-workspace-up; }
// Horizontal scroll → horizontal column navigation
Mod+WheelScrollRight { focus-column-right; }
Mod+WheelScrollLeft { focus-column-left; }
// Volume keys as workspace nav (when Mod held)
Mod+XF86AudioRaiseVolume { focus-workspace-down; }
Mod+XF86AudioLowerVolume { focus-workspace-up; }
Mod+Shift+XF86AudioRaiseVolume { move-column-to-workspace-down; }
Mod+Shift+XF86AudioLowerVolume { move-column-to-workspace-up; }
// Scratchpad-equivalent: focus the most recently visited workspace
Mod+Space { focus-workspace-with-recent-window; }
Mod+Shift+Space { move-column-to-workspace-with-recent-window; }
// ── Bar / UI ──────────────────────────────────────────────────────────────
Mod+Z { spawn "bash" "-c" "~/.config/scripts/togglebar.sh"; }
Mod+Ctrl+B { spawn "bash" "-c" "eww reload"; }
// ── Audio ─────────────────────────────────────────────────────────────────
XF86AudioRaiseVolume allow-when-locked=true { spawn "wpctl" "set-volume" "-l" "1.4" "@DEFAULT_AUDIO_SINK@" "5%+"; }
XF86AudioLowerVolume allow-when-locked=true { spawn "wpctl" "set-volume" "-l" "1.4" "@DEFAULT_AUDIO_SINK@" "5%-"; }
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"; }
XF86AudioPlay allow-when-locked=true { spawn "playerctl" "play-pause" "-p" "spotify,vlc"; }
// ── Brightness ────────────────────────────────────────────────────────────
XF86MonBrightnessUp allow-when-locked=true { spawn "bri" "--up"; }
XF86MonBrightnessDown allow-when-locked=true { spawn "bri" "--down"; }
// ── Color temperature (gammastep presets) ─────────────────────────────────
Mod+Ctrl+X { spawn "bash" "-c" "killall gammastep; gammastep -O 6500"; } // neutral / reset
Mod+Ctrl+W { spawn "bash" "-c" "killall gammastep; gammastep -O 5000"; } // warm
Mod+Ctrl+A { spawn "bash" "-c" "killall gammastep; gammastep -O 4000"; } // warmer
Mod+Ctrl+Q { spawn "bash" "-c" "killall gammastep; gammastep -O 3000"; } // very warm
Mod+Ctrl+S { spawn "bash" "-c" "killall gammastep; gammastep -O 2700"; } // night mode
// ── Misc ──────────────────────────────────────────────────────────────────
Mod+Ctrl+I { spawn "chamel" "toggle"; }
Mod+Ctrl+U { spawn "chamel" "clear"; }
Mod+Ctrl+Z { spawn "chamel" "clear-and-deactivate"; }
Mod+Ctrl+C { spawn "dunstctl" "close-all"; }
Mod+Ctrl+G { spawn "bash" "-c" "~/.config/scripts/onscreenkb.sh"; }
Mod+Shift+C { spawn "bash" "-c" "~/.config/scripts/caffeine.sh"; }
Mod+Shift+X { spawn "bash" "-c" "~/.config/scripts/niri-toggle-touchpad.sh"; }
Mod+Ctrl+E { spawn "bash" "-c" "~/.config/scripts/screenrotationwcw.sh"; }
Mod+Ctrl+D { spawn "bash" "-c" "~/.config/scripts/screenrotationacw.sh"; }
// ── Lock / Exit ───────────────────────────────────────────────────────────
Mod+O { spawn "swaylock" "-f"; }
Mod+Shift+O { quit; }
Mod+Ctrl+O { spawn "systemctl" "poweroff"; }
Mod+Alt+O { spawn "bash" "-c" "~/.config/scripts/pwr-dmenu.sh"; }
Mod+Alt+Ctrl+Shift+End { quit; }
}

View File

@ -0,0 +1,25 @@
// ── Animations ────────────────────────────────────────────────────────────────
animations {
window-open {
spring damping-ratio=0.9 stiffness=800 epsilon=0.0001
}
window-close {
spring damping-ratio=0.9 stiffness=800 epsilon=0.0001
}
window-movement {
spring damping-ratio=0.9 stiffness=800 epsilon=0.0001
}
horizontal-view-movement {
spring damping-ratio=0.9 stiffness=800 epsilon=0.0001
}
workspace-switch {
spring damping-ratio=0.9 stiffness=800 epsilon=0.0001
}
config-notification-open-close {
spring damping-ratio=0.9 stiffness=800 epsilon=0.0001
}
screenshot-ui-open {
duration-ms 200
curve "ease-out-cubic"
}
}

View File

@ -0,0 +1,12 @@
// ── Autostart ─────────────────────────────────────────────────────────────────
spawn-at-startup "bash" "-c" "~/.config/scripts/monitorhandler.sh"
spawn-at-startup "bash" "-c" "vicinae server"
spawn-at-startup "bash" "-c" "~/.config/scripts/bluetooth-applet.sh"
spawn-at-startup "bash" "-c" "~/.config/scripts/ulwatchdog.sh"
spawn-at-startup "udiskie" "-t" "-m" "nested" "-n"
spawn-at-startup "xfce-polkit"
spawn-at-startup "bash" "-c" "gammastep -O 4500"
spawn-at-startup "nm-applet"
spawn-at-startup "dunst"
spawn-at-startup "bash" "-c" "swayidle -w timeout 300 'swaylock -f' timeout 600 'systemctl suspend' before-sleep 'swaylock -f'"
spawn-at-startup "blueman-applet"

View File

@ -0,0 +1,218 @@
// ── Keybindings ───────────────────────────────────────────────────────────────
//
// Modifier semantics (directional keys):
// Mod + dir → focus (window or column)
// Mod + Shift + dir → move selected window/column
// Mod + Ctrl + dir → navigate workspaces
// Mod + Ctrl+Shift + dir → move window to workspace
// Mod + Alt + dir → resize (column width / window height)
//
binds {
// ── Applications ──────────────────────────────────────────────────────────
Mod+T { spawn "kitty"; }
Mod+Shift+T { spawn "bash" "-c" "cool-retro-term -p ~/Dotfiles/desktopenvs/niri/CRT"; }
Mod+M { spawn "bash" "-c" "kitty -e nvim"; }
Mod+E { spawn "thunar"; }
Mod+Alt+E { spawn "pcmanfm-qt"; }
Mod+X { spawn "bash" "-c" "wofi --show=run"; }
Mod+N { spawn "nextcloud"; }
Mod+I { spawn "bash" "-c" "iwmenu --launcher walker"; }
Mod+Alt+I { spawn "bash" "-c" "bzmenu --launcher walker"; }
Mod+Shift+I { spawn "nm-connection-editor"; }
Mod+R { spawn "bash" "-c" "vicinae toggle"; }
Mod+Return { spawn "bash" "-c" "vicinae toggle"; }
Mod+Shift+R { spawn "bash" "-c" "wofi --show drun"; }
Ctrl+Shift+R { spawn "bash" "-c" "vicinae toggle"; }
Mod+F { spawn "bash" "-c" "~/.config/scripts/wofi-file-search.sh"; }
Mod+Shift+F { spawn "bash" "-c" "~/.config/scripts/foldersearch.sh"; }
Mod+Alt+F { spawn "wofi-calc"; }
Mod+S { spawn "pavucontrol"; }
Mod+U { spawn "bash" "-c" "kitty -e btop"; }
Mod+W { spawn "bash" "-c" "kitty -e ~/.config/scripts/wallpaper-picker ~/Pictures"; }
Mod+Ctrl+R { spawn "bash" "-c" "kitty -e ~/.config/scripts/amssh"; }
Mod+F1 { spawn "bash" "-c" "kitty -e ~/.config/scripts/helpmenu.sh"; }
Mod+Ctrl+T { spawn "bash" "-c" "kitty -e ~/.config/scripts/timer-pick"; }
Mod+Shift+F1 { spawn "bash" "-c" "kitty -e nvim ~/.config/niri/config.kdl"; }
Mod+Ctrl+P { spawn "bash" "-c" "~/.config/scripts/screenrec.sh"; }
// App drawer
Mod+D { spawn "bash" "-c" "~/.config/scripts/drawer.sh"; }
Mod+Shift+A { spawn "bash" "-c" "~/.config/scripts/drawer.sh"; }
// ── Screenshots ───────────────────────────────────────────────────────────
Print { screenshot; }
Mod+P { screenshot; }
Mod+Shift+P { screenshot-screen; }
// ── Window Management ─────────────────────────────────────────────────────
Mod+Q { close-window; }
Mod+Shift+Q { close-window; }
Mod+V { toggle-window-floating; }
Mod+Shift+V { center-column; }
Mod+C { center-column; }
Mod+Ctrl+M { switch-layout "next"; }
// ── Niri layout actions ───────────────────────────────────────────────────
Mod+Backspace { switch-preset-column-width; }
Mod+Shift+Backspace { maximize-column; }
Mod+Ctrl+Backspace { fullscreen-window; }
// Consume/expel from column (hyprlua group analog)
Mod+A { consume-window-into-column; }
Mod+Y { expel-window-from-column; }
Mod+Alt+C { consume-or-expel-window-left; }
Mod+Alt+V { consume-or-expel-window-right; }
// ── Focus ─────────────────────────────────────────────────────────────────
Mod+H { focus-column-left; }
Mod+L { focus-column-right; }
Mod+J { focus-window-down; }
Mod+K { focus-window-up; }
Mod+Left { focus-column-left; }
Mod+Right { focus-column-right; }
Mod+Down { focus-window-down; }
Mod+Up { focus-window-up; }
Mod+Tab { focus-window-down-or-column-right; }
Mod+Shift+Tab { focus-window-up-or-column-left; }
Mod+Shift+Return { toggle-overview; }
// ── Move Window ───────────────────────────────────────────────────────────
Mod+Shift+H { move-column-left; }
Mod+Shift+L { move-column-right; }
Mod+Shift+J { move-window-down; }
Mod+Shift+K { move-window-up; }
Mod+Shift+Left { move-column-left; }
Mod+Shift+Right { move-column-right; }
Mod+Shift+Down { move-window-down; }
Mod+Shift+Up { move-window-up; }
// Mouse drag / resize
Mod+Button272 { move-window-with-pointer; }
Mod+Button273 { resize-window-with-pointer; }
Mod+Shift+Button272 { resize-window-with-pointer; }
// ── Resize ────────────────────────────────────────────────────────────────
Mod+Alt+L { set-column-width "+10%"; }
Mod+Alt+H { set-column-width "-10%"; }
Mod+Alt+K { set-window-height "-10%"; }
Mod+Alt+J { set-window-height "+10%"; }
Mod+Alt+Right { set-column-width "+10%"; }
Mod+Alt+Left { set-column-width "-10%"; }
Mod+Alt+Up { set-window-height "-10%"; }
Mod+Alt+Down { set-window-height "+10%"; }
// ── Workspaces — direct ───────────────────────────────────────────────────
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+0 { focus-workspace 10; }
Mod+Shift+1 { move-column-to-workspace 1; }
Mod+Shift+2 { move-column-to-workspace 2; }
Mod+Shift+3 { move-column-to-workspace 3; }
Mod+Shift+4 { move-column-to-workspace 4; }
Mod+Shift+5 { move-column-to-workspace 5; }
Mod+Shift+6 { move-column-to-workspace 6; }
Mod+Shift+7 { move-column-to-workspace 7; }
Mod+Shift+8 { move-column-to-workspace 8; }
Mod+Shift+9 { move-column-to-workspace 9; }
Mod+Shift+0 { move-column-to-workspace 10; }
// ── Workspaces — relative navigation (Ctrl + direction) ──────────────────
// J/K and Down/Up are the canonical vertical workspace nav
Mod+Ctrl+J { focus-workspace-down; }
Mod+Ctrl+K { focus-workspace-up; }
Mod+Ctrl+Down { focus-workspace-down; }
Mod+Ctrl+Up { focus-workspace-up; }
// H/L and Left/Right mirror the above for horizontal-habit users
Mod+Ctrl+L { focus-workspace-down; }
Mod+Ctrl+H { focus-workspace-up; }
Mod+Ctrl+Right { focus-workspace-down; }
Mod+Ctrl+Left { focus-workspace-up; }
// ── Workspaces — move window (Ctrl+Shift + direction) ────────────────────
Mod+Ctrl+Shift+J { move-column-to-workspace-down; }
Mod+Ctrl+Shift+K { move-column-to-workspace-up; }
Mod+Ctrl+Shift+Down { move-column-to-workspace-down; }
Mod+Ctrl+Shift+Up { move-column-to-workspace-up; }
Mod+Ctrl+Shift+L { move-column-to-workspace-down; }
Mod+Ctrl+Shift+H { move-column-to-workspace-up; }
Mod+Ctrl+Shift+Right { move-column-to-workspace-down; }
Mod+Ctrl+Shift+Left { move-column-to-workspace-up; }
// Scroll workspaces
Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }
Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; }
Mod+Shift+WheelScrollDown { move-column-to-workspace-down; }
Mod+Shift+WheelScrollUp { move-column-to-workspace-up; }
// Horizontal scroll → column navigation
Mod+WheelScrollRight { focus-column-right; }
Mod+WheelScrollLeft { focus-column-left; }
// Volume keys as workspace nav
Mod+XF86AudioRaiseVolume { focus-workspace-down; }
Mod+XF86AudioLowerVolume { focus-workspace-up; }
Mod+Shift+XF86AudioRaiseVolume { move-column-to-workspace-down; }
Mod+Shift+XF86AudioLowerVolume { move-column-to-workspace-up; }
// ── Overview / scratchpad analog ──────────────────────────────────────────
Mod+Space { focus-workspace-with-recent-window; }
Mod+Shift+Space { move-column-to-workspace-with-recent-window; }
Mod+Ctrl+Space { toggle-overview; }
Mod+XF86AudioMute { toggle-overview; }
Mod+Shift+XF86AudioMute { move-column-to-workspace-with-recent-window; }
// ── Bar / UI ──────────────────────────────────────────────────────────────
Mod+Z { spawn "bash" "-c" "~/.config/scripts/togglebar.sh"; }
Mod+Ctrl+B { spawn "bash" "-c" "eww reload"; }
// ── Audio ─────────────────────────────────────────────────────────────────
XF86AudioRaiseVolume allow-when-locked=true { spawn "wpctl" "set-volume" "-l" "1.4" "@DEFAULT_AUDIO_SINK@" "5%+"; }
XF86AudioLowerVolume allow-when-locked=true { spawn "wpctl" "set-volume" "-l" "1.4" "@DEFAULT_AUDIO_SINK@" "5%-"; }
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"; }
XF86AudioPlay allow-when-locked=true { spawn "playerctl" "play-pause" "-p" "spotify,vlc"; }
// ── Brightness ────────────────────────────────────────────────────────────
XF86MonBrightnessUp allow-when-locked=true { spawn "bri" "--up"; }
XF86MonBrightnessDown allow-when-locked=true { spawn "bri" "--down"; }
// ── Color temperature (gammastep presets) ─────────────────────────────────
Mod+Ctrl+X { spawn "bash" "-c" "killall gammastep; gammastep -O 6500"; }
Mod+Ctrl+W { spawn "bash" "-c" "killall gammastep; gammastep -O 5000"; }
Mod+Ctrl+A { spawn "bash" "-c" "killall gammastep; gammastep -O 4000"; }
Mod+Ctrl+Q { spawn "bash" "-c" "killall gammastep; gammastep -O 3000"; }
Mod+Ctrl+S { spawn "bash" "-c" "killall gammastep; gammastep -O 2700"; }
// ── Misc ──────────────────────────────────────────────────────────────────
Mod+Ctrl+I { spawn "chamel" "toggle"; }
Mod+Ctrl+U { spawn "chamel" "clear"; }
Mod+Ctrl+Z { spawn "chamel" "clear-and-deactivate"; }
Mod+Ctrl+C { spawn "dunstctl" "close-all"; }
Mod+Ctrl+G { spawn "bash" "-c" "~/.config/scripts/onscreenkb.sh"; }
Mod+Shift+C { spawn "bash" "-c" "~/.config/scripts/caffeine.sh"; }
Mod+Shift+X { spawn "bash" "-c" "~/.config/scripts/niri-toggle-touchpad.sh"; }
Mod+Ctrl+E { spawn "bash" "-c" "~/.config/scripts/screenrotationwcw.sh"; }
Mod+Ctrl+D { spawn "bash" "-c" "~/.config/scripts/screenrotationacw.sh"; }
// ── Lock / Exit ───────────────────────────────────────────────────────────
Mod+O { spawn "swaylock" "-f"; }
Mod+Shift+O { quit; }
Mod+Ctrl+O { spawn "systemctl" "poweroff"; }
Mod+Alt+O { spawn "bash" "-c" "~/.config/scripts/pwr-dmenu.sh"; }
Mod+Alt+Ctrl+Shift+End { quit; }
}

View File

@ -0,0 +1,20 @@
// ── Environment Variables ─────────────────────────────────────────────────────
environment {
GTK_THEME "cyberqueer"
XCURSOR_SIZE "40"
XCURSOR_THEME "Nordzy-cursors-lefthand"
QT_QPA_PLATFORMTHEME "gtk3"
QT_WAYLAND_DISABLE_WINDOWDECORATION "1"
MOZ_ENABLE_WAYLAND "1"
ELECTRON_OZONE_PLATFORM_HINT "auto"
NIXOS_OZONE_WL "1"
GDK_SCALE "2"
}
// ── Cursor ────────────────────────────────────────────────────────────────────
cursor {
xcursor-theme "Nordzy-cursors-lefthand"
xcursor-size 40
hide-after-inactive-ms 5000
hide-when-typing
}

View File

@ -0,0 +1,28 @@
// ── Input ─────────────────────────────────────────────────────────────────────
input {
keyboard {
xkb {
layout "de"
options "caps:swapescape"
}
repeat-delay 300
repeat-rate 50
track-layout "window"
}
touchpad {
tap
natural-scroll
accel-speed 0.0
accel-profile "flat"
}
mouse {
left-handed
accel-speed 0.0
accel-profile "flat"
}
warp-mouse-to-focus
focus-follows-mouse max-scroll-amount="0%"
}

View File

@ -0,0 +1,42 @@
// ── Layout ────────────────────────────────────────────────────────────────────
layout {
gaps 6
center-focused-column "never"
// Preset widths cycled by Mod+Backspace
preset-column-widths {
proportion 0.333
proportion 0.5
proportion 0.667
proportion 1.0
}
default-column-width { proportion 0.5; }
// CyberQueer focus ring
focus-ring {
width 4
active-color "#E40046"
inactive-color "#5018DD"
active-gradient from="#E40046" to="#f50505" angle=35 relative-to="window"
inactive-gradient from="#5018DD" to="#5018DD" angle=35 relative-to="window"
}
border {
off
}
shadow {
on
softness 30
spread 5
offset x=0 y=5
color "#00000080"
}
// Reserve space for the eww bar
struts {
top 30
}
}

View File

@ -0,0 +1,10 @@
// ── Outputs ───────────────────────────────────────────────────────────────────
// Niri auto-detects monitors. Uncomment and adjust for fixed setups:
// output "eDP-1" {
// scale 2.0
// position x=0 y=0
// }
// output "HDMI-A-1" {
// scale 1.0
// position x=1920 y=0
// }

View File

@ -0,0 +1,75 @@
// ── Window Rules ──────────────────────────────────────────────────────────────
// Launcher / utility floating windows
window-rule {
match app-id=r"^ulauncher$"
open-floating true
}
window-rule {
match app-id=r"^vicinae$"
open-floating true
}
window-rule {
match app-id=r"^org\.gnome\.Calculator$"
open-floating true
default-column-width { fixed 400; }
}
window-rule {
match app-id=r"^qalculate-gtk$"
open-floating true
default-column-width { fixed 600; }
}
window-rule {
match app-id=r"^pavucontrol$"
open-floating true
default-column-width { fixed 800; }
}
window-rule {
match app-id=r"^nm-connection-editor$"
open-floating true
default-column-width { fixed 800; }
}
window-rule {
match app-id=r"^blueman-manager$"
open-floating true
default-column-width { fixed 700; }
}
// File manager dialogs
window-rule {
match app-id=r"^thunar$" title=r"^(Copy|Move|Rename|Delete|Progress)"
open-floating true
}
window-rule {
match app-id=r"^xfce4-terminal$"
open-floating true
default-column-width { fixed 900; }
}
// Global window dimming — all windows at 85% opacity by default
window-rule {
opacity 0.85
}
// No transparency for browser / media apps
window-rule {
match app-id=r"^firefox$"
opacity 1.0
}
window-rule {
match app-id=r"^zen$"
opacity 1.0
}
window-rule {
match app-id=r"^vesktop$"
opacity 1.0
}