diff options
Diffstat (limited to 'sys/seat')
| -rw-r--r-- | sys/seat/default.nix | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/sys/seat/default.nix b/sys/seat/default.nix new file mode 100644 index 0000000..402047f --- /dev/null +++ b/sys/seat/default.nix @@ -0,0 +1,142 @@ +{ + 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; + }; + + security.rtkit.enable = true; + + services = { + pipewire = { + enable = true; + + alsa = { + enable = true; + support32Bit = true; + }; + + jack.enable = true; + pulse.enable = true; + wireplumber.enable = true; + }; + + pulseaudio.enable = false; + }; + + 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; + + gtklock = { + enable = true; + + config = {}; + modules = []; + }; + }; + + 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; + }) + ]); +} |
