{ config, lib, pkgs, ... }: with lib; let cfg = config.ezpc; mainConfig = { services.thermald.enable = true; environment.etc."chromium/policies/managed/policies.json".text = '' { "NewTabPageLocation": "https://wizbos.club/" } ''; workstation.enable = true; workstation.user = cfg.user; networking.firewall.allowedTCPPorts = [ 22 ]; networking.firewall.allowedUDPPorts = [ 1900 ]; hardware.pulseaudio.enable = lib.mkDefault (!cfg.portals); services.pipewire.enable = lib.mkDefault cfg.portals; services.pipewire.jack.enable = lib.mkDefault cfg.portals; services.pipewire.alsa.enable = lib.mkDefault cfg.portals; services.pipewire.alsa.support32Bit = lib.mkDefault cfg.portals; services.pipewire.pulse.enable = lib.mkDefault cfg.portals; xdg.portal.enable = lib.mkDefault cfg.portals; xdg.portal.gtkUsePortal = lib.mkDefault cfg.portals; xdg.portal.extraPortals = lib.mkDefault (if cfg.portals then with pkgs; [ xdg-desktop-portal-wlr xdg-desktop-portal-gtk ] else []); # https://github.com/NixOS/nixpkgs/issues/108855 systemd.user.services.xdg-desktop-portal.environment = lib.mkDefault (lib.mkIf cfg.portals { XDG_DESKTOP_PORTAL_DIR = config.environment.variables.XDG_DESKTOP_PORTAL_DIR; }); # let me use audio and phones programs.adb.enable = cfg.developer; # Set some X11 props services.xserver = { enable = lib.mkDefault (cfg.gfx == "nvidia"); layout = lib.mkDefault "us"; libinput.enable = true; # automatic gfx drivers videoDrivers = mkIf (cfg.gfx != null) [ cfg.gfx ]; }; security.pam.services = { swaylock.text = '' auth include login ''; }; }; notBatteryConfig = { powerManagement.cpuFreqGovernor = lib.mkDefault "ondemand"; }; batteryConfig = { services.upower = { enable = true; percentageLow = 15; percentageCritical = 10; percentageAction = 5; }; services.tlp.enable = true; services.tlp.extraConfig = '' TLP_ENABLE=1 CPU_SCALING_GOVERNOR_ON_BAT=powersave CPU_SCALING_GOVERNOR_ON_AC=ondemand CPU_BOOST_ON_BAT=0 CPU_BOOST_ON_AC=1 CPU_MIN_PERF_ON_BAT=0 CPU_MAX_PERF_ON_BAT=30 CPU_MIN_PERF_ON_AC=0 CPU_MAX_PERF_ON_AC=100 CPU_ENERGY_PERF_POLICY_ON_BAT=power CPU_ENERGY_PERF_POLICY_ON_AC=ondemand ''; }; gamingConfig = { environment.systemPackages = let steam = pkgs.steam.override { withJava = true; }; steam-run = steam.run; newwine = (pkgs.wineFull.override { wineBuild = "wineWow"; wineRelease = "staging"; }); newwinetricks = pkgs.winetricks.override { wine = newwine; }; oldwine = (pkgs.wineFull.override { wineBuild = "wineWow"; }); oldwinetricks = pkgs.winetricks.override { wine = oldwine; }; in with pkgs; ([ steam steam-run xlibs.xf86inputjoystick oldwine oldwinetricks (writeScriptBin "steam-run-native" '' #!${pkgs.stdenv.shell} ${(steam.override { nativeOnly = true; }).run}/bin/steam-run $@ '') ] ++ ( if cfg.newWine then [ ( pkgs.runCommand "new-wine-stuff" { } '' mkdir -p $out/bin ln -s ${newwine}/bin/wine $out/bin/new-wine ln -s ${newwine}/bin/winecfg $out/bin/new-winecfg ln -s ${newwinetricks}/bin/winetricks $out/bin/new-winetricks '' ) ] else [ ] )); }; in { options.ezpc = { enable = mkEnableOption "Enable simple PC config"; battery = mkOption { type = types.bool; default = false; description = "If this device has a battery"; }; portals = mkOption { type = types.bool; default = false; description = "use weird new hipster portal shit"; }; user = mkOption { type = types.str; description = "The main user of this PC"; }; gaming = mkOption { type = types.bool; default = false; description = "If this PC is used for gaming"; }; touchscreen = mkOption { type = types.bool; default = false; description = "If this PC has a touchscreen"; }; gfx = mkOption { type = types.nullOr types.str; default = null; description = "Type of your PC's graphics card"; example = "intel"; }; print = mkOption { type = types.bool; default = false; description = "If this PC should support printing/scanning"; }; developer = mkOption { type = types.bool; default = true; description = "Should enable advanced shit for developers"; }; bluetooth = mkOption { type = types.bool; default = false; description = "If this PC has bluetooth support"; }; tiling = mkOption { type = types.bool; default = true; description = "If you are based and redpilled, and want a tiling WM (deprecated, default)"; }; newWine = mkOption { type = types.bool; default = false; description = "If you want to include wine-staging as new-wine"; }; }; config = mkIf cfg.enable ( mkMerge [ mainConfig (mkIf cfg.gaming gamingConfig) (mkIf cfg.battery batteryConfig) (mkIf (cfg.battery != true) notBatteryConfig) ] ); }