1{ config, lib, pkgs, ... }: 2 3with lib; 4 5let 6 cfg = config.services.xserver.desktopManager.gnome3; 7 gnome3 = config.environment.gnome3.packageSet; 8 9 # Remove packages of ys from xs, based on their names 10 removePackagesByName = xs: ys: 11 let 12 pkgName = drv: (builtins.parseDrvName drv.name).name; 13 ysNames = map pkgName ys; 14 res = (filter (x: !(builtins.elem (pkgName x) ysNames)) xs); 15 in 16 filter (x: !(builtins.elem (pkgName x) ysNames)) xs; 17 18 # Prioritize nautilus by default when opening directories 19 mimeAppsList = pkgs.writeTextFile { 20 name = "gnome-mimeapps"; 21 destination = "/share/applications/mimeapps.list"; 22 text = '' 23 [Default Applications] 24 inode/directory=nautilus.desktop;org.gnome.Nautilus.desktop 25 ''; 26 }; 27 28 nixos-gsettings-desktop-schemas = pkgs.stdenv.mkDerivation { 29 name = "nixos-gsettings-desktop-schemas"; 30 buildInputs = [ pkgs.nixos-artwork ]; 31 buildCommand = '' 32 mkdir -p $out/share/nixos-gsettings-schemas/nixos-gsettings-desktop-schemas 33 cp -rf ${gnome3.gsettings_desktop_schemas}/share/gsettings-schemas/gsettings-desktop-schemas*/glib-2.0 $out/share/nixos-gsettings-schemas/nixos-gsettings-desktop-schemas/ 34 chmod -R a+w $out/share/nixos-gsettings-schemas/nixos-gsettings-desktop-schemas 35 cat - > $out/share/nixos-gsettings-schemas/nixos-gsettings-desktop-schemas/glib-2.0/schemas/nixos-defaults.gschema.override <<- EOF 36 [org.gnome.desktop.background] 37 picture-uri='${pkgs.nixos-artwork}/share/artwork/gnome/Gnome_Dark.png' 38 39 [org.gnome.desktop.screensaver] 40 picture-uri='${pkgs.nixos-artwork}/share/artwork/gnome/Gnome_Dark.png' 41 EOF 42 ${pkgs.glib}/bin/glib-compile-schemas $out/share/nixos-gsettings-schemas/nixos-gsettings-desktop-schemas/glib-2.0/schemas/ 43 ''; 44 }; 45 46in { 47 48 options = { 49 50 services.xserver.desktopManager.gnome3.enable = mkOption { 51 default = false; 52 example = true; 53 description = "Enable Gnome 3 desktop manager."; 54 }; 55 56 services.xserver.desktopManager.gnome3.sessionPath = mkOption { 57 default = []; 58 example = literalExample "[ pkgs.gnome3.gpaste ]"; 59 description = "Additional list of packages to be added to the session search path. 60 Useful for gnome shell extensions or gsettings-conditionated autostart."; 61 apply = list: list ++ [ gnome3.gnome_shell gnome3.gnome-shell-extensions ]; 62 }; 63 64 environment.gnome3.packageSet = mkOption { 65 default = null; 66 example = literalExample "pkgs.gnome3_16"; 67 description = "Which GNOME 3 package set to use."; 68 apply = p: if p == null then pkgs.gnome3 else p; 69 }; 70 71 environment.gnome3.excludePackages = mkOption { 72 default = []; 73 example = literalExample "[ pkgs.gnome3.totem ]"; 74 type = types.listOf types.package; 75 description = "Which packages gnome should exclude from the default environment"; 76 }; 77 78 }; 79 80 config = mkIf cfg.enable { 81 82 # Enable helpful DBus services. 83 security.polkit.enable = true; 84 services.udisks2.enable = true; 85 services.accounts-daemon.enable = true; 86 services.geoclue2.enable = mkDefault true; 87 services.gnome3.at-spi2-core.enable = true; 88 services.gnome3.evolution-data-server.enable = true; 89 services.gnome3.gnome-documents.enable = mkDefault true; 90 services.gnome3.gnome-keyring.enable = true; 91 services.gnome3.gnome-online-accounts.enable = mkDefault true; 92 services.gnome3.gnome-user-share.enable = mkDefault true; 93 services.gnome3.gvfs.enable = true; 94 services.gnome3.seahorse.enable = mkDefault true; 95 services.gnome3.sushi.enable = mkDefault true; 96 services.gnome3.tracker.enable = mkDefault true; 97 hardware.pulseaudio.enable = mkDefault true; 98 services.telepathy.enable = mkDefault true; 99 networking.networkmanager.enable = mkDefault true; 100 services.upower.enable = config.powerManagement.enable; 101 hardware.bluetooth.enable = mkDefault true; 102 services.xserver.displayManager.desktopManagerHandlesLidAndPower = false; # true doesn't make sense here, GNOME just doesn't handle it anymore 103 104 fonts.fonts = [ pkgs.dejavu_fonts pkgs.cantarell_fonts ]; 105 106 services.xserver.desktopManager.session = singleton 107 { name = "gnome3"; 108 start = '' 109 # Set GTK_DATA_PREFIX so that GTK+ can find the themes 110 export GTK_DATA_PREFIX=${config.system.path} 111 112 # find theme engines 113 export GTK_PATH=${config.system.path}/lib/gtk-3.0:${config.system.path}/lib/gtk-2.0 114 115 export XDG_MENU_PREFIX=gnome 116 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 128 # Override default mimeapps 129 export XDG_DATA_DIRS=$XDG_DATA_DIRS''${XDG_DATA_DIRS:+:}${mimeAppsList}/share 130 131 # Override gsettings-desktop-schema 132 export XDG_DATA_DIRS=${nixos-gsettings-desktop-schemas}/share/nixos-gsettings-schemas/nixos-gsettings-desktop-schemas''${XDG_DATA_DIRS:+:}$XDG_DATA_DIRS 133 134 # Let nautilus find extensions 135 export NAUTILUS_EXTENSION_DIR=${config.system.path}/lib/nautilus/extensions-3.0/ 136 137 # Find the mouse 138 export XCURSOR_PATH=~/.icons:${config.system.path}/share/icons 139 140 # Update user dirs as described in http://freedesktop.org/wiki/Software/xdg-user-dirs/ 141 ${pkgs.xdg-user-dirs}/bin/xdg-user-dirs-update 142 143 # Find the mouse 144 export XCURSOR_PATH=~/.icons:${config.system.path}/share/icons 145 146 ${gnome3.gnome_session}/bin/gnome-session& 147 waitPID=$! 148 ''; 149 }; 150 151 environment.variables.GIO_EXTRA_MODULES = [ "${gnome3.dconf}/lib/gio/modules" 152 "${gnome3.glib_networking}/lib/gio/modules" 153 "${gnome3.gvfs}/lib/gio/modules" ]; 154 environment.systemPackages = gnome3.corePackages ++ cfg.sessionPath 155 ++ (removePackagesByName gnome3.optionalPackages config.environment.gnome3.excludePackages); 156 157 # Use the correct gnome3 packageSet 158 networking.networkmanager.basePackages = 159 { inherit (pkgs) networkmanager modemmanager wpa_supplicant; 160 inherit (gnome3) networkmanager_openvpn networkmanager_vpnc 161 networkmanager_openconnect networkmanager_pptp 162 networkmanager_l2tp; }; 163 164 # Needed for themes and backgrounds 165 environment.pathsToLink = [ "/share" ]; 166 167 }; 168 169 170}