kore / nixos / roles / workstation.nix124 lines · 3185B · raw
1{ inputs, outputs, config, pkgs, lib, ... }:
2
3let
4 roleName = "workstation";
5 roleEnabled = lib.elem roleName config.kore.currentHost.roles;
6in {
7 imports = [ inputs.home-manager.nixosModules.home-manager ];
8
9 config = lib.mkMerge [{} (lib.mkIf roleEnabled {
10 home-manager = {
11 useGlobalPkgs = true;
12 useUserPackages = true;
13 extraSpecialArgs = { inherit inputs outputs; };
14
15 users.lostduk = outputs.homeConfigurations.${config.networking.hostName};
16 };
17
18 xdg.portal = {
19 enable = true;
20 extraPortals = [ pkgs.xdg-desktop-portal-wlr ];
21 configPackages = [ pkgs.xdg-desktop-portal-gtk pkgs.xdg-desktop-portal-wlr ];
22
23 wlr.enable = true;
24
25 config.common = {
26 default = [ "wlr" ];
27 };
28 };
29
30 system.activationScripts.persistent-dirs.text =
31 let
32 mkHomePersist = user: lib.optionalString user.createHome ''
33 mkdir -p /persist/${user.home}
34 chown ${user.name}:${user.group} /persist/${user.home}
35 chmod ${user.homeMode} /persist/${user.home}
36 '';
37 users = lib.attrValues config.users.users;
38 in lib.concatLines (map mkHomePersist users);
39
40 fonts = {
41 enableDefaultPackages = false;
42
43 packages = with pkgs; [
44 noto-fonts-cjk-sans
45 noto-fonts-cjk-serif
46 noto-fonts-color-emoji
47
48 #(nerdfonts.override { fonts = [ "ComicShannsMono" ]; })
49 nerd-fonts.comic-shanns-mono
50 ];
51
52 fontconfig = {
53 hinting.autohint = true;
54
55 defaultFonts = {
56 serif = [ "Noto Serif" "Noto Color Emoji" ];
57 sansSerif = [ "Noto Sans" "Noto Color Emoji" ];
58 monospace = [ "ComicShannsMono Nerd Font" "Noto Color Emoji" ];
59 emoji = [ "Noto Color Emoji" ];
60 };
61 };
62 };
63
64 services = {
65 udisks2.enable = true;
66
67 pipewire = {
68 enable = true;
69
70 alsa.enable = true;
71 alsa.support32Bit = true;
72
73 pulse.enable = true;
74 jack.enable = true;
75
76 wireplumber = {
77 enable = true;
78
79 # https://github.com/NixOS/nixpkgs/pull/292115
80 extraConfig."alsa-lowlatency" = {
81 "monitor.alsa.rules" = [{
82 matches = [{ "node.name" = "~alsa_output.*"; }];
83
84 actions.update-props = {
85 "audio.format" = "S32LE";
86 "audio.rate" = "96000";
87 "api.alsa.period-size" = 2;
88 };
89 }];
90 };
91 };
92
93 extraConfig.pipewire."92-low-latency" = {
94 context = {
95 properties.default.clock = {
96 rate = 48000;
97 quantum = 64;
98 };
99
100 modules = [{
101 name = "libpipewire-module-protocol-pulse";
102
103 args.pulse = {
104 min = {
105 req = "64/48000";
106 quantum = "64/48000";
107 frag = "64/48000";
108 };
109
110 default.req = "64/48000";
111 };
112 }];
113 };
114
115 stream.properties = {
116 node.latency = "64/48000";
117 resample.quality = 1;
118 };
119 };
120 };
121 };
122 })];
123}
124