at v192 6.7 kB view raw
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 103 fonts.fonts = [ pkgs.dejavu_fonts pkgs.cantarell_fonts ]; 104 105 services.xserver.desktopManager.session = singleton 106 { name = "gnome3"; 107 start = '' 108 # Set GTK_DATA_PREFIX so that GTK+ can find the themes 109 export GTK_DATA_PREFIX=${config.system.path} 110 111 # find theme engines 112 export GTK_PATH=${config.system.path}/lib/gtk-3.0:${config.system.path}/lib/gtk-2.0 113 114 export XDG_MENU_PREFIX=gnome 115 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 127 # Override default mimeapps 128 export XDG_DATA_DIRS=$XDG_DATA_DIRS''${XDG_DATA_DIRS:+:}${mimeAppsList}/share 129 130 # Override gsettings-desktop-schema 131 export XDG_DATA_DIRS=${nixos-gsettings-desktop-schemas}/share/nixos-gsettings-schemas/nixos-gsettings-desktop-schemas''${XDG_DATA_DIRS:+:}$XDG_DATA_DIRS 132 133 # Let nautilus find extensions 134 export NAUTILUS_EXTENSION_DIR=${config.system.path}/lib/nautilus/extensions-3.0/ 135 136 # Find the mouse 137 export XCURSOR_PATH=~/.icons:${config.system.path}/share/icons 138 139 # Update user dirs as described in http://freedesktop.org/wiki/Software/xdg-user-dirs/ 140 ${pkgs.xdg-user-dirs}/bin/xdg-user-dirs-update 141 142 # Find the mouse 143 export XCURSOR_PATH=~/.icons:${config.system.path}/share/icons 144 145 ${gnome3.gnome_session}/bin/gnome-session& 146 waitPID=$! 147 ''; 148 }; 149 150 environment.variables.GIO_EXTRA_MODULES = [ "${gnome3.dconf}/lib/gio/modules" 151 "${gnome3.glib_networking}/lib/gio/modules" 152 "${gnome3.gvfs}/lib/gio/modules" ]; 153 environment.systemPackages = gnome3.corePackages ++ cfg.sessionPath 154 ++ (removePackagesByName gnome3.optionalPackages config.environment.gnome3.excludePackages); 155 156 # Use the correct gnome3 packageSet 157 networking.networkmanager.basePackages = 158 { inherit (pkgs) networkmanager modemmanager wpa_supplicant; 159 inherit (gnome3) networkmanager_openvpn networkmanager_vpnc 160 networkmanager_openconnect networkmanager_pptp 161 networkmanager_l2tp; }; 162 163 # Needed for themes and backgrounds 164 environment.pathsToLink = [ "/share" ]; 165 166 }; 167 168 169}