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 buildCommand = ''
31 mkdir -p $out/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas
32 cp -rf ${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
33
34 ${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}
35
36 chmod -R a+w $out/share/gsettings-schemas/nixos-gsettings-overrides
37 cat - > $out/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas/nixos-defaults.gschema.override <<- EOF
38 [org.gnome.desktop.background]
39 picture-uri='${pkgs.nixos-artwork}/share/artwork/gnome/Gnome_Dark.png'
40
41 [org.gnome.desktop.screensaver]
42 picture-uri='${pkgs.nixos-artwork}/share/artwork/gnome/Gnome_Dark.png'
43
44 ${cfg.extraGSettingsOverrides}
45 EOF
46
47 ${pkgs.glib.dev}/bin/glib-compile-schemas $out/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas/
48 '';
49 };
50
51in {
52
53 options = {
54
55 services.xserver.desktopManager.gnome3 = {
56 enable = mkOption {
57 default = false;
58 example = true;
59 description = "Enable Gnome 3 desktop manager.";
60 };
61
62 sessionPath = mkOption {
63 default = [];
64 example = literalExample "[ pkgs.gnome3.gpaste ]";
65 description = "Additional list of packages to be added to the session search path.
66 Useful for gnome shell extensions or gsettings-conditionated autostart.";
67 apply = list: list ++ [ gnome3.gnome_shell gnome3.gnome-shell-extensions ];
68 };
69
70 extraGSettingsOverrides = mkOption {
71 default = "";
72 type = types.lines;
73 description = "Additional gsettings overrides.";
74 };
75
76 extraGSettingsOverridePackages = mkOption {
77 default = [];
78 type = types.listOf types.path;
79 description = "List of packages for which gsettings are overridden.";
80 };
81
82 debug = mkEnableOption "gnome-session debug messages";
83 };
84
85 environment.gnome3.packageSet = mkOption {
86 default = null;
87 example = literalExample "pkgs.gnome3_20";
88 description = "Which GNOME 3 package set to use.";
89 apply = p: if p == null then pkgs.gnome3 else p;
90 };
91
92 environment.gnome3.excludePackages = mkOption {
93 default = [];
94 example = literalExample "[ pkgs.gnome3.totem ]";
95 type = types.listOf types.package;
96 description = "Which packages gnome should exclude from the default environment";
97 };
98
99 };
100
101 config = mkIf cfg.enable {
102
103 # Enable helpful DBus services.
104 security.polkit.enable = true;
105 services.udisks2.enable = true;
106 services.accounts-daemon.enable = true;
107 services.geoclue2.enable = mkDefault true;
108 services.gnome3.at-spi2-core.enable = true;
109 services.gnome3.evolution-data-server.enable = true;
110 services.gnome3.gnome-documents.enable = mkDefault true;
111 services.gnome3.gnome-keyring.enable = true;
112 services.gnome3.gnome-online-accounts.enable = mkDefault true;
113 services.gnome3.gnome-user-share.enable = mkDefault true;
114 services.gnome3.gvfs.enable = true;
115 services.gnome3.seahorse.enable = mkDefault true;
116 services.gnome3.sushi.enable = mkDefault true;
117 services.gnome3.tracker.enable = mkDefault true;
118 hardware.pulseaudio.enable = mkDefault true;
119 services.telepathy.enable = mkDefault true;
120 networking.networkmanager.enable = mkDefault true;
121 services.upower.enable = config.powerManagement.enable;
122 services.dbus.packages = mkIf config.services.printing.enable [ pkgs.system-config-printer ];
123 services.colord.enable = mkDefault true;
124 services.packagekit.enable = mkDefault true;
125 hardware.bluetooth.enable = mkDefault true;
126 services.xserver.libinput.enable = mkDefault true; # for controlling touchpad settings via gnome control center
127
128 fonts.fonts = [ pkgs.dejavu_fonts pkgs.cantarell_fonts ];
129
130 services.xserver.desktopManager.session = singleton
131 { name = "gnome3";
132 bgSupport = true;
133 start = ''
134 # Set GTK_DATA_PREFIX so that GTK+ can find the themes
135 export GTK_DATA_PREFIX=${config.system.path}
136
137 # find theme engines
138 export GTK_PATH=${config.system.path}/lib/gtk-3.0:${config.system.path}/lib/gtk-2.0
139
140 export XDG_MENU_PREFIX=gnome
141
142 ${concatMapStrings (p: ''
143 if [ -d "${p}/share/gsettings-schemas/${p.name}" ]; then
144 export XDG_DATA_DIRS=$XDG_DATA_DIRS''${XDG_DATA_DIRS:+:}${p}/share/gsettings-schemas/${p.name}
145 fi
146
147 if [ -d "${p}/lib/girepository-1.0" ]; then
148 export GI_TYPELIB_PATH=$GI_TYPELIB_PATH''${GI_TYPELIB_PATH:+:}${p}/lib/girepository-1.0
149 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH''${LD_LIBRARY_PATH:+:}${p}/lib
150 fi
151 '') cfg.sessionPath}
152
153 # Override default mimeapps
154 export XDG_DATA_DIRS=$XDG_DATA_DIRS''${XDG_DATA_DIRS:+:}${mimeAppsList}/share
155
156 # Override gsettings-desktop-schema
157 export XDG_DATA_DIRS=${nixos-gsettings-desktop-schemas}/share/gsettings-schemas/nixos-gsettings-overrides''${XDG_DATA_DIRS:+:}$XDG_DATA_DIRS
158
159 # Let nautilus find extensions
160 export NAUTILUS_EXTENSION_DIR=${config.system.path}/lib/nautilus/extensions-3.0/
161
162 # Find the mouse
163 export XCURSOR_PATH=~/.icons:${config.system.path}/share/icons
164
165 # Update user dirs as described in http://freedesktop.org/wiki/Software/xdg-user-dirs/
166 ${pkgs.xdg-user-dirs}/bin/xdg-user-dirs-update
167
168 ${gnome3.gnome_session}/bin/gnome-session ${optionalString cfg.debug "--debug"} &
169 waitPID=$!
170 '';
171 };
172
173 services.xserver.updateDbusEnvironment = true;
174
175 environment.variables.GIO_EXTRA_MODULES = [ "${gnome3.dconf}/lib/gio/modules"
176 "${gnome3.glib_networking.out}/lib/gio/modules"
177 "${gnome3.gvfs}/lib/gio/modules" ];
178 environment.systemPackages = gnome3.corePackages ++ cfg.sessionPath
179 ++ (removePackagesByName gnome3.optionalPackages config.environment.gnome3.excludePackages);
180
181 # Use the correct gnome3 packageSet
182 networking.networkmanager.basePackages =
183 { inherit (pkgs) networkmanager modemmanager wpa_supplicant;
184 inherit (gnome3) networkmanager_openvpn networkmanager_vpnc
185 networkmanager_openconnect networkmanager_pptp
186 networkmanager_l2tp; };
187
188 # Needed for themes and backgrounds
189 environment.pathsToLink = [ "/share" ];
190
191 };
192
193
194}