{ config, lib, pkgs, ... }: with lib; let cfg = config.local.seat; users = filterAttrs (_: user: user.install) config.local.users; in { options.local.seat = { enable = mkEnableOption "user seat"; graphical = mkOption { type = types.bool; default = false; }; wayland = mkOption { type = types.bool; default = true; }; videoDrivers = mkOption { type = with types; listOf str; }; }; config = mkIf cfg.enable (mkMerge [ ({ hardware = { acpilight.enable = true; pulseaudio.enable = false; }; security.rtkit.enable = true; services.pipewire = { enable = true; alsa = { enable = true; support32Bit = true; }; jack.enable = true; pulse.enable = true; wireplumber.enable = true; }; users = { groups = mapAttrs (_: user: { inherit (user) gid; }) users // { adbusers.gid = 1008; }; users = mapAttrs (username: user: { isNormalUser = true; inherit (user) uid; description = user.gecos; group = username; extraGroups = [ "users" ] ++ user.groups; shell = if user.allowLogin then pkgs.zsh else null; }) users; }; }) (mkIf cfg.graphical { environment = { sessionVariables.NIXOS_OZONE_WL = "1"; systemPackages = with pkgs; [ qt5.qtwayland qt6.qtwayland ]; }; hardware.graphics.enable = true; programs.dconf.enable = true; security.pam.services.swaylock = { }; services = { libinput.enable = true; udev.packages = with pkgs; [ pkgs.android-udev-rules ]; xserver = mkIf (!cfg.wayland) { enable = true; videoDrivers = cfg.videoDrivers ++ [ "modesetting" "fbdev" ]; displayManager.startx.enable = mkDefault true; }; }; xdg.portal = { enable = true; wlr.enable = true; extraPortals = [ pkgs.xdg-desktop-portal-gtk ]; xdgOpenUsePortal = true; # warning: xdg-desktop-portal 1.17 reworked how portal implementations are loaded, you # should either set `xdg.portal.config` or `xdg.portal.configPackages` # to specify which portal backend to use for the requested interface. # # https://github.com/flatpak/xdg-desktop-portal/blob/1.18.1/doc/portals.conf.rst.in # # If you simply want to keep the behaviour in < 1.17, which uses the first # portal implementation found in lexicographical order, use the following: # # xdg.portal.config.common.default = "*"; config.common.default = "*"; }; users.groups.adbusers.gid = 1008; }) ]); }