1{
2 lib,
3 pkgs,
4 config,
5 utils,
6 ...
7}:
8
9let
10 inherit (lib)
11 concatMapStrings
12 literalExpression
13 mkDefault
14 mkEnableOption
15 mkIf
16 mkOption
17 types
18 ;
19
20 cfg = config.services.xserver.desktopManager.budgie;
21
22 nixos-background-light = pkgs.nixos-artwork.wallpapers.nineish;
23 nixos-background-dark = pkgs.nixos-artwork.wallpapers.nineish-dark-gray;
24
25 nixos-gsettings-overrides = pkgs.budgie-gsettings-overrides.override {
26 inherit (cfg) extraGSettingsOverrides extraGSettingsOverridePackages;
27 inherit nixos-background-dark nixos-background-light;
28 };
29
30 nixos-background-info = pkgs.writeTextFile {
31 name = "nixos-background-info";
32 text = ''
33 <?xml version="1.0"?>
34 <!DOCTYPE wallpapers SYSTEM "gnome-wp-list.dtd">
35 <wallpapers>
36 <wallpaper deleted="false">
37 <name>Nineish</name>
38 <filename>${nixos-background-light.gnomeFilePath}</filename>
39 <options>zoom</options>
40 <shade_type>solid</shade_type>
41 <pcolor>#d1dcf8</pcolor>
42 <scolor>#e3ebfe</scolor>
43 </wallpaper>
44 <wallpaper deleted="false">
45 <name>Nineish Dark Gray</name>
46 <filename>${nixos-background-dark.gnomeFilePath}</filename>
47 <options>zoom</options>
48 <shade_type>solid</shade_type>
49 <pcolor>#151515</pcolor>
50 <scolor>#262626</scolor>
51 </wallpaper>
52 </wallpapers>
53 '';
54 destination = "/share/gnome-background-properties/nixos.xml";
55 };
56
57 budgie-control-center' = pkgs.budgie-control-center.override {
58 enableSshSocket = config.services.openssh.startWhenNeeded;
59 };
60
61 notExcluded = pkg: utils.disablePackageByName pkg config.environment.budgie.excludePackages;
62in
63{
64 meta.maintainers = lib.teams.budgie.members;
65
66 options = {
67 services.xserver.desktopManager.budgie = {
68 enable = mkEnableOption "the Budgie desktop";
69
70 sessionPath = mkOption {
71 description = ''
72 Additional list of packages to be added to the session search path.
73 Useful for GSettings-conditional autostart.
74
75 Note that this should be a last resort; patching the package is preferred (see GPaste).
76 '';
77 type = types.listOf types.package;
78 default = [ ];
79 example = literalExpression "[ pkgs.gpaste ]";
80 };
81
82 extraGSettingsOverrides = mkOption {
83 description = "Additional GSettings overrides.";
84 type = types.lines;
85 default = "";
86 };
87
88 extraGSettingsOverridePackages = mkOption {
89 description = "List of packages for which GSettings are overridden.";
90 type = types.listOf types.path;
91 default = [ ];
92 };
93
94 extraPlugins = mkOption {
95 description = "Extra plugins for the Budgie desktop";
96 type = types.listOf types.package;
97 default = [ ];
98 example = literalExpression "[ pkgs.budgie-analogue-clock-applet ]";
99 };
100 };
101
102 environment.budgie.excludePackages = mkOption {
103 description = "Which packages Budgie should exclude from the default environment.";
104 type = types.listOf types.package;
105 default = [ ];
106 example = literalExpression "[ pkgs.mate-terminal ]";
107 };
108 };
109
110 config = mkIf cfg.enable {
111 services.displayManager.sessionPackages = with pkgs; [
112 budgie-desktop
113 ];
114
115 services.xserver.displayManager.lightdm.greeters.slick = {
116 enable = mkDefault true;
117 theme = mkDefault {
118 name = "Qogir";
119 package = pkgs.qogir-theme;
120 };
121 iconTheme = mkDefault {
122 name = "Qogir";
123 package = pkgs.qogir-icon-theme;
124 };
125 cursorTheme = mkDefault {
126 name = "Qogir";
127 package = pkgs.qogir-icon-theme;
128 };
129 };
130
131 services.xserver.desktopManager.budgie.sessionPath = [ pkgs.budgie-desktop-view ];
132
133 environment.extraInit = ''
134 ${concatMapStrings (p: ''
135 if [ -d "${p}/share/gsettings-schemas/${p.name}" ]; then
136 export XDG_DATA_DIRS=$XDG_DATA_DIRS''${XDG_DATA_DIRS:+:}${p}/share/gsettings-schemas/${p.name}
137 fi
138 if [ -d "${p}/lib/girepository-1.0" ]; then
139 export GI_TYPELIB_PATH=$GI_TYPELIB_PATH''${GI_TYPELIB_PATH:+:}${p}/lib/girepository-1.0
140 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH''${LD_LIBRARY_PATH:+:}${p}/lib
141 fi
142 '') cfg.sessionPath}
143 ''
144 + lib.optionalString config.services.gnome.gcr-ssh-agent.enable ''
145 # Hack: https://bugzilla.redhat.com/show_bug.cgi?id=2250704 still
146 # applies to sessions not managed by systemd.
147 if [ -z "$SSH_AUTH_SOCK" ] && [ -n "$XDG_RUNTIME_DIR" ]; then
148 export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/gcr/ssh"
149 fi
150 '';
151
152 environment.systemPackages =
153 with pkgs;
154 [
155 # Budgie Desktop.
156 budgie-backgrounds
157 budgie-control-center'
158 (budgie-desktop-with-plugins.override { plugins = cfg.extraPlugins; })
159 budgie-desktop-view
160 budgie-screensaver
161 budgie-session
162
163 # Required by Budgie Menu.
164 gnome-menus
165
166 # Required by Budgie Control Center.
167 zenity
168
169 # Provides `gsettings`.
170 glib
171
172 # Update user directories.
173 xdg-user-dirs
174 ]
175 ++ lib.optional config.networking.networkmanager.enable pkgs.networkmanagerapplet
176 ++ (utils.removePackagesByName [
177 nemo
178 mate.eom
179 mate.pluma
180 mate.atril
181 mate.engrampa
182 mate.mate-calc
183 mate.mate-system-monitor
184 vlc
185
186 # Desktop themes.
187 qogir-theme
188 qogir-icon-theme
189 nixos-background-info
190
191 # Default settings.
192 nixos-gsettings-overrides
193 ] config.environment.budgie.excludePackages)
194 ++ cfg.sessionPath;
195
196 # Both budgie-desktop-view and nemo defaults to this emulator.
197 programs.gnome-terminal.enable = mkDefault (notExcluded pkgs.gnome-terminal);
198
199 # Fonts.
200 fonts.packages = [
201 pkgs.noto-fonts
202 pkgs.hack-font
203 ];
204 fonts.fontconfig.defaultFonts = {
205 sansSerif = mkDefault [ "Noto Sans" ];
206 monospace = mkDefault [ "Hack" ];
207 };
208
209 environment.pathsToLink = [
210 "/share" # TODO: https://github.com/NixOS/nixpkgs/issues/47173
211 ];
212
213 # GSettings overrides.
214 environment.sessionVariables.NIX_GSETTINGS_OVERRIDES_DIR = "${nixos-gsettings-overrides}/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas";
215
216 # Required by Budgie Desktop.
217 services.xserver.updateDbusEnvironment = true;
218 programs.dconf.enable = true;
219
220 # Required by Budgie Screensaver.
221 security.pam.services.budgie-screensaver = { };
222
223 # Required by Budgie's Polkit Dialog.
224 security.polkit.enable = mkDefault true;
225
226 # Required by Budgie Panel plugins and/or Budgie Control Center panels.
227 networking.networkmanager.enable = mkDefault true; # for BCC's Network panel.
228 programs.nm-applet.enable = config.networking.networkmanager.enable; # Budgie has no Network applet.
229 programs.nm-applet.indicator = true; # Budgie uses AppIndicators.
230
231 hardware.bluetooth.enable = mkDefault true; # for Budgie's Status Indicator and BCC's Bluetooth panel.
232
233 xdg.portal.enable = mkDefault true; # for BCC's Applications panel.
234 xdg.portal.extraPortals = with pkgs; [
235 xdg-desktop-portal-gtk # provides a XDG Portals implementation.
236 ];
237 xdg.portal.configPackages = mkDefault [ pkgs.budgie-desktop ];
238
239 services.geoclue2.enable = mkDefault true; # for BCC's Privacy > Location Services panel.
240 services.upower.enable = config.powerManagement.enable; # for Budgie's Status Indicator and BCC's Power panel.
241 services.libinput.enable = mkDefault true; # for BCC's Mouse panel.
242 services.colord.enable = mkDefault true; # for BCC's Color panel.
243 services.gnome.at-spi2-core.enable = mkDefault true; # for BCC's A11y panel.
244 services.accounts-daemon.enable = mkDefault true; # for BCC's Users panel.
245 services.udisks2.enable = mkDefault true; # for BCC's Details panel.
246
247 # For BCC's Online Accounts panel.
248 services.gnome.gnome-online-accounts.enable = mkDefault true;
249
250 # For BCC's Printers panel.
251 services.printing.enable = mkDefault true;
252 services.system-config-printer.enable = config.services.printing.enable;
253
254 # For BCC's Sharing panel.
255 services.dleyna.enable = mkDefault true;
256 services.gnome.gnome-user-share.enable = mkDefault true;
257 services.gnome.rygel.enable = mkDefault true;
258
259 # Other default services.
260 services.gnome.evolution-data-server.enable = mkDefault true;
261 services.gnome.glib-networking.enable = mkDefault true;
262 services.gnome.gnome-keyring.enable = mkDefault true;
263 services.gnome.gcr-ssh-agent.enable = mkDefault true;
264 services.gnome.gnome-settings-daemon.enable = mkDefault true;
265 services.gvfs.enable = mkDefault true;
266
267 # Register packages for DBus.
268 services.dbus.packages = [
269 budgie-control-center'
270 ];
271
272 # Register packages for udev.
273 services.udev.packages = with pkgs; [
274 magpie
275 ];
276
277 # Shell integration for MATE Terminal.
278 programs.bash.vteIntegration = true;
279 programs.zsh.vteIntegration = true;
280 };
281}