{ lib, config, pkgs, ... }: with lib; let cfg = config.roles.desktop; basePackages = with pkgs; [ brightnessctl mangohud # Should probably get refactored with steam/gamescope out to a gaming role modrinth-app protonup-qt ]; x11BasePackages = with pkgs; [ ]; x11OnlyPackages = with pkgs; [ emacs ]; waylandBasePackages = with pkgs; [ grim slurp wl-clipboard mako ]; waylandOnlyPackages = with pkgs; [ emacs-gtk ]; in { options.roles.desktop = { enable = mkEnableOption "Enable the desktop role"; x11Only = mkOption { type = types.bool; default = false; }; }; config = mkIf cfg.enable { services.xserver.xkb = { layout = "us"; variant = ""; options = "caps:escape"; }; services.xserver.enable = true; services.displayManager.sddm = { enable = true; wayland.enable = !cfg.x11Only; }; services.desktopManager.plasma6.enable = true; services.xserver.windowManager.i3 = { enable = true; extraPackages = with pkgs; [ dmenu i3status i3lock ]; }; programs.dconf.enable = true; services.gnome.gnome-keyring.enable = true; programs.sway = mkIf (!cfg.x11Only) { enable = true; wrapperFeatures.gtk = true; }; programs.light.enable = mkIf (!cfg.x11Only) true; programs.kdeconnect.enable = true; programs.java.enable = true; programs.gamemode = { enable = true; }; programs.gamescope = { enable = true; #capSysNice = true; args = [ #"--adaptive-sync" #"--nested-refresh 165" #"--backend wayland" "--hdr-enabled" "--hdr-itm-enable" "--hdr-debug-force-output" "--mangoapp" "--rt" "--steam" #"--xwayland-count 2" ]; env = { #PROTON_DISABLE_NVAPI = "1"; MANGOHUD = "1"; #MANGOHUD_CONFIG = "cpu_temp gpu_temp ram vram"; }; }; programs.steam = { enable = true; remotePlay.openFirewall = true; localNetworkGameTransfers.openFirewall = true; gamescopeSession = { enable = true; }; extraCompatPackages = with pkgs; [ proton-ge-bin ]; #package = pkgs.steam.override { #withJava = true; #withPrimus = true; #extraPkgs = pkgs: [ bumblebee glxinfo ]; #}; }; services.sunshine = { enable = true; autoStart = true; capSysAdmin = true; openFirewall = true; }; virtualisation.docker.enable = true; users.extraGroups.docker.members = [ "johno" ]; environment.systemPackages = with pkgs; mkMerge [ basePackages x11BasePackages (mkIf cfg.x11Only x11OnlyPackages) # TODO: Do we need a "wayland only" mode? (mkIf (!cfg.x11Only) waylandBasePackages) (mkIf (!cfg.x11Only) waylandOnlyPackages) ]; }; }