57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 1 | { |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 2 | inputs = { |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 3 | nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 4 | crane.url = "github:ipetkov/crane"; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 5 | }; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 6 | |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 7 | outputs = |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 8 | { |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 9 | self, |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 10 | nixpkgs, |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 11 | crane, |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 12 | }: |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 13 | let |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 14 | lib = nixpkgs.lib; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 15 | systems = [ |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 16 | "x86_64-linux" |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 17 | "aarch64-linux" |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 18 | ]; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 19 | forAllSystems = f: lib.genAttrs systems (system: f nixpkgs.legacyPackages.${system}); |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 20 | |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 21 | mkProject = |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 22 | pkgs: |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 23 | let |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 24 | craneLib = crane.mkLib pkgs; |
824bf02b6e55 | atagen | 2026-10-16 09:15 UTC | 25 | src = lib.cleanSourceWith { |
824bf02b6e55 | atagen | 2026-10-16 09:15 UTC | 26 | src = ./.; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 27 | filter = |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 28 | path: type: |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 29 | (craneLib.filterCargoSources path type) || lib.hasInfix "/shaders" path || lib.hasInfix "/res" path; |
824bf02b6e55 | atagen | 2026-10-16 09:15 UTC | 30 | name = "source"; |
824bf02b6e55 | atagen | 2026-10-16 09:15 UTC | 31 | }; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 32 | lavapipeIcd = "${pkgs.mesa}/share/vulkan/icd.d/lvp_icd.${pkgs.stdenv.hostPlatform.parsed.cpu.name}.json"; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 33 | commonArgs = { |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 34 | inherit src; |
b563d2da1c80 | atagen | 2026-10-16 08:25 UTC | 35 | pname = "monolith"; |
b563d2da1c80 | atagen | 2026-10-16 08:25 UTC | 36 | version = "0.0.0"; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 37 | strictDeps = true; |
824bf02b6e55 | atagen | 2026-10-16 09:15 UTC | 38 | nativeBuildInputs = [ |
824bf02b6e55 | atagen | 2026-10-16 09:15 UTC | 39 | pkgs.pkg-config |
824bf02b6e55 | atagen | 2026-10-16 09:15 UTC | 40 | pkgs.glslang |
824bf02b6e55 | atagen | 2026-10-16 09:15 UTC | 41 | ]; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 42 | buildInputs = with pkgs; [ |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 43 | libxkbcommon |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 44 | vulkan-loader |
0c1685f1d412 | atagen | 2026-10-16 12:18 UTC | 45 | libinput |
0c1685f1d412 | atagen | 2026-10-16 12:18 UTC | 46 | seatd |
0c1685f1d412 | atagen | 2026-10-16 12:18 UTC | 47 | libgbm |
0c1685f1d412 | atagen | 2026-10-16 12:18 UTC | 48 | libdrm |
0c1685f1d412 | atagen | 2026-10-16 12:18 UTC | 49 | udev |
5d5ec436eb31 | atagen | 2026-10-19 08:38 UTC | 50 | dbus |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 51 | ]; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 52 | }; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 53 | cargoArtifacts = craneLib.buildDepsOnly commonArgs; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 54 | in |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 55 | { |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 56 | inherit craneLib lavapipeIcd commonArgs; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 57 | |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 58 | package = craneLib.buildPackage ( |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 59 | commonArgs |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 60 | // { |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 61 | inherit cargoArtifacts; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 62 | doCheck = false; |
14c8fedad3a3 | atagen | 2026-10-16 22:30 UTC | 63 | postInstall = '' |
14c8fedad3a3 | atagen | 2026-10-16 22:30 UTC | 64 | install -Dm644 res/monolith-portals.conf -t $out/share/xdg-desktop-portal |
14c8fedad3a3 | atagen | 2026-10-16 22:30 UTC | 65 | install -Dm644 res/monolith.desktop -t $out/share/wayland-sessions |
14c8fedad3a3 | atagen | 2026-10-16 22:30 UTC | 66 | ''; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 67 | # ash opens libvulkan at runtime, so it is not in the linked rpath. |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 68 | postFixup = '' |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 69 | patchelf --add-rpath ${lib.makeLibraryPath [ pkgs.vulkan-loader ]} $out/bin/monolith |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 70 | ''; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 71 | passthru.providedSessions = [ "monolith" ]; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 72 | meta = { |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 73 | description = "A tiling Wayland compositor"; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 74 | license = lib.licenses.eupl12; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 75 | platforms = lib.platforms.linux; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 76 | mainProgram = "monolith"; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 77 | }; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 78 | } |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 79 | ); |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 80 | |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 81 | checks = { |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 82 | clippy = craneLib.cargoClippy ( |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 83 | commonArgs |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 84 | // { |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 85 | inherit cargoArtifacts; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 86 | cargoClippyExtraArgs = "--all-targets -- --deny warnings"; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 87 | } |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 88 | ); |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 89 | fmt = craneLib.cargoFmt { |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 90 | inherit src; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 91 | pname = "monolith"; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 92 | version = "0.0.0"; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 93 | }; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 94 | test = craneLib.cargoTest ( |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 95 | commonArgs |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 96 | // { |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 97 | inherit cargoArtifacts; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 98 | VK_DRIVER_FILES = lavapipeIcd; |
824bf02b6e55 | atagen | 2026-10-16 09:15 UTC | 99 | LD_LIBRARY_PATH = lib.makeLibraryPath [ pkgs.vulkan-loader ]; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 100 | } |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 101 | ); |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 102 | }; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 103 | }; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 104 | nixosModule = |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 105 | { |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 106 | config, |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 107 | lib, |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 108 | pkgs, |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 109 | ... |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 110 | }: |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 111 | let |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 112 | inherit (lib) |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 113 | getExe |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 114 | literalExpression |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 115 | mkDefault |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 116 | mkEnableOption |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 117 | mkIf |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 118 | mkOption |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 119 | optional |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 120 | types |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 121 | ; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 122 | |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 123 | cfg = config.programs.monolith; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 124 | in |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 125 | { |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 126 | options.programs.monolith = { |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 127 | enable = mkEnableOption "monolith, a tiling Wayland compositor"; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 128 | |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 129 | package = mkOption { |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 130 | type = types.package; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 131 | default = (mkProject pkgs).package; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 132 | defaultText = literalExpression "monolith.packages.\${system}.default"; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 133 | description = "The monolith package to use."; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 134 | }; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 135 | |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 136 | realtime-scheduling = mkOption { |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 137 | type = types.bool; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 138 | default = true; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 139 | description = '' |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 140 | Wrap the monolith binary with CAP_SYS_NICE so its compositor thread runs |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 141 | SCHED_RR and its Vulkan queue gets realtime global priority. monolith clears |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 142 | the capability from everything it launches. |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 143 | ''; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 144 | }; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 145 | |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 146 | xwayland.enable = mkEnableOption "Xwayland, started on the first X11 client" // { |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 147 | default = true; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 148 | }; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 149 | }; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 150 | |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 151 | config = mkIf cfg.enable { |
3b180fd69834 | atagen | 2026-10-17 10:40 UTC | 152 | environment.systemPackages = optional (!cfg.realtime-scheduling) cfg.package; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 153 | |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 154 | programs = { |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 155 | dconf.enable = mkDefault true; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 156 | xwayland.enable = mkIf cfg.xwayland.enable (mkDefault true); |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 157 | }; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 158 | |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 159 | security = { |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 160 | polkit.enable = true; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 161 | pam.services.swaylock = { }; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 162 | |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 163 | wrappers = mkIf cfg.realtime-scheduling { |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 164 | monolith = { |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 165 | owner = "root"; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 166 | group = "root"; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 167 | permissions = "a+rx"; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 168 | source = getExe cfg.package; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 169 | capabilities = "cap_sys_nice+p"; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 170 | }; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 171 | }; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 172 | }; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 173 | |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 174 | xdg.portal = { |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 175 | enable = mkDefault true; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 176 | configPackages = mkDefault [ cfg.package ]; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 177 | extraPortals = [ |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 178 | pkgs.xdg-desktop-portal-gtk |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 179 | pkgs.xdg-desktop-portal-wlr |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 180 | ]; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 181 | }; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 182 | |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 183 | services.displayManager.sessionPackages = [ cfg.package ]; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 184 | }; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 185 | }; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 186 | in |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 187 | { |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 188 | packages = forAllSystems (pkgs: { |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 189 | default = (mkProject pkgs).package; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 190 | }); |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 191 | |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 192 | overlays.default = final: _: { monolith = (mkProject final).package; }; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 193 | |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 194 | nixosModules.default = nixosModule; |
e1a086bc100d | atagen | 2026-10-17 06:25 UTC | 195 | |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 196 | checks = forAllSystems (pkgs: (mkProject pkgs).checks); |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 197 | |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 198 | devShells = forAllSystems ( |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 199 | pkgs: |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 200 | let |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 201 | project = mkProject pkgs; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 202 | in |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 203 | { |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 204 | default = project.craneLib.devShell { |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 205 | inputsFrom = [ project.package ]; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 206 | packages = with pkgs; [ |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 207 | rust-analyzer |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 208 | vulkan-tools |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 209 | vulkan-validation-layers |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 210 | tracy |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 211 | ]; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 212 | LD_LIBRARY_PATH = lib.makeLibraryPath [ pkgs.vulkan-loader ]; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 213 | LAVAPIPE_ICD = project.lavapipeIcd; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 214 | }; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 215 | } |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 216 | ); |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 217 | |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 218 | formatter = forAllSystems (pkgs: pkgs.nixfmt); |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 219 | }; |
57f44a63d99f | atagen | 2026-10-16 05:34 UTC | 220 | } |