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}