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