main
  1{
  2  pkgs,
  3  config,
  4  ...
  5}:
  6{
  7  imports = [
  8    ./tiling-common.nix
  9  ];
 10
 11  environment.systemPackages = with pkgs; [
 12    xwayland-satellite
 13    wlogout
 14  ];
 15
 16  xdg.portal = {
 17    config.niri = {
 18      default = [
 19        "gnome"
 20        "gtk"
 21      ];
 22      "org.freedesktop.impl.portal.Access" = "gtk";
 23      "org.freedesktop.impl.portal.Notification" = "gtk";
 24      "org.freedesktop.impl.portal.Secret" = "gnome-keyring";
 25      "org.freedesktop.impl.portal.FileChooser" = "gtk";
 26      "org.freedesktop.impl.portal.ScreenCast" = "gnome";
 27      "org.freedesktop.portal.ScreenCast" = "gnome";
 28    };
 29  };
 30
 31  # Allow swaylock to unlock the computer for us
 32  security.pam.services.swaylock = {
 33    text = "auth include login";
 34  };
 35
 36  programs.niri.enable = true;
 37
 38  # Fix: upstream niri.service uses bare "niri" which systemd can't resolve.
 39  # Override with full store path.
 40  systemd.user.services.niri = {
 41    serviceConfig.ExecStart = [
 42      "" # clear the upstream ExecStart
 43      "${pkgs.niri}/bin/niri --session"
 44    ];
 45    # Ensure spawn-at-startup can find user-profile binaries (waybar, mako, etc.)
 46    # The upstream service sets a minimal PATH that excludes user profiles.
 47    path = [
 48      "/run/wrappers"
 49      "/etc/profiles/per-user/vincent"
 50      "/run/current-system/sw"
 51    ];
 52  };
 53
 54  # Expose wayland-sessions to greetd so ReGreet can discover niri-session
 55  systemd.services.greetd.environment.XDG_DATA_DIRS =
 56    "${config.services.displayManager.sessionData.desktops}/share";
 57
 58  # Pre-seed ReGreet state so "Niri" is auto-selected in the session dropdown.
 59  # Without this, the session combo box is populated but nothing is selected
 60  # because regreet only auto-selects from cache (which is empty on first boot).
 61  system.activationScripts.regreet-state.text = ''
 62    if [ ! -f /var/lib/regreet/state.toml ]; then
 63      mkdir -p /var/lib/regreet
 64      printf 'last_user = "vincent"\n\n[user_to_last_sess]\nvincent = "Niri"\n' > /var/lib/regreet/state.toml
 65      chown greeter:greeter /var/lib/regreet/state.toml
 66    fi
 67  '';
 68
 69  # ReGreet greeter (runs under cage via greetd)
 70  # Unlocks gnome-keyring via PAM on login
 71  programs.regreet = {
 72    enable = true;
 73    cageArgs = [
 74      "-s"
 75      "-m"
 76      "last"
 77    ];
 78    settings = {
 79      background = {
 80        path = "/etc/greetd/wallpaper.jpg";
 81        fit = "Cover";
 82      };
 83      GTK.application_prefer_dark_theme = true;
 84      appearance.greeting_msg = "Welcome back!";
 85    };
 86    theme = {
 87      name = "Arc-Dark";
 88      package = pkgs.arc-theme;
 89    };
 90    iconTheme = {
 91      name = "Arc";
 92      package = pkgs.arc-icon-theme;
 93    };
 94    cursorTheme = {
 95      name = "Qogir";
 96      package = pkgs.qogir-icon-theme;
 97    };
 98    font = {
 99      name = "JetBrains Mono";
100      package = pkgs.jetbrains-mono;
101      size = 14;
102    };
103  };
104}