summaryrefslogtreecommitdiff
path: root/common/modules/window_managers/niri
diff options
context:
space:
mode:
Diffstat (limited to 'common/modules/window_managers/niri')
-rw-r--r--common/modules/window_managers/niri/default.nix388
1 files changed, 388 insertions, 0 deletions
diff --git a/common/modules/window_managers/niri/default.nix b/common/modules/window_managers/niri/default.nix
new file mode 100644
index 0000000..0306256
--- /dev/null
+++ b/common/modules/window_managers/niri/default.nix
@@ -0,0 +1,388 @@
+{
+ homeManager,
+ inputs,
+ moduleNameSpace,
+ ...
+}:
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+let
+ cfg = config.${moduleNameSpace}.windowManagers;
+ scripts = import ../scripts.nix { inherit pkgs config; };
+ eyecandy = cfg.eyeCandy.enable;
+in
+{
+ config = lib.mkIf cfg.niri.enable (
+ if homeManager then
+ {
+ xdg.configFile."niri/config.kdl".text = ''
+ include optional=true "./noctalia.kdl"
+ workspace "1"
+ workspace "2"
+ workspace "3"
+ workspace "4"
+
+ input {
+ keyboard {
+ xkb {
+ layout "us"
+ }
+
+ repeat-delay 300
+ repeat-rate 50
+ }
+
+ touchpad {
+ tap
+ natural-scroll
+ // accel-speed 0.2
+ // accel-profile "flat"
+ // scroll-method "two-finger"
+ // disabled-on-external-mouse
+ }
+
+ warp-mouse-to-focus
+ focus-follows-mouse max-scroll-amount="0%"
+ }
+
+ output "eDP-1" {
+ mode "1920x1080@120.030"
+ scale 1
+ transform "normal"
+ position x=1280 y=0
+ }
+
+ blur {
+ passes ${if eyecandy then toString cfg.eyeCandy.window.blur.passes else "0"}
+ offset ${if eyecandy then toString cfg.eyeCandy.window.blur.radius else "0"}
+ noise 0.03
+ saturation 1.0
+ }
+
+ layout {
+ gaps 4
+ center-focused-column "never"
+ background-color "transparent"
+
+ preset-column-widths {
+ proportion 0.33333
+ proportion 0.5
+ proportion 0.66667
+ }
+
+ default-column-width { proportion 0.5; }
+
+ preset-window-heights {
+ proportion 0.33333
+ proportion 0.5
+ proportion 0.66667
+ }
+
+ focus-ring {
+ off
+ }
+
+ border {
+ on
+ width 2
+ }
+
+ shadow {
+ off
+ // on
+ softness 30
+ spread 5
+ offset x=0 y=5
+ draw-behind-window true
+ }
+
+ tab-indicator {
+ on
+ hide-when-single-tab
+ place-within-column
+ gap 5
+ width 4
+ length total-proportion=1.0
+ position "right"
+ gaps-between-tabs 2
+ corner-radius 8
+ }
+
+ insert-hint {
+ on
+ }
+ }
+
+ hotkey-overlay {
+ skip-at-startup
+ }
+
+ prefer-no-csd
+ // screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png"
+ screenshot-path null
+
+ animations {
+ on
+ // Slow down all animations by this factor. Values below 1 speed them up instead.
+ // slowdown 3.0
+ }
+
+ gestures {
+ hot-corners {
+ off
+ }
+ }
+
+ window-rule {
+ match title="^Kdenlive$"
+ open-floating true
+ open-on-workspace "3"
+ }
+
+ window-rule {
+ match app-id=r#"^(firefox|librewolf)$"#
+ open-on-workspace "1"
+ }
+
+ window-rule {
+ match app-id=r#"^(foot|alacritty|ghotty|kitty)$"#
+ open-on-workspace "2"
+ }
+
+ window-rule {
+ match app-id=r#"^(vesktop|mpv|.*Kdenlive.*)$"#
+ open-on-workspace "3"
+ }
+
+ binds {
+ Mod+Shift+Slash { show-hotkey-overlay; }
+
+ Mod+Return hotkey-overlay-title="Open a Terminal: ${config.beeMods.terminal.default}" { spawn "${config.beeMods.terminal.default}"; }
+
+ ${lib.optionalString (config.beeMods.matugen.enable && cfg.beeConfig.enable && !cfg.noctalia) ''
+ Mod+A hotkey-overlay-title="Run an Application" { spawn-sh "rofi -show drun"; }
+ Mod+Y hotkey-overlay-title="Open wallpaper picker" { spawn-sh "${scripts.dostuff} wall"; }
+ Mod+Comma hotkey-overlay-title="Open Noctalia settings" { spawn-sh "${scripts.dostuff} settings"; }
+
+ XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "${scripts.volume} up"; }
+ XF86AudioLowerVolume allow-when-locked=true { spawn-sh "${scripts.volume} down"; }
+ XF86AudioMute allow-when-locked=true { spawn-sh "${scripts.volume} toggle"; }
+ XF86AudioMicMute allow-when-locked=true { spawn-sh "${scripts.micToggle}"; }
+
+ XF86MonBrightnessUp allow-when-locked=true { spawn-sh "${scripts.volume} up 0.02"; }
+ XF86MonBrightnessDown allow-when-locked=true { spawn-sh "{scripts.volume} down 0.02"; }
+
+ XF86MonBrightnessUp allow-when-locked=true { spawn-sh "${scripts.brightness} up"; }
+ XF86MonBrightnessDown allow-when-locked=true { spawn-sh "${scripts.brightness} down"; }
+ ''}
+
+ ${lib.optionalString (!cfg.beeConfig.enable && cfg.noctalia) ''
+ Mod+A hotkey-overlay-title="Run an Application" { spawn-sh "noctalia msg panel-toggle launcher"; }
+ Mod+Y hotkey-overlay-title="Open wallpaper picker" { spawn-sh "noctalia msg panel-toggle wallpaper"; }
+ Mod+V hotkey-overlay-title="Open clipboard panel" { spawn-sh "noctalia msg panel-toggle clipboard"; }
+ Mod+Comma hotkey-overlay-title="Open Noctalia settings" { spawn-sh "noctalia msg settings-toggle"; }
+ Mod+S { spawn-sh "noctalia msg panel-toggle control-center"; }
+
+
+ XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "noctalia msg volume-up"; }
+ XF86AudioLowerVolume allow-when-locked=true { spawn-sh "noctalia msg volume-down"; }
+ XF86AudioMute allow-when-locked=true { spawn-sh "noctalia msg volume-mute"; }
+ XF86AudioMicMute allow-when-locked=true { spawn-sh "noctalia msg mic-mute"; }
+
+ Mod+TouchpadScrollDown { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02+"; }
+ Mod+TouchpadScrollUp { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02-"; }
+
+ XF86MonBrightnessUp allow-when-locked=true { spawn-sh "noctalia msg volume-up 0.02"; }
+ XF86MonBrightnessDown allow-when-locked=true { spawn-sh "noctalia msg volume-down 0.02"; }
+ ''}
+
+ Mod+Shift+C hotkey-overlay-title="Get current dat and time as noticiation" { spawn-sh "fyi Clock $(date)"; }
+ XF86AudioPlay allow-when-locked=true { spawn-sh "playerctl play-pause"; }
+ XF86AudioStop allow-when-locked=true { spawn-sh "playerctl stop"; }
+ XF86AudioPrev allow-when-locked=true { spawn-sh "playerctl previous"; }
+ XF86AudioNext allow-when-locked=true { spawn-sh "playerctl next"; }
+
+
+ Mod+O repeat=false { toggle-overview; }
+
+ Mod+Q repeat=false { 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; }
+
+ 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; }
+
+ 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+WheelScrollRight { focus-column-right; }
+ Mod+WheelScrollLeft { focus-column-left; }
+ Mod+Ctrl+WheelScrollRight { move-column-right; }
+ Mod+Ctrl+WheelScrollLeft { move-column-left; }
+
+ // Usually scrolling up and down with Shift in applications results in
+ // horizontal scrolling; these binds replicate that.
+ 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+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; }
+
+ Mod+BracketLeft { consume-or-expel-window-left; }
+ Mod+BracketRight { consume-or-expel-window-right; }
+
+ Mod+Shift+BracketLeft { consume-window-into-column; }
+ Mod+Shift+BracketRight { 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+D { maximize-column; }
+ Mod+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+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%"; }
+
+ Mod+Space { toggle-window-floating; }
+ Mod+Shift+Space { switch-focus-between-floating-and-tiling; }
+
+ Mod+W { toggle-column-tabbed-display; }
+
+ // 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+Shift+N { switch-layout "next"; }
+ Mod+Shift+P { switch-layout "prev"; }
+
+ Print { screenshot-screen; }
+ Mod+Print { screenshot; }
+ Mod+Shift+Print { screenshot-window; }
+
+ // 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; }
+
+ Mod+Shift+E { quit; }
+ Ctrl+Alt+Delete { quit; }
+
+ // Mod+Shift+P { power-off-monitors; }
+ }
+ '';
+ }
+ else
+ {
+ programs.niri = {
+ enable = true;
+ useNautilus = true;
+ };
+ }
+ );
+}