{pkgs, ...}: let terminal = "${pkgs.foot}/bin/footclient"; nautilus = "${pkgs.nautilus}/bin/nautilus"; playerctl = "${pkgs.playerctl}/bin/playerctl"; wpctl = "${pkgs.wireplumber}/bin/wpctl"; brightnessctl = "${pkgs.brightnessctl}/bin/brightnessctl"; terminal-name = "foot"; launch_terminal = pkgs.writeShellScriptBin "launch_terminal" '' function find_leaf_pid(){ local PID local RET local NAME PID=$1 for CHILD_PID in $(pgrep -P "$PID"); do RET=$(find_leaf_pid "$CHILD_PID") if [ "$RET" != "" ]; then PID="$RET" fi done NAME=$(ps -p "$PID" -o comm=) if [ "$NAME" == "zsh" ]; then echo "$PID" elif [ "$NAME" == "ssh" ]; then echo "$PID" fi } LEAF_PID=$(find_leaf_pid "$1") if [ "$(ps -p "$LEAF_PID" -o comm=)" == "ssh" ]; then SSH_COMMAND=$(ps -p "$LEAF_PID" -o args --no-headers) if [[ "$SSH_COMMAND" == *"waypipe"* ]]; then CLIENT=$(echo "$SSH_COMMAND" | awk '{ print $5 }') PREVIOUS_SESSION_ID=$(grep -z "SSH_SESSION_ID" "/proc/$LEAF_PID/environ" | xargs -0 -n 1 | grep -oP "[0-9]*") SSH_SESSION_ID=$RANDOM ${terminal} -e zsh -c "SSH_SESSION_ID=$SSH_SESSION_ID waypipe ssh -t \"$CLIENT\" env SSH_SESSION_ID=\"$SSH_SESSION_ID\" PREVIOUS_SESSION_ID=\"$PREVIOUS_SESSION_ID\" \"zsh --login\"" else ${terminal} -e zsh -c "ssh -t \"$(echo "$SSH_COMMAND" | awk '{ print $2 }')\"" fi else # Not an ssh session if [ "$(ps -p "$1" -o comm=)" == "${terminal-name}" ]; then CWD=$(readlink -e /proc/"$LEAF_PID"/cwd) if [ "$CWD" != "" ]; then ${terminal} --working-directory "$CWD" else ${terminal} fi else ${terminal} fi fi ''; in { # Since native Home Manager doesn't have a programs.niri module yet, # we generate the KDL configuration file directly. services.hyprpaper = { enable = true; settings = { ipc = "off"; splash = false; wallpaper = { path = "${../hyprland/files/wallpaper.png}"; monitor = ""; }; }; }; programs.hyprlock = { enable = true; settings = { input-field = [ { size = "200, 50"; position = "0, -80"; monitor = ""; dots_center = true; fade_on_empty = true; font_color = "rgb(202, 211, 245)"; inner_color = "rgb(91, 96, 120)"; outer_color = "rgb(24, 25, 38)"; outline_thickness = 3; placeholder_text = "Password..."; shadow_passes = 2; } ]; general = { no_fade_in = false; }; background = [ { path = "screenshot"; blur_passes = 3; blur_size = 8; } ]; }; }; xdg.configFile."niri/config.kdl".text = '' spawn-at-startup "${pkgs.hyprpaper}/bin/hyprpaper" spawn-at-startup "foot" "--server" spawn-at-startup "ags" "run" spawn-at-startup "${pkgs.mate-polkit}/bin/polkit-mate" prefer-no-csd hotkey-overlay { skip-at-startup } gestures { hot-corners { off } } layout { gaps 5 border { off } focus-ring { width 4 active-color "rgba(0, 47, 95, 238)" inactive-color "rgba(255, 255, 255, 0)" } } input { touchpad { tap } keyboard { xkb { options "compose:rctrl" } } focus-follows-mouse max-scroll-amount="10%" warp-mouse-to-focus } output "eDP-1" { scale 1.2 } window-rule { match app-id="vicinae" open-floating true } binds { // General Binds Mod+Return { spawn "sh" "-c" "${launch_terminal}/bin/launch_terminal $(niri msg --json focused-window | ${pkgs.jq}/bin/jq .pid)"; } Mod+Shift+Return { spawn "${terminal}"; } Mod+Q { close-window; } Mod+A { spawn "${nautilus}"; } Mod+B { spawn "Helium"; } Mod+M { maximize-column; } Mod+F {maximize-window-to-edges;} Mod+Tab { toggle-overview; } // Vicinae Binds Mod+C { spawn "vicinae" "vicinae://extensions/vicinae/clipboard/history"; } Mod+N { spawn "vicinae" "vicinae://extensions/vicinae/wm/switch-windows"; } Mod+Escape { spawn "vicinae" "open" "-q" "Power Management "; } Mod+Space { spawn "vicinae" "toggle"; } Mod+Comma { consume-or-expel-window-left; } Mod+Period { consume-or-expel-window-right; } Mod+Alt+H { set-column-width "-5%"; } Mod+Alt+L { set-column-width "+5%"; } Mod+Alt+K { set-window-height "-5%"; } Mod+Alt+J { set-window-height "+5%"; } // Movement 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+L { move-column-right; } Mod+Shift+J { move-window-down; } Mod+Shift+K { move-window-up; } // Workspaces Mod+Shift+U { move-column-to-workspace-down; } Mod+Shift+I { move-column-to-workspace-up; } Mod+I { focus-workspace-up; } Mod+U { focus-workspace-down; } 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; } // Move to workspace 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; } Print { screenshot; } Ctrl+Alt+L {spawn "${pkgs.hyprlock}/bin/hyprlock"; } XF86MonBrightnessUp { spawn "${brightnessctl}" "set" "+10%"; } XF86MonBrightnessDown { spawn "${brightnessctl}" "set" "10%-"; } // Volume XF86AudioRaiseVolume { spawn "${wpctl}" "set-volume" "@DEFAULT_AUDIO_SINK@" "10%+" "--limit" "1.0"; } XF86AudioLowerVolume { spawn "${wpctl}" "set-volume" "@DEFAULT_AUDIO_SINK@" "10%-"; } XF86AudioMute { spawn "${wpctl}" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; } XF86AudioMicMute { spawn "${wpctl}" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; } // Media XF86AudioNext { spawn "${playerctl}" "next"; } XF86AudioPrev { spawn "${playerctl}" "previous"; } Mod+XF86AudioMute { spawn "${playerctl}" "play-pause"; } Mod+XF86AudioRaiseVolume { spawn "${playerctl}" "next"; } Mod+XF86AudioLowerVolume { spawn "${playerctl}" "previous"; } } ''; }