inputs: { config, lib, pkgs, ... }: with lib; let cfg = config.ezpcusr; lockCommand = "${pkgs.swaylock-effects}/bin/swaylock --clock --indicator --screenshots --effect-scale 0.5 --effect-blur 5x2 --effect-vignette 0.2:0.5 --fade-in 1 --datestr %Y-%m-%e"; selshot = pkgs.writeScript "selshot.sh" '' #!${pkgs.zsh}/bin/zsh ${pkgs.grim}/bin/grim -g "$(${pkgs.slurp}/bin/slurp)" $1 ''; selvid = pkgs.writeScript "selvid.sh" '' #!${pkgs.zsh}/bin/zsh ${pkgs.wf-recorder}/bin/wf-recorder -g "$(${pkgs.slurp}/bin/slurp)" -f $1 ''; getscrloc = pkgs.writeScript "getscrloc.sh" '' #!${pkgs.zsh}/bin/zsh mkdir -p "$HOME/Pictures/Screenshots" echo "$HOME/Pictures/Screenshots/$(date +%F_%T).''${1:-png}" ''; scrsaveclip = pkgs.writeScript "scr-save-clip.sh" '' #!${pkgs.zsh}/bin/zsh LOC=$(${getscrloc}) ${selshot} $LOC ${pkgs.wl-clipboard}/bin/wl-copy -t image/png < $LOC ''; scrsaveup = if cfg.uploadScript != null then pkgs.writeScript "scr-save-up.sh" '' #!${pkgs.zsh}/bin/zsh LOC=$(${getscrloc}) ${selshot} $LOC ${cfg.uploadScript} $LOC | xargs echo -n | ${pkgs.wl-clipboard}/bin/wl-copy notify-send "Screenshot Uploaded!" '' else null; scrvidsaveclip = pkgs.writeScript "scr-vid-save-clip.sh" '' #!${pkgs.zsh}/bin/zsh LOC=$(${getscrloc} mp4) ${selvid} $LOC ${pkgs.wl-clipboard}/bin/wl-copy -t video/mp4 < $LOC ''; scrvidsaveup = if cfg.uploadScript != null then pkgs.writeScript "scr-vid-save-up.sh" '' #!${pkgs.zsh}/bin/zsh LOC=$(${getscrloc} mp4) ${selvid} $LOC ${cfg.uploadScript} $LOC | ${pkgs.findutils}/bin/xargs echo -n | ${pkgs.wl-clipboard}/bin/wl-copy notify-send "Screen Recording Uploaded!" '' else null; scrvidstop = pkgs.writeScript "scr-vid-stop.sh" '' #!${pkgs.zsh}/bin/zsh ${pkgs.procps}/bin/pkill -2 wf-recorder ''; um = pkgs.writeScript "update-music.sh" '' #!${pkgs.bash}/bin/bash ${pkgs.mpc_cli}/bin/mpc update --wait && ${pkgs.mpc_cli}/bin/mpc clear && ${pkgs.mpc_cli}/bin/mpc ls | ${pkgs.mpc_cli}/bin/mpc add ''; ezDrv = pkgs.runCommand "ez-commands" { } ('' mkdir -p $out/bin ln -s ${selshot} $out/bin/selshot ln -s ${selvid} $out/bin/selvid ln -s ${getscrloc} $out/bin/getscrloc ln -s ${scrsaveclip} $out/bin/scrsaveclip ln -s ${scrvidsaveclip} $out/bin/scrvidsaveclip ln -s ${scrvidstop} $out/bin/scrvidstop ln -s ${um} $out/bin/um '' + ( if cfg.uploadScript != null then '' ln -s ${cfg.uploadScript} $out/bin/upload_file ln -s ${scrsaveup} $out/bin/scrsaveup ln -s ${scrvidsaveup} $out/bin/scrvidsaveup '' else "" ) ); in { options.ezpcusr = { enable = mkEnableOption "Enable simple PC user config"; babybar = mkOption { default = false; description = ''Switch to using the "baby" swaybar rather than waybar''; }; uploadScript = mkOption { type = types.nullOr types.package; default = null; description = "A path to a script that takes a path to a file and returns a URL"; }; bitwardenSession = mkOption { description = "Session key for bitwarden"; default = ""; type = types.str; }; outputOptions = mkOption { description = "Additional output options"; default = { }; type = types.attrsOf (types.attrsOf types.str); }; waybarConfig = mkOption { description = "Waybar config"; default = { }; }; makoArgs = mkOption { description = "Args for mako notification displayer"; default = ""; type = types.str; }; screensaver = mkOption { description = "ezpcusr screensaver"; default = { }; type = types.submodule { options = { enable = mkOption { type = types.bool; default = true; description = "Enable ezpcusr's screensaver"; }; lockTime = mkOption { type = types.int; default = 300; description = "Time until your screen locks"; }; offTime = mkOption { type = types.int; default = 600; description = "Time until your screen turns off"; }; }; }; }; favIcons = mkOption { description = "Your favourite icons pack"; default = { }; type = types.submodule { options = { name = mkOption { type = types.str; default = "Papirus-Dark"; description = "Name of your icon pack"; }; package = mkOption { type = types.package; default = pkgs.papirus-icon-theme; description = "Package for your icon pack"; }; }; }; }; bluetooth = mkOption { type = types.bool; default = false; description = "If this PC has bluetooth support"; }; battery = mkOption { type = types.bool; default = false; description = "If this PC has a battery"; }; location = mkOption { description = "Your location (used for weather)"; example = "US-12345"; default = ""; type = types.str; }; }; config = lib.mkIf cfg.enable { wayland.windowManager.sway = { enable = lib.mkDefault true; systemdIntegration = lib.mkDefault true; wrapperFeatures.gtk = lib.mkDefault true; extraConfig = '' exec swayidle -w \ timeout ${toString cfg.screensaver.lockTime} '${lockCommand}' \ timeout ${toString cfg.screensaver.offTime} '${pkgs.sway}/bin/swaymsg "output * dpms off"' \ resume '${pkgs.sway}/bin/swaymsg "output * dpms on"' \ before-sleep '${lockCommand}' ''; config = { terminal = lib.mkDefault "${pkgs.kitty}/bin/kitty"; modifier = lib.mkDefault "Mod4"; keybindings = let musicRofi = pkgs.writeScript "music-rofi" '' #!${pkgs.fish}/bin/fish ${pkgs.mpc_cli}/bin/mpc -f "%position% - %artist% - %album% - %title%" playlist | ${pkgs.rofi}/bin/rofi -dmenu -i | ${pkgs.coreutils}/bin/cut -d " " -f 1 | ${pkgs.findutils}/bin/xargs ${pkgs.mpc_cli}/bin/mpc play ''; # ugly stupid way of doing things but im lazy bwRofi = pkgs.writeScript "bw-rofi" '' #!${pkgs.bash}/bin/bash export BW_SESSION="${cfg.bitwardenSession}" LIST=$(${pkgs.bitwarden-cli}/bin/bw list items) USERLIST=$(echo "$LIST" | ${pkgs.jq}/bin/jq -r '.[] | "\(.name) - \(.login.username)"') CHOSEN=$(echo "$USERLIST" | ${pkgs.rofi}/bin/rofi -dmenu -i) NUMBER=$(echo "$USERLIST" | grep -n "^$CHOSEN$" | cut -d':' -f1) NTH=$(expr $NUMBER - 1) echo "$LIST" | ${pkgs.jq}/bin/jq -j -r ".[$NTH].login.password" | ${pkgs.wl-clipboard}/bin/wl-copy ''; # very ugly stupid way of doing things but im still lazy bwRofiOtp = pkgs.writeScript "bw-rofi-otp" '' #!${pkgs.bash}/bin/bash export BW_SESSION="${cfg.bitwardenSession}" LIST=$(${pkgs.bitwarden-cli}/bin/bw list items) USERLIST=$(echo "$LIST" | ${pkgs.jq}/bin/jq -r '.[] | "\(.name) - \(.login.username)"') CHOSEN=$(echo "$USERLIST" | ${pkgs.rofi}/bin/rofi -dmenu -i) NUMBER=$(echo "$USERLIST" | grep -n "^$CHOSEN$" | cut -d':' -f1) NTH=$(expr $NUMBER - 1) ID=$(echo "$LIST" | ${pkgs.jq}/bin/jq -j -r ".[$NTH].id") ${pkgs.bitwarden-cli}/bin/bw get totp $ID | ${pkgs.wl-clipboard}/bin/wl-copy ''; emojiRofi = pkgs.writeScript "rofi-emoji" '' line=$(${pkgs.coreutils}/bin/cat ${toString ../data/emojis.txt} | ${pkgs.rofi}/bin/rofi -dmenu -i) ${pkgs.coreutils}/bin/echo ''${line::1} | ${pkgs.wl-clipboard}/bin/wl-copy ''; modifier = config.wayland.windowManager.sway.config.modifier; alphabet = [ "Ctrl" "Alt" "Ctrl+Alt" ]; genKeyAttrs = move: lib.listToAttrs ( map ( n: { name = "${modifier}${if move then "+Shift" else ""}+${builtins.elemAt alphabet ((n - 11) / 10)}+${ toString (lib.mod n 10) }"; value = "${if move then "move container to " else ""}workspace ${toString n}"; } ) (lib.lists.range 11 (10 * (builtins.length alphabet) + 10)) ); in lib.mkOptionDefault ( genKeyAttrs true // genKeyAttrs false // ( let volumeUp = "exec ${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ +5%"; volumeDown = "exec ${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ -5%"; in { "Print" = "exec ${scrsaveclip}"; "Shift+Print" = if cfg.uploadScript != null then "exec ${scrsaveup}" else "nop"; "Ctrl+Print" = "exec ${scrvidsaveclip}"; "Ctrl+Alt+Print" = "exec ${scrvidstop}"; "${modifier}+minus" = volumeDown; "${modifier}+equal" = volumeUp; "XF86AudioRaiseVolume" = volumeUp; "XF86AudioLowerVolume" = volumeDown; "XF86AudioMute" = "exec ${pkgs.pulseaudio}/bin/pactl set-sink-mute @DEFAULT_SINK@ toggle"; "XF86AudioMicMute" = "exec ${pkgs.pulseaudio}/bin/pactl set-source-mute @DEFAULT_SOURCE@ toggle"; "XF86MonBrightnessDown" = "exec ${pkgs.light}/bin/light -U 10"; "XF86MonBrightnessUp" = "exec ${pkgs.light}/bin/light -A 10"; "${modifier}+semicolon" = "exec ${pkgs.light}/bin/light -U 10"; "${modifier}+apostrophe" = "exec ${pkgs.light}/bin/light -A 10"; # Previous/next but change the shuffle/random state before action (and change back afterwards) "${modifier}+Shift+bracketright" = "exec ${pkgs.mpc_cli}/bin/mpc random && ${pkgs.mpc_cli}/bin/mpc next && ${pkgs.mpc_cli}/bin/mpc random"; "${modifier}+Shift+bracketleft" = "exec ${pkgs.mpc_cli}/bin/mpc random && ${pkgs.mpc_cli}/bin/mpc prev && ${pkgs.mpc_cli}/bin/mpc random"; "Shift+XF86AudioNext" = "exec ${pkgs.mpc_cli}/bin/mpc random && ${pkgs.mpc_cli}/bin/mpc next && ${pkgs.mpc_cli}/bin/mpc random"; # Previous/next "${modifier}+bracketright" = "exec ${pkgs.mpc_cli}/bin/mpc next"; "${modifier}+bracketleft" = "exec ${pkgs.mpc_cli}/bin/mpc prev"; "XF86AudioNext" = "exec ${pkgs.mpc_cli}/bin/mpc next"; "XF86AudioPrev" = "exec ${pkgs.mpc_cli}/bin/mpc prev"; # Toggle play/pause "XF86AudioPlay" = "exec ${pkgs.mpc_cli}/bin/mpc toggle"; "XF86AudioPause" = "exec ${pkgs.mpc_cli}/bin/mpc toggle"; "${modifier}+backslash" = "exec ${pkgs.mpc_cli}/bin/mpc toggle"; "${modifier}+m" = "exec ${musicRofi}"; "${modifier}+p" = "exec ${bwRofi}"; "${modifier}+t" = "exec ${bwRofiOtp}"; "${modifier}+o" = "exec ${emojiRofi}"; "${modifier}+0" = "workspace 10"; "${modifier}+Shift+0" = "move container to workspace 10"; "Ctrl+Alt+l" = "exec ${lockCommand}"; } ) ); menu = "${pkgs.rofi}/bin/rofi -show drun -show-icons -run-command '${pkgs.sway}/bin/swaymsg exec -- {cmd}'"; bars = lib.optional cfg.babybar { position = "top"; colors = config.colors.i3BarColors; }; gaps = { smartGaps = lib.mkDefault true; smartBorders = lib.mkDefault "on"; inner = lib.mkDefault 10; outer = lib.mkDefault 0; }; }; }; home.sessionVariables = { QT_QPA_PLATFORM = "wayland-egl;xcb"; MOZ_ENABLE_WAYLAND = "1"; QT_WAYLAND_DISABLE_WINDOWDECORATION = "1"; ECORE_EVAS_ENGINE = "wayland_egl"; ELM_ENGINE = "wayland_egl"; _JAVA_AWT_WM_NONREPARENTING = "1"; }; programs.waybar = { enable = lib.mkDefault (cfg.babybar != true); systemd.enable = lib.mkDefault true; settings = [ ({ position = "left"; height = null; modules-left = [ "sway/workspaces" "custom/weather-temp" "custom/weather-precip" "custom/weather-wind" ]; modules-center = [ "clock#1" "clock#2" "mpd" "clock#3" ]; modules-right = [ "pulseaudio" "memory" "cpu" ] ++ lib.optionals cfg.battery [ "battery" ] ++ [ "tray" ]; modules = { "custom/weather-temp" = { exec = "${pkgs.curl}/bin/curl 'wttr.in/${cfg.location}?format=%c+%t' || echo ERR"; on-click = "${pkgs.xdg-utils}/bin/xdg-open 'https://weather.com/weather/today/l/85625'"; on-click-right = "${pkgs.xdg-utils}/bin/xdg-open 'https://wttr.in/${cfg.location}'"; interval = 900; }; "custom/weather-precip" = { exec = "${pkgs.curl}/bin/curl 'wttr.in/${cfg.location}?format=🌧️+%p'"; on-click = "${pkgs.xdg-utils}/bin/xdg-open 'https://www.lightningmaps.org/'"; on-click-right = "${pkgs.xdg-utils}/bin/xdg-open 'https://wttr.in/${cfg.location}'"; interval = 900; }; "custom/weather-wind" = { exec = "${pkgs.curl}/bin/curl 'wttr.in/${cfg.location}?format=🌬️+%w'"; on-click = "${pkgs.xdg-utils}/bin/xdg-open 'https://www.ventusky.com/"; on-click-right = "${pkgs.xdg-utils}/bin/xdg-open 'https://wttr.in/${cfg.location}'"; interval = 900; }; mpd = { rotate = 90; max-length = 60; format = "{stateIcon} {artist} - {title}"; format-stopped = "⏹ STOPPED"; state-icons = { paused = ""; playing = ""; }; }; "sway/workspaces" = { disable-scroll = true; }; "clock#1" = { tooltip = false; format = "{:%a}"; }; "clock#2" = { tooltip = false; format = "{:%m-%d}"; }; "clock#3" = { tooltip = false; format = "{:%I:%M %p}"; }; pulseaudio = { format = "{icon} {volume}%"; format-bluetooth = "{icon} {volume}%"; format-muted = "MUTE"; format-icons = { headphone = ""; default = ""; }; on-click = "${pkgs.pulseaudio}/bin/pactl set-source-mute @DEFAULT_SOURCE@ toggle"; on-click-right = "${pkgs.pavucontrol}/bin/pavucontrol"; }; memory = { interval = 10; format = " {}%"; }; cpu = { interval = 10; format = " {usage}%"; }; battery = { states = { good = 90; warning = 25; critical = 10; }; format = "{icon} {capacity}%"; format-icons = [ "" "" "" "" "" ]; }; tray = { icon-size = 18; spacing = 5; }; }; } // cfg.waybarConfig) ]; style = '' window#waybar { background: #${config.colors.base16.base01}; color: #${config.colors.base16.base06}; } #workspaces, #clock.1, #clock.2, #clock.3, #pulseaudio, #memory, #cpu, #battery, #disk, #tray, #mode, #custom-weather-temp, #custom-weather-precip, #custom-weather-wind, #mpd { background: #${config.colors.base16.base00}; padding: 5px 0; margin: 10px 0; } #workspaces { padding: 0 0 5px 0; } #clock.1 { padding: 5px 0 0 0; } #clock.2 { padding: 0 0 5px 0; } #custom-weather-temp { padding: 5px 0 0 0; } #custom-weather-precip { padding: 5px 0; } #custom-weather-wind { padding: 0 0 5px 0; } #mpd.playing { color: #${config.colors.base16.base0A}; } #workspaces button.focused { color: #${config.colors.base16.base0A}; } #workspaces button:hover { background: #${config.colors.base16.base02}; } #pulseaudio { color: #${config.colors.base16.base0B}; } #memory { color: #${config.colors.base16.base0C}; } #cpu { color: #${config.colors.base16.base0D}; } #battery { color: #${config.colors.base16.base0E}; } * { font-family: "${config.fonts.favFont.name}"; font-size: ${toString (config.fonts.favFont.size + 1)}px; border-radius: 0; border: none; } ''; }; programs.mako.enable = lib.mkDefault true; programs.direnv = { enable = lib.mkDefault true; nix-direnv.enable = lib.mkDefault true; stdlib = '' : ''${XDG_CACHE_HOME:=$HOME/.cache} declare -A direnv_layout_dirs direnv_layout_dir() { echo "''${direnv_layout_dirs[$PWD]:=$( echo -n "$XDG_CACHE_HOME"/direnv/layouts/ echo -n "$PWD" | shasum | cut -d ' ' -f 1 )}" } ''; }; services.clipmenu.enable = lib.mkDefault true; colors.enable = lib.mkDefault true; fonts.enable = lib.mkDefault true; programs.chromium = { enable = lib.mkDefault true; package = lib.mkDefault (pkgs.ungoogled-chromium.override { commandLineArgs = "--enable-features=UseOzonePlatform --ozone-platform=wayland"; }); }; services.lorri.enable = lib.mkDefault true; services.blueman-applet = { enable = lib.mkDefault cfg.bluetooth; }; services.mpris-proxy.enable = true; home.sessionVariables = { BW_SESSION = cfg.bitwardenSession; }; services.mpd = { enable = lib.mkDefault true; musicDirectory = lib.mkDefault "${config.home.homeDirectory}/Music"; }; gtk = { enable = lib.mkDefault true; iconTheme = { package = lib.mkDefault cfg.favIcons.package; name = lib.mkDefault cfg.favIcons.name; }; }; qt = { enable = lib.mkDefault true; platformTheme = lib.mkDefault "gtk"; }; programs.kitty = { enable = lib.mkDefault true; settings = { background_opacity = lib.mkDefault "0.80"; dynamic_background_opacity = lib.mkDefault true; }; }; xdg.configFile."neofetch/config.conf".text = let image = builtins.path { name = "nixos_circlejerk.png"; path = ../data/nixos_circlejerk.png; }; in '' image_source="${image}" image_backend="kitty" ''; programs.mpv.config = { enable = lib.mkDefault true; profile = lib.mkDefault "gpu-hq"; ytdl-format = lib.mkDefault "bestvideo+bestaudio"; cache-default = lib.mkDefault 4000000; }; fonts.fontconfig.enable = lib.mkDefault true; home.packages = with pkgs; [ waybar wl-clipboard # important actually, for vim and other things xwayland libappindicator-gtk3 jq ezDrv inputs.mudl.defaultPackage.${pkgs.system} bitwarden-cli kitty pavucontrol mpv yt-dlp maim slop ark notify-osd ffmpeg id3v2 imagemagick mpc_cli nix-index gitAndTools.hub nmap nixpkgs-fmt ]; programs.rofi = { enable = lib.mkDefault true; terminal = lib.mkDefault "${pkgs.kitty}/bin/kitty"; }; }; }