{ config, lib, pkgs, ... }: let cfg = config.desktop; defaultWaylandPackages = with pkgs; [ brightnessctl cliphist foot grim libnotify mako networkmanagerapplet playerctl polkit_gnome pavucontrol rofi slurp waybar wl-clipboard xdg-utils ]; defaultSwayPackages = defaultWaylandPackages ++ (with pkgs; [ pulseaudio swayidle swaylock wmenu ]); resolvedDisplayManager = if cfg.displayManager != "auto" then cfg.displayManager else if cfg.gnome.enable then "gdm" else if cfg.xfce.enable then "lightdm" else "none"; in { options.desktop = { displayManager = lib.mkOption { type = lib.types.enum ["auto" "none" "gdm" "lightdm" "ly"]; default = "auto"; description = '' Display manager to enable. In auto mode, GDM is used when GNOME is enabled, LightDM is used when XFCE is enabled, and no display manager is enabled for compositor-only configurations. ''; }; gnome.enable = lib.mkEnableOption "the vanilla GNOME desktop environment"; xfce.enable = lib.mkEnableOption "the vanilla XFCE desktop environment"; sway = { enable = lib.mkEnableOption "the Sway Wayland compositor"; extraPackages = lib.mkOption { type = with lib.types; listOf package; default = defaultSwayPackages; defaultText = lib.literalExpression '' with pkgs; [ brightnessctl cliphist foot grim libnotify mako networkmanagerapplet playerctl polkit_gnome pulseaudio pavucontrol rofi slurp swayidle swaylock waybar wl-clipboard wmenu xdg-utils ] ''; description = "Packages installed alongside Sway."; }; }; hyprland = { enable = lib.mkEnableOption "the Hyprland Wayland compositor"; extraPackages = lib.mkOption { type = with lib.types; listOf package; default = defaultWaylandPackages; defaultText = lib.literalExpression '' with pkgs; [ brightnessctl cliphist foot grim libnotify mako networkmanagerapplet playerctl polkit_gnome pavucontrol rofi slurp waybar wl-clipboard xdg-utils ] ''; description = '' Packages installed alongside Hyprland. Hyprlock and Hypridle are enabled separately so their NixOS integration, including PAM, is configured as well. ''; }; }; }; config = lib.mkMerge [ (lib.mkIf cfg.gnome.enable { services.desktopManager.gnome.enable = true; }) (lib.mkIf cfg.xfce.enable { services.xserver = { enable = true; desktopManager.xfce.enable = true; }; }) (lib.mkIf cfg.sway.enable { programs.sway = { enable = true; wrapperFeatures.gtk = true; extraPackages = cfg.sway.extraPackages; }; }) (lib.mkIf cfg.hyprland.enable { programs = { hyprland.enable = true; hyprlock.enable = lib.mkDefault true; }; environment.systemPackages = cfg.hyprland.extraPackages; }) (lib.mkIf (resolvedDisplayManager == "gdm") { services.displayManager.gdm.enable = true; }) (lib.mkIf (resolvedDisplayManager == "lightdm") { services.xserver = { enable = true; displayManager.lightdm.enable = true; }; }) (lib.mkIf (resolvedDisplayManager == "ly") { services.displayManager.ly.enable = true; }) ]; }