{ config, lib, pkgs, ... }: with lib; let cfg = config.workstation; in { options.workstation = { enable = mkEnableOption "make my computer work"; user = mkOption { type = types.str; description = "The main user of this PC"; }; battery = mkOption { type = types.bool; default = false; description = "If this device has a battery"; }; }; config = mkIf cfg.enable { services.avahi = { enable = true; nssmdns = true; }; services.ezpw.enable = lib.mkDefault true; security.pam.services = { swaylock.text = '' auth include login ''; }; services.thermald.enable = lib.mkDefault true; boot.kernelParams = lib.optional cfg.battery "iwlwifi.power_save=Y"; # Don't kill the battery services.upower = { enable = true; percentageLow = 15; percentageCritical = 10; percentageAction = 5; }; # Make battery usage sane services.tlp = { enable = lib.mkDefault cfg.battery; settings = { DISK_IOSCHED = "bfq bfq"; PCIE_ASPM_ON_BAT = "powersupersave"; PCIE_ASPM_ON_AC = "default"; PLATFORM_PROFILE_ON_BAT = lib.mkDefault "low-power"; PLATFORM_PROFILE_ON_AC = lib.mkDefault "performance"; CPU_SCALING_GOVERNOR_ON_BAT = lib.mkOverride 900 "powersave"; CPU_SCALING_GOVERNOR_ON_AC = lib.mkOverride 900 "performance"; CPU_ENERGY_PERF_POLICY_ON_BAT = lib.mkDefault "power"; CPU_ENERGY_PERF_POLICY_ON_AC = lib.mkDefault "performance"; CPU_BOOST_ON_BAT = lib.mkDefault 0; CPU_BOOST_ON_AC = lib.mkDefault 1; CPU_HWP_DYN_BOOST_ON_BAT = lib.mkDefault 0; CPU_HWP_DYN_BOOST_ON_AC = lib.mkDefault 1; SCHED_POWERSAVE_ON_BAT = lib.mkDefault 0; SCHED_POWERSAVE_ON_AC = lib.mkDefault 1; CPU_MIN_PERF_ON_BAT = lib.mkDefault 0; CPU_MAX_PERF_ON_BAT = lib.mkDefault 30; CPU_MIN_PERF_ON_AC = lib.mkDefault 0; CPU_MAX_PERF_ON_AC = lib.mkDefault 100; }; }; # Video support hardware.opengl = { enable = true; # Fix steam driSupport32Bit = true; # Other drivers extraPackages = with pkgs; [ intel-media-driver vaapiIntel vaapiVdpau libvdpau-va-gl ]; }; # Support for steam hardware hardware.steam-hardware.enable = lib.mkDefault true; # Needed for lots of controller stuff hardware.uinput.enable = lib.mkDefault true; # proton esync systemd.extraConfig = "DefaultLimitNOFILE=1048576"; security.pam.loginLimits = [ { domain = "*"; type = "hard"; item = "nofile"; value = "1048576"; } ]; # the user should have some basic permissions lol users.users."${cfg.user}" = { extraGroups = [ "adbusers" "audio" "video" "libvirtd" "sway" "wheel" "networkmanager" "docker" "input" "uinput" ]; subUidRanges = [ { startUid = 100000; count = 65536; } ]; subGidRanges = [ { startGid = 100000; count = 65536; } ]; }; # brightness programs.light.enable = lib.mkDefault true; # make fonts not fucked up fonts.fontconfig.enable = lib.mkDefault true; fonts.enableDefaultFonts = lib.mkDefault true; # Important for steam fonts.fontconfig.cache32Bit = lib.mkDefault true; services.xserver = { dpi = lib.mkDefault 96; layout = lib.mkDefault "us"; libinput.enable = lib.mkDefault true; }; # this helps with some compatibility hardware.pulseaudio.daemon.config = { "default-sample-rate" = "48000"; }; # networking.networkmanager.ethernet.macAddress = "random"; networking.networkmanager.wifi.macAddress = lib.mkDefault "random"; networking.networkmanager.wifi.scanRandMacAddress = lib.mkDefault true; # Used for chromecast bullshit networking.firewall.allowedUDPPortRanges = [ { from = 32768; to = 60999; } ]; # Used for upnp or something? networking.firewall.allowedUDPPorts = [ 1900 ]; # Shit breaks without this lol programs.dconf.enable = lib.mkDefault true; # better default swap boot.kernel.sysctl = { "vm.swappiness" = lib.mkDefault 45; }; # you probably want this system wide? environment.systemPackages = with pkgs; [ exfat ]; # self explanatory fuckingprint.enable = lib.mkDefault true; # Pulseaudio is off by defaultm but if you want it, make it work right hardware.pulseaudio.support32Bit = lib.mkDefault true; hardware.pulseaudio.zeroconf.discovery.enable = lib.mkDefault true; hardware.pulseaudio.package = pkgs.pulseaudioFull; hardware.pulseaudio.extraModules = [ pkgs.pulseaudio-modules-bt ]; hardware.pulseaudio.extraConfig = '' load-module module-dbus-protocol ''; # bluetooth services.blueman.enable = lib.mkDefault true; hardware.bluetooth.enable = lib.mkDefault true; hardware.bluetooth.settings.General.Enable = "Source,Sink,Media,Socket"; }; }