nixfiles/modules/ezpc.nix
2021-05-02 20:14:55 -07:00

210 lines
5.7 KiB
Nix

{ 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 ];
};
boot.initrd.kernelModules = 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 = "wine64"; wineRelease = "staging"; });
newwinetricks = pkgs.winetricks.override { wine = newwine; };
oldwine64 = (pkgs.wineFull.override { wineBuild = "wine64"; });
oldwine64tricks = pkgs.winetricks.override { wine = oldwine64; };
in
with pkgs; ([
xlibs.xf86inputjoystick
oldwine64
oldwine64tricks
wineFull
(winetricks.override { wine = wineFull; })
] ++ (if !cfg.flatSteam then [
steam
steam-run
(writeScriptBin "steam-run-native" ''
#!${pkgs.stdenv.shell}
${(steam.override { nativeOnly = true; }).run}/bin/steam-run $@
'')
] else [
# steam-run-native
]) ++ (
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";
};
flatSteam = mkOption {
type = types.bool;
default = false;
description = "If you use the flatpak Steam instead of NixOS";
};
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)
]
);
}