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