From bdd47c95721376389209f1aa5bfefce4c3487a38 Mon Sep 17 00:00:00 2001 From: Jimbo Date: Sun, 18 Aug 2024 23:42:20 -0400 Subject: [PATCH] Move more things to Nixlang, remove bemenu and Pavucontrol --- PC/configuration.nix | 65 ++-- PC/hardware-configuration.nix | 2 +- PC/jimbo.nix | 663 +++++++++++----------------------- Server/configuration.nix | 67 ++-- 4 files changed, 280 insertions(+), 517 deletions(-) diff --git a/PC/configuration.nix b/PC/configuration.nix index ce024b2..6a68e31 100644 --- a/PC/configuration.nix +++ b/PC/configuration.nix @@ -1,10 +1,9 @@ { config, pkgs, options, lib, ... }: let - # Import home manager, set common boot paramaters - homeManager = fetchTarball - "https://github.com/nix-community/home-manager/archive/release-24.05.tar.gz"; + # Set common boot paramaters commonKernelParams = [ - # Nvidia GSP firmware + # Nvidia settings + "nvidia_drm.fbdev=1" "nouveau.config=NvGspRm=1" # VM/GPU passthrough @@ -18,12 +17,18 @@ let # Isolate devices into IOMMU groups "pcie_acs_override=downstream,multifunction" "pci=routeirq" + + # Provide less context messages + "quiet" ]; in { # Import other nix files and firmware - imports = [ + imports = let + homeManager = fetchTarball + "https://github.com/nix-community/home-manager/archive/release-24.05.tar.gz"; + in [ ./hardware-configuration.nix ./jimbo.nix "${homeManager}/nixos" @@ -34,15 +39,12 @@ in config = { allowUnfree = true; packageOverrides = pkgs: { - unstable = import (builtins.fetchTarball - "https://github.com/NixOS/nixpkgs/archive/nixos-unstable.tar.gz") { - inherit pkgs; - config.allowUnfree = true; - }; - nur = import (builtins.fetchTarball - "https://github.com/nix-community/NUR/archive/master.tar.gz") { - inherit pkgs; - }; + unstable = import (fetchTarball + "https://github.com/NixOS/nixpkgs/archive/nixos-unstable.tar.gz" + ){ inherit pkgs; config.allowUnfree = true; }; + nur = import (fetchTarball + "https://github.com/nix-community/NUR/archive/master.tar.gz" + ){ inherit pkgs; }; }; }; @@ -105,12 +107,13 @@ in # Allow binary firmware hardware.enableRedistributableFirmware = true; - # Enable the Nouveau drivers + # Enable video drivers services.xserver.videoDrivers = [ "nvidia" ]; hardware.nvidia = { modesetting.enable = true; nvidiaSettings = false; package = config.boot.kernelPackages.nvidiaPackages.beta; + open = true; }; # Enable a permissioning system @@ -154,7 +157,7 @@ in shell = pkgs.zsh; }; - # Installed programs to the system profile. + # Install programs system-wide environment.systemPackages = with pkgs; [ # Essential system tools cifs-utils parted git @@ -173,10 +176,9 @@ in info.enable = false; }; - # Enable OpenGL + # Enable graphics hardware.opengl = { enable = true; - driSupport = true; driSupport32Bit = true; extraPackages = with pkgs; [ vulkan-loader @@ -298,11 +300,31 @@ in }; }; }; - extraPortals = [ pkgs.xdg-desktop-portal-gtk ]; + extraPortals = with pkgs; [ xdg-desktop-portal-gtk ]; }; # Configure greetd for remote login - services.greetd = { + services.greetd = let + startSway = pkgs.writeScript "startsway" '' + # Use NVIDIA variables if drivers are in use + if lspci -k | grep "Kernel driver in use: nvidia" &> /dev/null; then + # NVIDIA/AMD variables + export LIBVA_DRIVER_NAME=nvidia + export GBM_BACKEND=nvidia-drm + export __GLX_VENDOR_LIBRARY_NAME=nvidia + export WLR_NO_HARDWARE_CURSORS=1 + else + : + fi + + # Sway/Wayland + export XDG_CURRENT_DESKTOP=sway + export QT_QPA_PLATFORM="wayland;xcb" + + # Start Sway + sway --unsupported-gpu + ''; + in { enable = true; restart = true; settings = { @@ -311,7 +333,7 @@ in switch = true; }; default_session = { - command = "/home/jimbo/.config/sway/start.sh"; + command = "${startSway}"; user = "jimbo"; }; }; @@ -365,7 +387,6 @@ in PrintLastLog = "no"; PasswordAuthentication = false; }; - ports = [ 2211 ]; }; # Block SSH connections after numerous attempts diff --git a/PC/hardware-configuration.nix b/PC/hardware-configuration.nix index 72c6d7e..8d0b206 100644 --- a/PC/hardware-configuration.nix +++ b/PC/hardware-configuration.nix @@ -55,7 +55,7 @@ "/home/jimbo/JimboNFS" = { device = "server:/export/JimboNFS"; fsType = "nfs4"; - options = [ "x-systemd.automount" "_netdev" "noauto" ]; + options = [ "x-systemd.automount" "_netdev" "nofail" "noauto" ]; }; }; diff --git a/PC/jimbo.nix b/PC/jimbo.nix index 7dd2f9d..7eea205 100644 --- a/PC/jimbo.nix +++ b/PC/jimbo.nix @@ -69,46 +69,6 @@ let # Terminal authentication auth = ''doas''; - # Set the default terminal emulator - terminal = ''${pkgs.foot}/bin/foot''; - terminalClass = ''${terminal} -a''; - termPreviewMethod = ''sixel''; - - # Bemenu color options - bemenuOpts = '' - --fn "${mainFont} 13" \ - --tb "#${primeCol}" \ - --hb "#${primeCol}" \ - --nb "#${darkCol}" \ - --ab "#${darkCol}" \ - --fb "#${darkCol}" \ - --tf "#ffffff" \ - --hf "#ffffff" \ - --ignorecase \ - --hp 8 \ - ''; - - # Sway still needs a start script because the sessionconfig doesn't do anything - swayStart = '' - # Use NVIDIA variables if drivers are in use - if lspci -k | grep "Kernel driver in use: nvidia" &> /dev/null; then - # NVIDIA/AMD variables - export LIBVA_DRIVER_NAME=nvidia - export GBM_BACKEND=nvidia-drm - export __GLX_VENDOR_LIBRARY_NAME=nvidia - export WLR_NO_HARDWARE_CURSORS=1 - else - : - fi - - # Sway/Wayland - export XDG_CURRENT_DESKTOP=sway - export QT_QPA_PLATFORM="wayland;xcb" - - # Start Sway - sway --unsupported-gpu - ''; - # Swappy config, for screenshot editing swappyConfig = '' [Default] @@ -116,22 +76,22 @@ let save_dir=$HOME/Pictures/Screenshots ''; - # All my bemenu scripts in one file - beScripts = pkgs.writeScriptBin "bescripts" '' + # All my rofi scripts in one file + rofiScripts = pkgs.writeScriptBin "rofiscripts" '' # Scratchpad function handle_scratchpads() { - SCRATCHPADS=$(echo -e "Gotop\nMusic\nPavuControl\nEasyEffects" | bemenu ${bemenuOpts} -p "Scratchpads") + SCRATCHPADS=$(echo -e "Gotop\nMusic\nAudio\nEasyEffects" | rofi -dmenu -i -p "Scratchpads") case $SCRATCHPADS in - Gotop) ${terminalClass} gotop -T Gotop gotop;; - Music) ${terminalClass} music -T Music ncmpcpp;; - PavuControl) pavucontrol;; + Gotop) foot -a gotop -T Gotop gotop;; + Music) foot -a music -T Music ncmpcpp;; + Audio) foot -a audio -T Audio ncpamixer;; EasyEffects) easyeffects;; esac } # Lock menu handle_power() { - POWER=$(echo -e "Shutdown\nReboot\nSleep\nLock\nKill" | bemenu ${bemenuOpts} -p "Power") + POWER=$(echo -e "Shutdown\nReboot\nSleep\nLock\nKill" | rofi -dmenu -i -p "Power") case $POWER in Shutdown) poweroff;; Reboot) reboot;; @@ -143,7 +103,7 @@ let # Resolutions handle_resolutions() { - RET=$(echo -e "Default\nWide\nGPU2" | bemenu ${bemenuOpts} -p "Resolutions") + RET=$(echo -e "Default\nWide\nGPU2" | rofi -dmenu -i -p "Resolutions") case $RET in Default) swaymsg reload ;; Wide) swaymsg " @@ -163,8 +123,6 @@ let handle_scratchpads elif [ "$1" == "--power" ]; then handle_power - elif [ "$1" == "--media" ]; then - handle_media elif [ "$1" == "--resolutions" ]; then handle_resolutions else @@ -324,101 +282,6 @@ let fi ''; - # Handle all my alarms - alarmScript = let - alarmSound = pkgs.fetchurl { - url = "https://archive.org/download/espionage_202105/Espionage.mp3"; - sha256 = "0y5b9ha6jrrar8shvilq1gcmrr37zf53f6zwba5c0m7yplbxnv65"; - }; - in pkgs.writeScriptBin "alarms" '' - # The alarm script itself - alarm() { - mpv --volume=40 --force-media-title="Alarm" ${alarmSound} & - swaynag \ - --message "$name" \ - --button "Stop Alarm" alarms \ - --font ${mainFont} 12 --background ${darkCol} \ - --border ${primeCol} \ - --button-border-size ${borderWeight} \ - --button-background ${darkCol} \ - --border-bottom ${primeCol} \ - --text ${textCol} \ - --button-text ${textCol} - } - - # Handle alarm times - handle_alarms() { - - # Make the script loop when ran by Sway - while true; do - # Check the current day and time - current_day=$(date +"%A") - current_time=$(date +'%l:%M%p' | sed 's/^ //') - - # Monday alarms - if [ "$current_day" == "Monday" ]; then - if [ "$current_time" == "7:30AM" ]; then - name="SEC 330 Physical"; alarm - fi - fi - - # Tuesday alarms - if [ "$current_day" == "Tuesday" ]; then - if [ "$current_time" == "10:30AM" ]; then - name="DAT 330 Physical"; alarm - fi - fi - - # Wednesday alarms - if [ "$current_day" == "Wednesday" ]; then - if [ "$current_time" == "6:30AM" ]; then - name="MST 300 Physical"; alarm - fi - fi - - # Thursday alarms - if [ "$current_day" == "Thursday" ]; then - : - fi - - # Friday alarms - if [ "$current_day" == "Friday" ]; then - if [ "$current_time" == "11:40AM" ]; then - name="DAT 330 Online"; alarm - fi - fi - - # Wait a minute between checks - sleep 60 - done - } - - # Handle the killing of the alarm - kill_alarm() { - pkill -f 'mpv.*${alarmSound}' - pkill swaynag - } - - # Check which mode the script is ran in - if [ "$1" == "--alarms" ]; then - handle_alarms - else - kill_alarm - fi - ''; - - # Check IOMMU Groups - iommuCheck = pkgs.writeScriptBin "lsiommu" '' - #!/usr/bin/env bash - shopt -s nullglob - for g in $(find /sys/kernel/iommu_groups/* -maxdepth 0 -type d | sort -V); do - echo "IOMMU Group ''${g##*/}:" - for d in $g/devices/*; do - echo -e "\t$(lspci -nns ''${d##*/})" - done; - done; - ''; - # File manager config pcmanConf = '' [Behavior] @@ -451,7 +314,7 @@ let [System] Archiver=file-roller - Terminal=${terminal} + Terminal=foot [Thumbnail] MaxExternalThumbnailFileSize=-1 @@ -468,38 +331,6 @@ let TabPaths=@Invalid() ''; - # Foot config - footConf = '' - font=${nerdFont}:size=14.7 - term=xterm-256color - - [cursor] - style=beam - - [colors] - alpha=0.65 - background=${darkCol} - regular0=3f3f3f - regular1=cc0000 - regular2=4e9a06 - regular3=c4a000 - regular4=94bff3 - regular5=85678f - regular6=06989a - regular7=dcdccc - bright0=545454 - bright1=fc5454 - bright2=8ae234 - bright3=fce94f - bright4=94bff3 - bright5=b294bb - bright6=93e0e3 - bright7=ffffff - - [key-bindings] - search-start=Control+f - ''; - # An Easyeffects equalizer profile that sounds good to me easyEffectsProfile = '' { @@ -798,27 +629,6 @@ let } ''; - # Mangohud acts like rivatuner on Windows, config file - mangoConf = '' - table_columns=2 - frametime=0 - legacy_layout=0 - font_scale=0.80 - background_alpha=0.25 - - # Set the loads and such - exec=echo $(echo $XDG_CURRENT_DESKTOP | sed 's/./\U&/') on $(cat /etc/os-release | grep PRETTY_NAME | cut -d '"' -f 2) - fps - fps_color_change - ram - vram - cpu_stats - cpu_load_change - gpu_stats - gpu_load_change - frame_timing - ''; - # Neofetch main config neoConf = '' { @@ -964,164 +774,6 @@ let in pkgs.writeScriptBin "pfetch" ''fastfetch --config ${smallConf}''; - # Ranger (terminal file browser) config - rangerConf = '' - set preview_script ~/.config/ranger/scope.sh - set preview_images true - set preview_images_method ${termPreviewMethod} - set dirname_in_tabs true - set cd_tab_fuzzy true - set autosave_bookmarks false - set show_hidden true - set wrap_scroll true - set column_ratios 2,2,4 - set hidden_filter ^\.|\.(?:pyc|pyo|bak|swp)$|^lost\+found$|^__(py)?cache__$ - default_linemode devicons - ''; - - # Choose which programs ranger uses - rifleConf = '' - # Websites - ext x?html?, has librewolf, X, flag f = librewolf -- "$@" - - # Define the "editor" for text files as first action - mime ^text, label editor = vim -- "$@" - !mime ^text, label editor, ext xml|json|jsonc|m3u|m3u8|csv|tex|py|pl|rb|js|sh|php = vim -- "$@" - - # Misc files - ext 1 = man "$1" - ext exe = wine "$1" - ext msi = wine "$1" - name ^[mM]akefile$ = make - - # Scripts - ext sh = sh -- "$1" - ext py = python -- "$1" - ext pl = perl -- "$1" - ext rb = ruby -- "$1" - ext js = node -- "$1" - ext php = php -- "$1" - - # Audio and video - mime ^audio|ogg$, terminal, has mpv = mpv --no-audio-display -- "$@" - mime ^audio|ogg$, terminal, has mpv = mpv --shuffle --no-audio-display -- "$@" - mime ^video, terminal, has mpv = mpv -- "$@" - mime ^video, terminal, has mpv = mpv --video-rotate=270 -- "$@" - - # Documents - ext pdf, has zathura, X, flag f = zathura -- "$@" - ext pdf, has okular, X, flag f = okular -- "$@" - ext pptx?|od[dfgpst]|docx?|sxc|xlsx?|xlt|xlw|gnm|gnumeric, has libreoffice, X, flag f = libreoffice "$@" - - # Images - mime ^image, has imv, X, flag f = imv -- "$@" - - # Archives - ext 7z|ace|ar|arc|bz2?|cab|cpio|cpt|deb|dgc|dmg|gz|iso|jar|pkg|rar|shar|tar|tgz|xar|xpi|xz|zip, has 7z = 7z x -- "$@" - - # Listing and extracting archives without atool: - ext tar|gz|bz2|xz, has tar = tar vvtf "$1" | "$PAGER" - ext tar|gz|bz2|xz, has tar = for file in "$@"; do tar vvxf "$file"; done - - # Fonts - mime ^font, has fontforge, X, flag f = fontforge "$@" - - # Generic file openers - label open, has xdg-open = xdg-open -- "$@" - - # Execute a file as program/script. - mime application/x-executable = "$1" - ''; - - # Ranger's preview - rangerScope = '' - #!/usr/bin/env bash - set -o noclobber -o noglob -o nounset -o pipefail - IFS=$'\n' - - # Script arguments - FILE_PATH="$1" - PV_WIDTH="$2" - PV_HEIGHT="$3" - IMAGE_CACHE_PATH="$4" - PV_IMAGE_ENABLED="$5" - - FILE_EXTENSION=$(echo "$FILE_PATH" | rev | cut -d. -f1 | rev) - FILE_EXTENSION_LOWER=$(echo "$FILE_EXTENSION" | tr '[:upper:]' '[:lower:]') - - handle_extension() { - case "$FILE_EXTENSION_LOWER" in - # Archive - a|ace|alz|arc|arj|bz|bz2|cab|cpio|deb|gz|jar|lha|lz|lzh|lzma|lzo|iso|\ - rpm|rz|t7z|tar|tbz|tbz2|tgz|tlz|txz|tZ|tzo|war|xpi|xz|Z|zip|7z|rar) - 7z l -p -- "$FILE_PATH" && exit 5 - exit 1;; - pdf) - pdftotext -l 10 -nopgbrk -q -- "$FILE_PATH" - && exit 5 - exiftool "$FILE_PATH" && exit 5 - exit 1;; - # OpenDocument - odt|ods|odp|sxw) - odt2txt "$FILE_PATH" && exit 5 - exit 1;; - esac - } - - handle_image() { - local mimetype="$1" - case "$mimetype" in - # SVG - image/svg+xml) - convert "$FILE_PATH" "$IMAGE_CACHE_PATH" && exit 6 - exit 1;; - # Image - image/*) - local orientation - orientation="$( identify -format '%[EXIF:Orientation]\n' -- "$FILE_PATH" )" - if [[ -n "$orientation" && "$orientation" != 1 ]]; then - convert -- "$FILE_PATH" -auto-orient "$IMAGE_CACHE_PATH" && exit 6 - fi - exit 7;; - # Video - video/*) - # Thumbnail - ffmpegthumbnailer -i "$FILE_PATH" -o "$IMAGE_CACHE_PATH" -s 0 && exit 6 - exit 1;; - # PDF - application/pdf) - pdftoppm -f 1 -l 1 \ - -scale-to-x 1920 \ - -scale-to-y -1 \ - -singlefile \ - -jpeg -tiffcompression jpeg \ - -- "$FILE_PATH" "$(basename "$IMAGE_CACHE_PATH")" \ - && exit 6 || exit 1;; - esac - } - - handle_mime() { - local mimetype="$1" - case "$mimetype" in - # Text - text/* | */xml) - exit 2;; - # Audio - audio/*) - exiftool "$FILE_PATH" && exit 5 - exit 1;; - esac - } - - MIMETYPE="$( file --dereference --brief --mime-type -- "$FILE_PATH" )" - if [[ "$PV_IMAGE_ENABLED" == 'True' ]]; then - handle_image "$MIMETYPE" - fi - handle_extension - handle_mime "$MIMETYPE" - handle_fallback - exit 1 - ''; - # Ranger's bookmarks rangerBookmarks = '' # Local files @@ -1147,12 +799,6 @@ let drivers=pulse ''; - # Ncmpcpp configuration - ncmpcppConf = '' - browser_sort_mode = "name" - user_interface = "alternative" - ''; - # FireFox colors foxJimCol = '' :root { @@ -1449,23 +1095,21 @@ in home.packages = (with pkgs; [ # Useful programs rofi-bluetooth bemoji imv qbittorrent - libreoffice-fresh easyeffects pavucontrol - vesktop element-desktop ffmpegthumbnailer - thunderbird + libreoffice-fresh easyeffects vesktop + element-desktop ffmpegthumbnailer thunderbird # Terminal programs - dua vimv p7zip fastfetch gotop pciutils - usbutils tcptrack mpc-cli ncmpcpp protonvpn-cli_2 + dua vimv p7zip fastfetch gotop pciutils usbutils + ncpamixer tcptrack mpc-cli protonvpn-cli_2 # Scripts as global programs - beScripts makoToggle swayLock - screenShot alarmScript iommuCheck pFetch + rofiScripts makoToggle swayLock screenShot pFetch # Production tools krita inkscape audacity blender sunvox # File manager - pcmanfm-qt gnome.file-roller ranger imagemagick poppler_utils + pcmanfm-qt gnome.file-roller imagemagick poppler_utils # School tools remmina freerdp globalprotect-openconnect python3 zoom-us @@ -1474,7 +1118,7 @@ in yt-dlp spotdl ani-cli playerctl ffmpeg # Unlimited games - steam steam-run heroic mangohud prismlauncher + steam steam-run heroic prismlauncher # Emulators #dolphin-emu cemu ryujinx duckstation pcsx2 unstable.lime3ds @@ -1483,7 +1127,7 @@ in #moonlight-qt # Window manager apps - swaybg wdisplays wl-clipboard clipman bemenu + swaybg wdisplays wl-clipboard clipman libnotify bc grim slurp swappy jq lm_sensors ]); @@ -1491,7 +1135,7 @@ in wayland.windowManager.sway = let # Define certain variables Sway will use primeMod = "Mod4"; - altMod = "Mod1"; + secMod = "Mod1"; # Define scripts specific to Sway pinWindow = pkgs.writeScript "pin-window" '' @@ -1536,7 +1180,7 @@ in ''; in { enable = true; - package = pkgs.unstable.sway; # swayfx + #package = pkgs.swayfx wrapperFeatures.gtk = true; checkConfig = false; config = { @@ -1546,13 +1190,12 @@ in { command = "swaylock"; } # Scratchpads - { command = "${terminalClass} gotop -T Gotop gotop"; } - { command = "${terminalClass} music -T Music ncmpcpp"; } - { command = "pavucontrol"; } + { command = "foot -a gotop -T Gotop gotop"; } + { command = "foot -a music -T Music ncmpcpp"; } + { command = "foot -a audio -T Audio ncpamixer"; } { command = "easyeffects"; } # Daemons and tray apps - { command = "alarms --alarms"; } { command = "wl-paste -t text --watch clipman store -P"; } { command = "wl-copy"; } { command = "mako"; } @@ -1703,27 +1346,26 @@ in "${primeMod}+F10" = ''exec virt-manager | ${sendNotif} "Virtual Machines"''; # BeMenu scripts - "${primeMod}+F11" = ''exec bescripts --scratchpads | ${sendNotif} "Scratchpads"''; - "${primeMod}+${altMod}+Ctrl+r" = ''exec bescripts --resolutions''; + "${primeMod}+F11" = ''exec rofiscripts --scratchpads | ${sendNotif} "Scratchpads"''; + "${primeMod}+${secMod}+Ctrl+r" = ''exec rofiscripts --resolutions''; # Open NixOS configuration files - "${primeMod}+F12" = ''exec bash -c "${terminal} nvim /etc/nixos/{configuration,jimbo,hardware-configuration}.nix" | ${sendNotif} "Nix Config"''; + "${primeMod}+F12" = ''exec bash -c "foot nvim /etc/nixos/{configuration,jimbo,hardware-configuration}.nix" | ${sendNotif} "Nix Config"''; - # Terminal, bemenu, clipmenu, media script, power menu, show/hide waybar - "${primeMod}+Return" = ''exec ${terminal}''; - "${primeMod}+s" = ''exec bemenu-run ${bemenuOpts} -p Command''; + # Terminal, rofi, clipmenu, media script, power menu, show/hide waybar + "${primeMod}+Return" = ''exec foot''; + "${primeMod}+s" = ''exec rofi -show run -p Command''; "${primeMod}+c" = ''exec clipman pick -t rofi''; - "${primeMod}+y" = ''exec bescripts --media''; - "${primeMod}+x" = ''exec bescripts --power''; + "${primeMod}+x" = ''exec rofiscripts --power''; "${primeMod}+b" = ''exec pkill -USR1 waybar''; "${primeMod}+Escape" = ''exec ${swayTools} --kill''; # PCManFM, Emoji Picker, Rofi Launcher, Bluetooth, Ranger "${primeMod}+Shift+t" = ''exec pcmanfm-qt''; - "${primeMod}+Shift+e" = ''exec BEMOJI_PICKER_CMD="rofi -dmenu -p Emoji" bemoji -n -P 0''; - "${primeMod}+Shift+s" = ''exec rofi -show drun -modi drun -drun-display-format {name} -show-icons -disable-history -terminal ${terminal}''; + "${primeMod}+Shift+e" = ''exec BEMOJI_PICKER_CMD="rofi -dmenu -i -p Emoji" bemoji -n -P 0''; + "${primeMod}+Shift+s" = ''exec rofi -show drun -modi drun -drun-display-format {name} -show-icons -disable-history''; "${primeMod}+Shift+b" = ''exec rofi-bluetooth''; - "${primeMod}+Shift+Return" = ''exec ${terminal} ranger''; + "${primeMod}+Shift+Return" = ''exec foot ranger''; # Swaytools prop, colorpicker, obs-cmd "${primeMod}+Ctrl+x" = ''exec ${swayTools} --prop''; @@ -1738,27 +1380,25 @@ in "XF86AudioLowerVolume" = ''exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-''; # MPV volume control - "${altMod}+XF86AudioRaiseVolume" = ''exec mpc volume +3''; - "${altMod}+XF86AudioLowerVolume" = ''exec mpc volume -3''; + "${secMod}+XF86AudioRaiseVolume" = ''exec mpc volume +3''; + "${secMod}+XF86AudioLowerVolume" = ''exec mpc volume -3''; # Mute, Stop "XF86AudioMute" = ''exec wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle''; "XF86AudioStop" = ''exec mpc stop''; # Play MPD, Firefox, or MPV - "XF86AudioPlay" = ''exec playerctl --player=librewolf play-pause''; + "XF86AudioPlay" = ''exec mpc toggle''; + "${secMod}+XF86AudioPlay" = ''exec playerctl --player=librewolf play-pause''; "Ctrl+XF86AudioPlay" = ''exec playerctl --player=mpv play-pause''; - "${altMod}+XF86AudioPlay" = ''exec mpc toggle''; # Next/Previous - "XF86AudioNext" = ''exec playerctl --player=librewolf next''; - "XF86AudioPrev" = ''exec playerctl --player=librewolf previous''; - "${altMod}+XF86AudioNext" = ''exec mpc next''; - "${altMod}+XF86AudioPrev" = ''exec mpc prev''; + "XF86AudioNext" = ''exec mpc next''; + "XF86AudioPrev" = ''exec mpc prev''; # Seek - "${altMod}+Shift+XF86AudioNext" = ''exec mpc seek +5''; - "${altMod}+Shift+XF86AudioPrev" = ''exec mpc seek -5''; + "${secMod}+Shift+XF86AudioNext" = ''exec mpc seek +5''; + "${secMod}+Shift+XF86AudioPrev" = ''exec mpc seek -5''; ## Notification keys @@ -1776,15 +1416,15 @@ in "Ctrl+Print" = ''exec screenshot --all''; # Server SSH - "${primeMod}+Ctrl+Return" = ''exec ${terminal} ssh server -p 2222''; + "${primeMod}+Ctrl+Return" = ''exec foot ssh server -p 2222''; # Display Brightness and Keyboard Brightness - "XF86MonBrightnessUp" = ''exec light -A 5''; - "XF86MonBrightnessDown" = ''exec light -U 5''; - "Shift+XF86MonBrightnessUp" = ''exec light -A 1''; - "Shift+XF86MonBrightnessDown" = ''exec light -U 1''; - "XF86KbdBrightnessUp" = ''exec light -s sysfs/leds/smc::kbd_backlight -A 5''; - "XF86KbdBrightnessDown" = ''exec light -s sysfs/leds/smc::kbd_backlight -U 5''; + "XF86MonBrightnessUp" = ''exec ${pkgs.light}/bin/light -A 5''; + "XF86MonBrightnessDown" = ''exec ${pkgs.light}/bin/light -U 5''; + "Shift+XF86MonBrightnessUp" = ''exec ${pkgs.light}/bin/light -A 1''; + "Shift+XF86MonBrightnessDown" = ''exec ${pkgs.light}/bin/light -U 1''; + "XF86KbdBrightnessUp" = ''exec ${pkgs.light}/bin/light -s sysfs/leds/smc::kbd_backlight -A 5''; + "XF86KbdBrightnessDown" = ''exec ${pkgs.light}/bin/light -s sysfs/leds/smc::kbd_backlight -U 5''; ## Window manager keys "${primeMod}+q" = ''kill''; @@ -1803,15 +1443,15 @@ in "${primeMod}+9" = ''workspace ${w9}''; # Switch to alternate workspaces - "${altMod}+F1" = ''workspace ${w1a}''; - "${altMod}+F2" = ''workspace ${w2a}''; - "${altMod}+F3" = ''workspace ${w3a}''; - "${altMod}+F4" = ''workspace ${w4a}''; - "${altMod}+F5" = ''workspace ${w5a}''; - "${altMod}+F6" = ''workspace ${w6a}''; - "${altMod}+F7" = ''workspace ${w7a}''; - "${altMod}+F8" = ''workspace ${w8a}''; - "${altMod}+F9" = ''workspace ${w9a}''; + "${secMod}+F1" = ''workspace ${w1a}''; + "${secMod}+F2" = ''workspace ${w2a}''; + "${secMod}+F3" = ''workspace ${w3a}''; + "${secMod}+F4" = ''workspace ${w4a}''; + "${secMod}+F5" = ''workspace ${w5a}''; + "${secMod}+F6" = ''workspace ${w6a}''; + "${secMod}+F7" = ''workspace ${w7a}''; + "${secMod}+F8" = ''workspace ${w8a}''; + "${secMod}+F9" = ''workspace ${w9a}''; # Move window to and focus new workspace "${primeMod}+Shift+grave" = ''move container to workspace ${w0}; workspace ${w0}''; @@ -1826,15 +1466,15 @@ in "${primeMod}+Shift+9" = ''move container to workspace ${w9}; workspace ${w9}''; # Move window to and focus new alternate workspace - "${altMod}+Shift+F1" = ''move container to workspace ${w1a}; workspace ${w1a}''; - "${altMod}+Shift+F2" = ''move container to workspace ${w2a}; workspace ${w2a}''; - "${altMod}+Shift+F3" = ''move container to workspace ${w3a}; workspace ${w3a}''; - "${altMod}+Shift+F4" = ''move container to workspace ${w4a}; workspace ${w4a}''; - "${altMod}+Shift+F5" = ''move container to workspace ${w5a}; workspace ${w5a}''; - "${altMod}+Shift+F6" = ''move container to workspace ${w6a}; workspace ${w6a}''; - "${altMod}+Shift+F7" = ''move container to workspace ${w7a}; workspace ${w7a}''; - "${altMod}+Shift+F8" = ''move container to workspace ${w8a}; workspace ${w8a}''; - "${altMod}+Shift+F9" = ''move container to workspace ${w9a}; workspace ${w9a}''; + "${secMod}+Shift+F1" = ''move container to workspace ${w1a}; workspace ${w1a}''; + "${secMod}+Shift+F2" = ''move container to workspace ${w2a}; workspace ${w2a}''; + "${secMod}+Shift+F3" = ''move container to workspace ${w3a}; workspace ${w3a}''; + "${secMod}+Shift+F4" = ''move container to workspace ${w4a}; workspace ${w4a}''; + "${secMod}+Shift+F5" = ''move container to workspace ${w5a}; workspace ${w5a}''; + "${secMod}+Shift+F6" = ''move container to workspace ${w6a}; workspace ${w6a}''; + "${secMod}+Shift+F7" = ''move container to workspace ${w7a}; workspace ${w7a}''; + "${secMod}+Shift+F8" = ''move container to workspace ${w8a}; workspace ${w8a}''; + "${secMod}+Shift+F9" = ''move container to workspace ${w9a}; workspace ${w9a}''; # Change focus across windows "${primeMod}+Up" = ''focus up''; @@ -1867,7 +1507,7 @@ in # Toggle fullscreen "${primeMod}+f" = ''fullscreen toggle''; - "${primeMod}+${altMod}+Ctrl+f" = ''fullscreen toggle global''; + "${primeMod}+${secMod}+Ctrl+f" = ''fullscreen toggle global''; # Change container layout "${primeMod}+w" = ''layout toggle split''; @@ -1882,10 +1522,10 @@ in "${primeMod}+d" = ''focus child''; # Resize windows - "${primeMod}+${altMod}+Up" = ''resize grow height ${resizeAmount} px or 5 ppt''; - "${primeMod}+${altMod}+Down" = ''resize shrink height ${resizeAmount} px or 5 ppt''; - "${primeMod}+${altMod}+Left" = ''resize shrink width ${resizeAmount} px or 5 ppt''; - "${primeMod}+${altMod}+Right" = ''resize grow width ${resizeAmount} px or 5 ppt''; + "${primeMod}+${secMod}+Up" = ''resize grow height ${resizeAmount} px or 5 ppt''; + "${primeMod}+${secMod}+Down" = ''resize shrink height ${resizeAmount} px or 5 ppt''; + "${primeMod}+${secMod}+Left" = ''resize shrink width ${resizeAmount} px or 5 ppt''; + "${primeMod}+${secMod}+Right" = ''resize grow width ${resizeAmount} px or 5 ppt''; # Adjust gap size "${primeMod}+Shift+equal" = ''gaps inner current set 5''; @@ -1895,7 +1535,7 @@ in # Scratchpads "Ctrl+Shift+Escape" = ''[app_id="gotop"] scratchpad show, move position center, resize set 1216 888''; "${primeMod}+Shift+m" = ''[app_id="music"] scratchpad show, move position center, resize set 1006 657''; - "${primeMod}+Shift+v" = ''[app_id="pavucontrol"] scratchpad show, move position center, resize set 1000 800''; + "${primeMod}+Shift+v" = ''[app_id="audio"] scratchpad show, move position center, resize set 1000 800''; "${primeMod}+Shift+Backslash" = ''[app_id="com.github.wwmm.easyeffects"] scratchpad show, move position center, resize set 1000 800''; }; window = { @@ -1909,8 +1549,8 @@ in criteria = { app_id = "gotop"; }; } { command = ''mark scratchpad''; criteria = { app_id = "music"; }; } - { command = ''mark scratchpad, opacity 0.9''; - criteria = { app_id = "pavucontrol"; }; } + { command = ''mark scratchpad''; + criteria = { app_id = "audio"; }; } { command = ''mark scratchpad, opacity 0.9''; criteria = { app_id = "com.github.wwmm.easyeffects"; }; } @@ -2598,12 +2238,49 @@ in containers = { Google = { color = "green"; icon = "fingerprint"; id = 200; }; Seneca = { color = "red"; icon = "briefcase"; id = 201; }; - Centennial = { color = "pink"; icon = "vacation"; id = 202; }; }; }; }; }; + # Enable a terminal emulator + programs.foot = { + enable = true; + server.enable = false; + settings = { + main = { + term = "xterm-256color"; + font = "${nerdFont}:size=14.7"; + }; + cursor = { + style = "beam"; + }; + colors = { + alpha = "0.65"; + background = "${darkCol}"; + regular0 = "3f3f3f"; + regular1 = "cc0000"; + regular2 = "4e9a06"; + regular3 = "c4a000"; + regular4 = "94bff3"; + regular5 = "85678f"; + regular6 = "06989a"; + regular7 = "dcdccc"; + bright0 = "545454"; + bright1 = "fc5454"; + bright2 = "8ae234"; + bright3 = "fce94f"; + bright4 = "94bff3"; + bright5 = "b294bb"; + bright6 = "93e0e3"; + bright7 = "ffffff"; + }; + key-bindings = { + search-start = "Control+f"; + }; + }; + }; + # Install Neovim and plugins programs.neovim = { enable = true; @@ -2718,10 +2395,64 @@ in ''; }; + # Enable Ranger + programs.ranger = { + enable = true; + settings = { + preview_images = true; + preview_images_method = "sixel"; + dirname_in_tabs = true; + cd_tab_fuzzy = true; + autosave_bookmarks = false; + show_hidden = true; + wrap_scroll = true; + column_ratios = "2,2,4"; + hidden_filter = ''^\.|\.(?:pyc|pyo|bak|swp)$|^lost\+found$|^__(py)?cache__$''; + }; + rifle = [ + # Text editing + { condition = ''ext xml|json|jsonc|m3u|m3u8|csv|tex|py|pl|rb|js|sh|php|nix''; command = ''vim -- "$@"''; } + + # Media + { condition = ''mime ^image, has imv, X, flag f''; command = ''imv -- "$@"''; } + { condition = ''mime ^video, terminal, has mpv''; command = ''mpv -- "$@"''; } + { condition = ''mime ^video, terminal, has mpv''; command = ''mpv --video-rotate=270 -- "$@"''; } + { condition = ''mime ^audio|ogg$, terminal, has mpv''; command = ''mpv --no-audio-display -- "$@"''; } + { condition = ''mime ^audio|ogg$, terminal, has mpv''; command = ''mpv --shuffle --no-audio-display -- "$@"''; } + { condition = ''ext x?html?|pdf, has librewolf, X, flag f''; command = ''librewolf -- "$@"''; } + { condition = ''ext pptx?|od[dfgpst]|docx?|sxc|xlsx?|xlt|xlw|gnm|gnumeric, has libreoffice, X, flag f''; command = ''libreoffice "$@"''; } + + # Scripts + { condition = ''sh''; command = ''sh -- "$1"''; } + { condition = ''py''; command = ''python -- "$1"''; } + { condition = ''pl''; command = ''perl -- "$1"''; } + { condition = ''js''; command = ''node -- "$1"''; } + { condition = ''php''; command = ''php -- "$1"''; } + + # Misc + { condition = ''ext exe|msi''; command = ''wine "$1"''; } + { condition = ''ext 7z|ace|ar|arc|bz2?|cab|cpio|cpt|deb|dgc|dmg|gz|iso|jar|pkg|rar|shar|tar|tgz|xar|xpi|xz|zip, has 7z''; command = ''7z x -- "$@"''; } + { condition = ''label open, has xdg-open''; command = ''xdg-open -- "$@"''; } + ]; + plugins = [ + { + name = "devicons2"; + src = builtins.fetchGit { + url = "https://github.com/cdump/ranger-devicons2"; + rev = "9606009aa01743768b0f27de0a841f7d8fe196c5"; + }; + } + ]; + extraConfig = '' + default_linemode devicons2 + ''; + }; + # Enable Rofi programs.rofi = { enable = true; package = pkgs.rofi-wayland; + terminal = "foot"; font = "${mainFont} 14"; theme = let inherit (config.lib.formats.rasi) mkLiteral; @@ -2852,16 +2583,13 @@ in }; }; - # Enable Discord Music RPC - services.mpd-discord-rpc.enable = true; - # OBS with plugins programs.obs-studio = { enable = true; plugins = with pkgs.obs-studio-plugins; [ obs-pipewire-audio-capture obs-webkitgtk obs-multi-rtmp obs-vkcapture obs-tuna - advanced-scene-switcher looking-glass-obs + looking-glass-obs ]; }; @@ -2883,29 +2611,54 @@ in extraConfig = "on-button-right=dismiss-all\nouter-margin=10\n[mode=do-not-disturb]\ninvisible=1"; }; + # Mangohud + programs.mangohud = { + enable = true; + settings = { + table_columns = 2; + frametime = 0; + legacy_layout = 0; + font_scale = 0.80; + background_alpha = 0.25; + exec = ''echo $(echo $XDG_CURRENT_DESKTOP | sed 's/./\U&/') on $(cat /etc/os-release | grep PRETTY_NAME | cut -d '"' -f 2)''; + fps = true; + fps_color_change = true; + ram = true; + vram = true; + cpu_stats = true; + cpu_load_change = true; + gpu_stats = true; + gpu_load_change = true; + frame_timing = true; + }; + }; + + # Enable Discord Music RPC + services.mpd-discord-rpc.enable = true; + + # Enable NCMPCPP + programs.ncmpcpp = { + enable = true; + settings = { + browser_sort_mode = "name"; + user_interface = "alternative"; + }; + }; + # Automount with udisk2 services.udiskie.enable = true; # Start defining arbitrary files home.file = { - # Sway scripts - ".config/sway/start.sh" = { text = swayStart; executable = true; }; - # Cursor icon theme ".icons/default".source = "${pkgs.simp1e-cursors}/share/icons/Simp1e-Dark"; # Swappy's config ".config/swappy/config".text = swappyConfig; - # Foot config file - ".config/foot/foot.ini".text = footConf; - # Easyeffects profile ".config/easyeffects/output/JimHeadphones.json".text = easyEffectsProfile; - # Mangohud config - ".config/MangoHud/MangoHud.conf".text = mangoConf; - # Fastfetch config ".config/fastfetch/config.jsonc".text = neoConf; @@ -2913,21 +2666,7 @@ in ".config/pcmanfm-qt/default/settings.conf".text = pcmanConf; # Ranger config - ".config/ranger/rc.conf".text = rangerConf; - ".config/ranger/rifle.conf".text = rifleConf; - ".config/ranger/scope.sh" = { text = rangerScope; executable = true; }; ".local/share/ranger/bookmarks".text = rangerBookmarks; - ".config/ranger/plugins/devicons/devicons.py".source = "${pkgs.fetchurl { - url = "https://raw.githubusercontent.com/alexanderjeurissen/ranger_devicons/2c3c19dffb4238d01c74515c9eed5088066db243/devicons.py"; - sha256 = "0girsranwhsgc6kcyh1mkwymx0bl14a2k5nzk3kyllb6ic48c33k"; - }}"; - ".config/ranger/plugins/devicons/__init__.py".source = "${pkgs.fetchurl { - url = "https://raw.githubusercontent.com/alexanderjeurissen/ranger_devicons/2c3c19dffb4238d01c74515c9eed5088066db243/__init__.py"; - sha256 = "1r086apw20ryxylqgnbynx7mzz779v1w0m40wghmmhlzw4x15fmr"; - }}"; - - # Ncmpcpp config - ".config/ncmpcpp/config".text = ncmpcppConf; # Gnome theme ".mozilla/firefox/Misc/chrome".source = "${fetchTarball { @@ -2982,9 +2721,9 @@ in ls = "${pkgs.eza}/bin/eza -a --color=always --group-directories-first --icons"; nls = "/usr/bin/env ls"; cat = "${pkgs.bat}/bin/bat --paging never"; + ncat = "/usr/bin/env cat"; copycat = "wl-copy <"; sunshinehost = "WAYLAND_DISPLAY=wayland-1 DISPLAY=:1 sunshine -0"; - alarmlist = "cat ${alarmScript}/bin/alarms"; seneca = "ssh jhampton1@matrix.senecapolytechnic.ca"; # Curl tools diff --git a/Server/configuration.nix b/Server/configuration.nix index f203fdf..111f7ea 100644 --- a/Server/configuration.nix +++ b/Server/configuration.nix @@ -146,23 +146,30 @@ in # Enable nftables and forwarding nftables = { enable = true; - tables.forwarding = { - family = "ip"; - content = '' - chain PREROUTING { - type nat hook prerouting priority dstnat; policy accept; - tcp dport 2211 dnat to ${pcIP} comment "SSH from PC" - udp dport { 27005, 27015, 7777 } dnat to ${pcIP} comment "Games from PC" - tcp dport { 58010, 57989, 57984 } dnat to ${pcIP} comment "Sunshine TCP from PC" - udp dport { 57998, 57999, 58000 } dnat to ${pcIP} comment "Sunshine UDP from PC" - tcp dport { 38010, 37989, 37984 } dnat to ${vmIP} comment "Sunshine TCP from VM" - udp dport { 37998, 37999, 38000 } dnat to ${vmIP} comment "Sunshine UDP from VM" - } - chain POSTROUTING { - type nat hook postrouting priority 100; policy accept; - oifname "${netInt}" masquerade - } - ''; + tables = { + forwarding = { + family = "ip"; + content = '' + chain PREROUTING { + type nat hook prerouting priority dstnat; policy accept; + tcp dport 2211 dnat to ${pcIP}:22 comment "SSH to PC" + udp dport { 27005, 27015, 7777 } dnat to ${pcIP} comment "Games to PC" + + tcp dport { 58010, 57989, 57984 } dnat to ${pcIP} comment "Sunshine TCP to PC" + udp dport { 57998, 57999, 58000 } dnat to ${pcIP} comment "Sunshine UDP to PC" + + tcp dport { 38010, 37989, 37984 } dnat to ${vmIP} comment "Sunshine TCP to VM" + udp dport { 37998, 37999, 38000 } dnat to ${vmIP} comment "Sunshine UDP to VM" + + ip saddr ${secrets.freecornIP} tcp dport { 9943, 9944 } dnat to ${vmIP} comment "ALVR TCP to VM" + ip saddr ${secrets.freecornIP} udp dport { 9943, 9944 } dnat to ${vmIP} comment "ALVR UDP to VM" + } + chain POSTROUTING { + type nat hook postrouting priority 100; policy accept; + oifname "${netInt}" masquerade + } + ''; + }; }; }; }; @@ -330,7 +337,7 @@ in locations."/" = { proxyPass = "http://127.0.0.1:255"; proxyWebsockets = true; - }; + }; }; # Streaming proxy @@ -409,18 +416,13 @@ in application stream { record off; live on; - deny play all; + allow play all; hls on; hls_path /var/www/bloxelcomweb/landing-page/bloxelcom-cable/hls; hls_fragment_naming system; hls_fragment 3; hls_playlist_length 40; } - application forward { - record off; - live on; - allow play all; - } } } ''; @@ -697,7 +699,9 @@ in systemd.services.nginx.serviceConfig = { SupplementaryGroups = [ "shadow" ]; }; - systemd.services.nginx.serviceConfig.ReadWritePaths = [ "/var/www/bloxelcomweb/landing-page/bloxelcom-cable/hls/" ]; + systemd.services.nginx.serviceConfig.ReadWritePaths = [ + "/var/www/bloxelcomweb/landing-page/bloxelcom-cable/hls/" + ]; # Get certificates for Coturn security.acme = { @@ -715,7 +719,7 @@ in nixpkgs.config.element-web.conf = { default_server_config = { "m.homeserver" = { - base_url = "https://matrix.${bloxelDomain}:443"; + base_url = "https://matrix.${bloxelDomain}"; server_name = "matrix.${bloxelDomain}"; }; }; @@ -751,24 +755,23 @@ in # Generate passwords with nix-shell -p mkpasswd --run 'mkpasswd -sm bcrypt' loginAccounts = { "noreply@${bloxelDomain}" = { - hashedPasswordFile = pkgs.writeText "noreply" secrets.noreplySmtpHash; + hashedPasswordFile = pkgs.writeText "noreply" secrets.noreplyMailHash; sendOnly = true; }; "jimbo@${bloxelDomain}" = { - hashedPasswordFile = pkgs.writeText "jimbo" secrets.jimboSmtpHash; + hashedPasswordFile = pkgs.writeText "jimbo" secrets.jimboMailHash; aliases = [ "canada@${bloxelDomain}" "contact@${bloxelDomain}" ]; }; "lunamoonlight@${bloxelDomain}" = { - hashedPasswordFile = pkgs.writeText "luna" secrets.lunaSmtpHash; + hashedPasswordFile = pkgs.writeText "luna" secrets.lunaMailHash; aliases = [ "us@${bloxelDomain}" "contact@${bloxelDomain}" ]; }; "freecorn1854@${bloxelDomain}" = { - hashedPasswordFile = pkgs.writeText "freecorn" secrets.freecornSmtpHash; + hashedPasswordFile = pkgs.writeText "freecorn" secrets.freecornMailHash; aliases = [ "canada@${bloxelDomain}" "contact@${bloxelDomain}" ]; }; "tinyattack09@${bloxelDomain}" = { - hashedPasswordFile = pkgs.writeText "tiny" secrets.tinySmtpHash; - aliases = [ "smallthing@${bloxelDomain}" ]; + hashedPasswordFile = pkgs.writeText "tiny" secrets.tinyMailHash; }; }; };