1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6
7 cfg = config.services.xserver.desktopManager.pantheon;
8 serviceCfg = config.services.pantheon;
9
10 nixos-gsettings-desktop-schemas = pkgs.pantheon.elementary-gsettings-schemas.override {
11 extraGSettingsOverridePackages = cfg.extraGSettingsOverridePackages;
12 extraGSettingsOverrides = cfg.extraGSettingsOverrides;
13 };
14
15in
16
17{
18
19 meta = {
20 doc = ./pantheon.xml;
21 maintainers = pkgs.pantheon.maintainers;
22 };
23
24 options = {
25
26 services.pantheon = {
27
28 contractor = {
29 enable = mkEnableOption "contractor, a desktop-wide extension service used by Pantheon";
30 };
31
32 apps.enable = mkEnableOption "Pantheon default applications";
33
34 };
35
36 services.xserver.desktopManager.pantheon = {
37 enable = mkOption {
38 type = types.bool;
39 default = false;
40 description = "Enable the pantheon desktop manager";
41 };
42
43 sessionPath = mkOption {
44 default = [];
45 type = types.listOf types.package;
46 example = literalExample "[ pkgs.gnome.gpaste ]";
47 description = ''
48 Additional list of packages to be added to the session search path.
49 Useful for GSettings-conditional autostart.
50
51 Note that this should be a last resort; patching the package is preferred (see GPaste).
52 '';
53 apply = list: list ++
54 [
55 pkgs.pantheon.pantheon-agent-geoclue2
56 ];
57 };
58
59 extraWingpanelIndicators = mkOption {
60 default = null;
61 type = with types; nullOr (listOf package);
62 description = "Indicators to add to Wingpanel.";
63 };
64
65 extraSwitchboardPlugs = mkOption {
66 default = null;
67 type = with types; nullOr (listOf package);
68 description = "Plugs to add to Switchboard.";
69 };
70
71 extraGSettingsOverrides = mkOption {
72 default = "";
73 type = types.lines;
74 description = "Additional gsettings overrides.";
75 };
76
77 extraGSettingsOverridePackages = mkOption {
78 default = [];
79 type = types.listOf types.path;
80 description = "List of packages for which gsettings are overridden.";
81 };
82
83 debug = mkEnableOption "gnome-session debug messages";
84
85 };
86
87 environment.pantheon.excludePackages = mkOption {
88 default = [];
89 example = literalExample "[ pkgs.pantheon.elementary-camera ]";
90 type = types.listOf types.package;
91 description = "Which packages pantheon should exclude from the default environment";
92 };
93
94 };
95
96
97 config = mkMerge [
98 (mkIf cfg.enable {
99
100 services.xserver.displayManager.sessionPackages = [ pkgs.pantheon.elementary-session-settings ];
101
102 # Ensure lightdm is used when Pantheon is enabled
103 # Without it screen locking will be nonfunctional because of the use of lightlocker
104 warnings = optional (config.services.xserver.displayManager.lightdm.enable != true)
105 ''
106 Using Pantheon without LightDM as a displayManager will break screenlocking from the UI.
107 '';
108
109 services.xserver.displayManager.lightdm.greeters.pantheon.enable = mkDefault true;
110
111 # Without this, elementary LightDM greeter will pre-select non-existent `default` session
112 # https://github.com/elementary/greeter/issues/368
113 services.xserver.displayManager.defaultSession = mkDefault "pantheon";
114
115 services.xserver.displayManager.sessionCommands = ''
116 if test "$XDG_CURRENT_DESKTOP" = "Pantheon"; then
117 ${concatMapStrings (p: ''
118 if [ -d "${p}/share/gsettings-schemas/${p.name}" ]; then
119 export XDG_DATA_DIRS=$XDG_DATA_DIRS''${XDG_DATA_DIRS:+:}${p}/share/gsettings-schemas/${p.name}
120 fi
121
122 if [ -d "${p}/lib/girepository-1.0" ]; then
123 export GI_TYPELIB_PATH=$GI_TYPELIB_PATH''${GI_TYPELIB_PATH:+:}${p}/lib/girepository-1.0
124 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH''${LD_LIBRARY_PATH:+:}${p}/lib
125 fi
126 '') cfg.sessionPath}
127 fi
128 '';
129
130 # Default services
131 hardware.bluetooth.enable = mkDefault true;
132 hardware.pulseaudio.enable = mkDefault true;
133 security.polkit.enable = true;
134 services.accounts-daemon.enable = true;
135 services.bamf.enable = true;
136 services.colord.enable = mkDefault true;
137 services.tumbler.enable = mkDefault true;
138 services.system-config-printer.enable = (mkIf config.services.printing.enable (mkDefault true));
139 services.dbus.packages = with pkgs.pantheon; [
140 switchboard-plug-power
141 elementary-default-settings # accountsservice extensions
142 ];
143 services.pantheon.apps.enable = mkDefault true;
144 services.pantheon.contractor.enable = mkDefault true;
145 services.gnome.at-spi2-core.enable = true;
146 services.gnome.evolution-data-server.enable = true;
147 services.gnome.glib-networking.enable = true;
148 services.gnome.gnome-keyring.enable = true;
149 services.gvfs.enable = true;
150 services.gnome.rygel.enable = mkDefault true;
151 services.gsignond.enable = mkDefault true;
152 services.gsignond.plugins = with pkgs.gsignondPlugins; [ lastfm mail oauth ];
153 services.udisks2.enable = true;
154 services.upower.enable = config.powerManagement.enable;
155 services.xserver.libinput.enable = mkDefault true;
156 services.xserver.updateDbusEnvironment = true;
157 services.zeitgeist.enable = mkDefault true;
158 services.geoclue2.enable = mkDefault true;
159 # pantheon has pantheon-agent-geoclue2
160 services.geoclue2.enableDemoAgent = false;
161 services.geoclue2.appConfig."io.elementary.desktop.agent-geoclue2" = {
162 isAllowed = true;
163 isSystem = true;
164 };
165 # Use gnome-settings-daemon fork
166 services.udev.packages = [
167 pkgs.pantheon.elementary-settings-daemon
168 ];
169 systemd.packages = [
170 pkgs.pantheon.elementary-settings-daemon
171 ];
172 programs.dconf.enable = true;
173 networking.networkmanager.enable = mkDefault true;
174
175 # Global environment
176 environment.systemPackages = with pkgs; [
177 desktop-file-utils
178 glib
179 gnome-menus
180 gnome.adwaita-icon-theme
181 gtk3.out
182 hicolor-icon-theme
183 lightlocker
184 onboard
185 qgnomeplatform
186 shared-mime-info
187 sound-theme-freedesktop
188 xdg-user-dirs
189 ] ++ (with pkgs.pantheon; [
190 # Artwork
191 elementary-gtk-theme
192 elementary-icon-theme
193 elementary-sound-theme
194 elementary-wallpapers
195
196 # Desktop
197 elementary-default-settings
198 elementary-dock
199 elementary-session-settings
200 elementary-shortcut-overlay
201 gala
202 (switchboard-with-plugs.override {
203 plugs = cfg.extraSwitchboardPlugs;
204 })
205 (wingpanel-with-indicators.override {
206 indicators = cfg.extraWingpanelIndicators;
207 })
208
209 # Services
210 elementary-capnet-assist
211 elementary-dpms-helper
212 elementary-notifications
213 elementary-settings-daemon
214 pantheon-agent-geoclue2
215 pantheon-agent-polkit
216 ]) ++ (gnome.removePackagesByName [
217 gnome.geary
218 gnome.epiphany
219 gnome.gnome-font-viewer
220 ] config.environment.pantheon.excludePackages);
221
222 programs.evince.enable = mkDefault true;
223 programs.file-roller.enable = mkDefault true;
224
225 # Settings from elementary-default-settings
226 environment.sessionVariables.GTK_CSD = "1";
227 environment.sessionVariables.GTK3_MODULES = [ "pantheon-filechooser-module" ];
228 environment.etc."gtk-3.0/settings.ini".source = "${pkgs.pantheon.elementary-default-settings}/etc/gtk-3.0/settings.ini";
229
230 # Override GSettings schemas
231 environment.sessionVariables.NIX_GSETTINGS_OVERRIDES_DIR = "${nixos-gsettings-desktop-schemas}/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas";
232
233 environment.sessionVariables.GNOME_SESSION_DEBUG = mkIf cfg.debug "1";
234
235 environment.pathsToLink = [
236 # FIXME: modules should link subdirs of `/share` rather than relying on this
237 "/share"
238 ];
239
240 # Otherwise you can't store NetworkManager Secrets with
241 # "Store the password only for this user"
242 programs.nm-applet.enable = true;
243 # Pantheon has its own network indicator
244 programs.nm-applet.indicator = false;
245
246 # Shell integration for VTE terminals
247 programs.bash.vteIntegration = mkDefault true;
248 programs.zsh.vteIntegration = mkDefault true;
249
250 # Harmonize Qt5 applications under Pantheon
251 qt5.enable = true;
252 qt5.platformTheme = "gnome";
253 qt5.style = "adwaita";
254
255 # Default Fonts
256 fonts.fonts = with pkgs; [
257 open-sans
258 roboto-mono
259 ];
260
261 fonts.fontconfig.defaultFonts = {
262 monospace = [ "Roboto Mono" ];
263 sansSerif = [ "Open Sans" ];
264 };
265 })
266
267 (mkIf serviceCfg.apps.enable {
268 environment.systemPackages = (with pkgs.pantheon; pkgs.gnome.removePackagesByName [
269 elementary-calculator
270 elementary-calendar
271 elementary-camera
272 elementary-code
273 elementary-files
274 elementary-music
275 elementary-photos
276 elementary-screenshot-tool
277 elementary-terminal
278 elementary-videos
279 ] config.environment.pantheon.excludePackages);
280
281 # needed by screenshot-tool
282 fonts.fonts = [
283 pkgs.pantheon.elementary-redacted-script
284 ];
285 })
286
287 (mkIf serviceCfg.contractor.enable {
288 environment.systemPackages = with pkgs.pantheon; [
289 contractor
290 extra-elementary-contracts
291 ];
292
293 environment.pathsToLink = [
294 "/share/contractor"
295 ];
296 })
297
298 ];
299}