{ inputs, ... }: { flake.modules.nixos.niri = { pkgs, ... }: { imports = [ inputs.niri.nixosModules.niri ]; nixpkgs.overlays = [ inputs.niri.overlays.niri ]; programs.niri.enable = true; programs.niri.package = pkgs.niri-unstable; programs.dconf.enable = true; services.gvfs.enable = true; services.udisks2.enable = true; xdg.portal.enable = true; }; flake.modules.homeManager.niri = { config, lib, pkgs, ... }: let outputs = lib.mapAttrs ( _: display: { position = { x = display.x; y = display.y; }; } // lib.optionalAttrs (display.primary or false) { "focus-at-startup" = true; } // lib.optionalAttrs (display ? scale) { inherit (display) scale; } // lib.optionalAttrs (display ? mode) { inherit (display) mode; } ) config.meta.host.displays; rawTerminalAttrPath = lib.splitString "." config.meta.user.terminalPackageAttr; terminalAttrPath = if rawTerminalAttrPath != [ ] && builtins.head rawTerminalAttrPath == "pkgs" then builtins.tail rawTerminalAttrPath else rawTerminalAttrPath; terminalPackage = lib.attrByPath terminalAttrPath null pkgs; hasMainProgram = terminalPackage != null && terminalPackage ? meta.mainProgram; in { assertions = [ { assertion = terminalPackage != null; message = "Unknown terminal package `${config.meta.user.terminalPackageAttr}` for user `${config.meta.user.name}`."; } { assertion = hasMainProgram; message = "Terminal package `${config.meta.user.terminalPackageAttr}` must define `meta.mainProgram`."; } ]; home.sessionVariables.NIXOS_OZONE_WL = "1"; dconf.settings = { "org/gnome/desktop/interface" = { color-scheme = "prefer-dark"; }; }; home.packages = with pkgs; [ playerctl nautilus brightnessctl xwayland-satellite ]; programs.niri.settings = { inherit outputs; environment.DISPLAY = ":0"; spawn-at-startup = [ { command = [ "xwayland-satellite" ]; } { command = [ "noctalia-shell" ]; } { command = [ "qbittorrent" ]; } ]; prefer-no-csd = true; hotkey-overlay.skip-at-startup = true; screenshot-path = "${config.xdg.userDirs.pictures}/screenshots/%Y-%m-%dT%H:%M:%S.png"; animations.slowdown = 0.6; cursor = with config.home.pointerCursor; { size = size; theme = name; hide-after-inactive-ms = 3000; hide-when-typing = true; }; layout = { always-center-single-column = true; gaps = 14; focus-ring.enable = false; default-column-width.proportion = 1. / 2.; border = { enable = true; width = 3; active.color = "#7E9CD8"; inactive.color = "#54546D"; urgent.color = "#E82424"; }; }; window-rules = [ { geometry-corner-radius = let radius = 10.0; in { bottom-left = radius; bottom-right = radius; top-left = radius; top-right = radius; }; clip-to-geometry = true; } ]; debug.honor-xdg-activation-with-invalid-serial = true; input = { focus-follows-mouse.enable = true; keyboard = { repeat-delay = 300; repeat-rate = 50; xkb.options = "caps:escape"; }; mouse.accel-speed = 0.4; }; binds = if hasMainProgram then import ./_bindings.nix { inherit lib terminalPackage ; } else { }; }; }; }