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