at 21.11-pre 9.7 kB view raw
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}