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}