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}