summaryrefslogtreecommitdiff
path: root/sys/seat
diff options
context:
space:
mode:
Diffstat (limited to 'sys/seat')
-rw-r--r--sys/seat/default.nix131
1 files changed, 131 insertions, 0 deletions
diff --git a/sys/seat/default.nix b/sys/seat/default.nix
new file mode 100644
index 0000000..be545e8
--- /dev/null
+++ b/sys/seat/default.nix
@@ -0,0 +1,131 @@
+{ 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;
+ })
+ ]);
+}