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