1{ config, lib, pkgs, ... }: 2 3with lib; 4 5let 6 cfg = config.services.xserver.desktopManager.gnome3; 7 8 # Remove packages of ys from xs, based on their names 9 removePackagesByName = xs: ys: 10 let 11 pkgName = drv: (builtins.parseDrvName drv.name).name; 12 ysNames = map pkgName ys; 13 in 14 filter (x: !(builtins.elem (pkgName x) ysNames)) xs; 15 16 # Prioritize nautilus by default when opening directories 17 mimeAppsList = pkgs.writeTextFile { 18 name = "gnome-mimeapps"; 19 destination = "/share/applications/mimeapps.list"; 20 text = '' 21 [Default Applications] 22 inode/directory=nautilus.desktop;org.gnome.Nautilus.desktop 23 ''; 24 }; 25 26 nixos-gsettings-desktop-schemas = pkgs.runCommand "nixos-gsettings-desktop-schemas" {} 27 '' 28 mkdir -p $out/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas 29 cp -rf ${pkgs.gnome3.gsettings-desktop-schemas}/share/gsettings-schemas/gsettings-desktop-schemas*/glib-2.0/schemas/*.xml $out/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas 30 31 ${concatMapStrings (pkg: "cp -rf ${pkg}/share/gsettings-schemas/*/glib-2.0/schemas/*.xml $out/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas\n") cfg.extraGSettingsOverridePackages} 32 33 chmod -R a+w $out/share/gsettings-schemas/nixos-gsettings-overrides 34 cat - > $out/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas/nixos-defaults.gschema.override <<- EOF 35 [org.gnome.desktop.background] 36 picture-uri='${pkgs.nixos-artwork.wallpapers.simple-dark-gray}/share/artwork/gnome/nix-wallpaper-simple-dark-gray.png' 37 38 [org.gnome.desktop.screensaver] 39 picture-uri='${pkgs.nixos-artwork.wallpapers.simple-dark-gray-bottom}/share/artwork/gnome/nix-wallpaper-simple-dark-gray_bottom.png' 40 41 ${cfg.extraGSettingsOverrides} 42 EOF 43 44 ${pkgs.glib.dev}/bin/glib-compile-schemas $out/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas/ 45 ''; 46 47in { 48 49 options = { 50 51 services.xserver.desktopManager.gnome3 = { 52 enable = mkOption { 53 default = false; 54 description = "Enable Gnome 3 desktop manager."; 55 }; 56 57 sessionPath = mkOption { 58 default = []; 59 example = literalExample "[ pkgs.gnome3.gpaste ]"; 60 description = '' 61 Additional list of packages to be added to the session search path. 62 Useful for GNOME Shell extensions or GSettings-conditional autostart. 63 64 Note that this should be a last resort; patching the package is preferred (see GPaste). 65 ''; 66 apply = list: list ++ [ pkgs.gnome3.gnome-shell pkgs.gnome3.gnome-shell-extensions ]; 67 }; 68 69 extraGSettingsOverrides = mkOption { 70 default = ""; 71 type = types.lines; 72 description = "Additional gsettings overrides."; 73 }; 74 75 extraGSettingsOverridePackages = mkOption { 76 default = []; 77 type = types.listOf types.path; 78 description = "List of packages for which gsettings are overridden."; 79 }; 80 81 debug = mkEnableOption "gnome-session debug messages"; 82 }; 83 84 environment.gnome3.excludePackages = mkOption { 85 default = []; 86 example = literalExample "[ pkgs.gnome3.totem ]"; 87 type = types.listOf types.package; 88 description = "Which packages gnome should exclude from the default environment"; 89 }; 90 91 }; 92 93 config = mkIf cfg.enable { 94 95 # Enable helpful DBus services. 96 security.polkit.enable = true; 97 services.udisks2.enable = true; 98 services.accounts-daemon.enable = true; 99 services.geoclue2.enable = mkDefault true; 100 # GNOME should have its own geoclue agent 101 services.geoclue2.enableDemoAgent = false; 102 services.dleyna-renderer.enable = mkDefault true; 103 services.dleyna-server.enable = mkDefault true; 104 services.gnome3.at-spi2-core.enable = true; 105 services.gnome3.evolution-data-server.enable = true; 106 services.gnome3.gnome-disks.enable = mkDefault true; 107 services.gnome3.gnome-documents.enable = mkDefault true; 108 services.gnome3.gnome-keyring.enable = true; 109 services.gnome3.gnome-online-accounts.enable = mkDefault true; 110 services.gnome3.gnome-terminal-server.enable = mkDefault true; 111 services.gnome3.gnome-user-share.enable = mkDefault true; 112 services.gnome3.gvfs.enable = true; 113 services.gnome3.seahorse.enable = mkDefault true; 114 services.gnome3.sushi.enable = mkDefault true; 115 services.gnome3.tracker.enable = mkDefault true; 116 services.gnome3.tracker-miners.enable = mkDefault true; 117 hardware.pulseaudio.enable = mkDefault true; 118 services.telepathy.enable = mkDefault true; 119 networking.networkmanager.enable = mkDefault true; 120 services.upower.enable = config.powerManagement.enable; 121 services.dbus.packages = mkIf config.services.printing.enable [ pkgs.system-config-printer ]; 122 services.colord.enable = mkDefault true; 123 services.packagekit.enable = mkDefault true; 124 hardware.bluetooth.enable = mkDefault true; 125 services.xserver.libinput.enable = mkDefault true; # for controlling touchpad settings via gnome control center 126 services.udev.packages = [ pkgs.gnome3.gnome-settings-daemon ]; 127 systemd.packages = [ pkgs.gnome3.vino ]; 128 services.flatpak.extraPortals = [ pkgs.xdg-desktop-portal-gtk ]; 129 130 # If gnome3 is installed, build vim for gtk3 too. 131 nixpkgs.config.vim.gui = "gtk3"; 132 133 fonts.fonts = [ pkgs.dejavu_fonts pkgs.cantarell-fonts ]; 134 135 services.xserver.displayManager.gdm.enable = mkDefault true; 136 services.xserver.displayManager.extraSessionFilePackages = [ pkgs.gnome3.gnome-session ]; 137 138 services.xserver.displayManager.sessionCommands = '' 139 if test "$XDG_CURRENT_DESKTOP" = "GNOME"; then 140 ${concatMapStrings (p: '' 141 if [ -d "${p}/share/gsettings-schemas/${p.name}" ]; then 142 export XDG_DATA_DIRS=$XDG_DATA_DIRS''${XDG_DATA_DIRS:+:}${p}/share/gsettings-schemas/${p.name} 143 fi 144 145 if [ -d "${p}/lib/girepository-1.0" ]; then 146 export GI_TYPELIB_PATH=$GI_TYPELIB_PATH''${GI_TYPELIB_PATH:+:}${p}/lib/girepository-1.0 147 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH''${LD_LIBRARY_PATH:+:}${p}/lib 148 fi 149 '') cfg.sessionPath} 150 fi 151 ''; 152 153 environment.variables.GNOME_SESSION_DEBUG = optionalString cfg.debug "1"; 154 155 # Override default mimeapps 156 environment.variables.XDG_DATA_DIRS = [ "${mimeAppsList}/share" ]; 157 158 # Override GSettings schemas 159 environment.variables.NIX_GSETTINGS_OVERRIDES_DIR = "${nixos-gsettings-desktop-schemas}/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas"; 160 161 # Let nautilus find extensions 162 # TODO: Create nautilus-with-extensions package 163 environment.variables.NAUTILUS_EXTENSION_DIR = "${config.system.path}/lib/nautilus/extensions-3.0"; 164 165 services.xserver.updateDbusEnvironment = true; 166 167 environment.variables.GIO_EXTRA_MODULES = [ "${lib.getLib pkgs.gnome3.dconf}/lib/gio/modules" 168 "${pkgs.gnome3.glib-networking.out}/lib/gio/modules" 169 "${pkgs.gnome3.gvfs}/lib/gio/modules" ]; 170 environment.systemPackages = pkgs.gnome3.corePackages ++ cfg.sessionPath 171 ++ (removePackagesByName pkgs.gnome3.optionalPackages config.environment.gnome3.excludePackages) ++ [ 172 pkgs.xdg-user-dirs # Update user dirs as described in http://freedesktop.org/wiki/Software/xdg-user-dirs/ 173 ]; 174 175 # Use the correct gnome3 packageSet 176 networking.networkmanager.basePackages = 177 { inherit (pkgs) networkmanager modemmanager wpa_supplicant; 178 inherit (pkgs.gnome3) networkmanager-openvpn networkmanager-vpnc 179 networkmanager-openconnect networkmanager-fortisslvpn 180 networkmanager-iodine networkmanager-l2tp; }; 181 182 # Needed for themes and backgrounds 183 environment.pathsToLink = [ "/share" ]; 184 185 }; 186 187 188}