1{ config, lib, pkgs, utils, ... }:
2
3with lib;
4
5let
6
7 cfg = config.services.xserver.desktopManager.cinnamon;
8 serviceCfg = config.services.cinnamon;
9
10 nixos-gsettings-overrides = pkgs.cinnamon.cinnamon-gsettings-overrides.override {
11 extraGSettingsOverridePackages = cfg.extraGSettingsOverridePackages;
12 extraGSettingsOverrides = cfg.extraGSettingsOverrides;
13 };
14
15 notExcluded = pkg: (!(lib.elem pkg config.environment.cinnamon.excludePackages));
16in
17
18{
19 options = {
20 services.cinnamon = {
21 apps.enable = mkEnableOption (lib.mdDoc "Cinnamon default applications");
22 };
23
24 services.xserver.desktopManager.cinnamon = {
25 enable = mkEnableOption (lib.mdDoc "the cinnamon desktop manager");
26
27 sessionPath = mkOption {
28 default = [];
29 type = types.listOf types.package;
30 example = literalExpression "[ pkgs.gnome.gpaste ]";
31 description = lib.mdDoc ''
32 Additional list of packages to be added to the session search path.
33 Useful for GSettings-conditional autostart.
34
35 Note that this should be a last resort; patching the package is preferred (see GPaste).
36 '';
37 };
38
39 extraGSettingsOverrides = mkOption {
40 default = "";
41 type = types.lines;
42 description = lib.mdDoc "Additional gsettings overrides.";
43 };
44
45 extraGSettingsOverridePackages = mkOption {
46 default = [];
47 type = types.listOf types.path;
48 description = lib.mdDoc "List of packages for which gsettings are overridden.";
49 };
50 };
51
52 environment.cinnamon.excludePackages = mkOption {
53 default = [];
54 example = literalExpression "[ pkgs.cinnamon.blueberry ]";
55 type = types.listOf types.package;
56 description = lib.mdDoc "Which packages cinnamon should exclude from the default environment";
57 };
58
59 };
60
61 config = mkMerge [
62 (mkIf cfg.enable {
63 services.xserver.displayManager.sessionPackages = [ pkgs.cinnamon.cinnamon-common ];
64
65 services.xserver.displayManager.lightdm.greeters.slick = {
66 enable = mkDefault true;
67
68 # Taken from mint-artwork.gschema.override
69 theme = mkIf (notExcluded pkgs.cinnamon.mint-themes) {
70 name = mkDefault "Mint-Y-Aqua";
71 package = mkDefault pkgs.cinnamon.mint-themes;
72 };
73 iconTheme = mkIf (notExcluded pkgs.cinnamon.mint-x-icons) {
74 name = mkDefault "Mint-Y-Aqua";
75 package = mkDefault pkgs.cinnamon.mint-x-icons;
76 };
77 cursorTheme = mkIf (notExcluded pkgs.cinnamon.mint-cursor-themes) {
78 name = mkDefault "Bibata-Modern-Classic";
79 package = mkDefault pkgs.cinnamon.mint-cursor-themes;
80 };
81 };
82 services.xserver.displayManager.sessionCommands = ''
83 if test "$XDG_CURRENT_DESKTOP" = "Cinnamon"; then
84 true
85 ${concatMapStrings (p: ''
86 if [ -d "${p}/share/gsettings-schemas/${p.name}" ]; then
87 export XDG_DATA_DIRS=$XDG_DATA_DIRS''${XDG_DATA_DIRS:+:}${p}/share/gsettings-schemas/${p.name}
88 fi
89
90 if [ -d "${p}/lib/girepository-1.0" ]; then
91 export GI_TYPELIB_PATH=$GI_TYPELIB_PATH''${GI_TYPELIB_PATH:+:}${p}/lib/girepository-1.0
92 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH''${LD_LIBRARY_PATH:+:}${p}/lib
93 fi
94 '') cfg.sessionPath}
95 fi
96 '';
97
98 # Default services
99 services.blueman.enable = mkDefault true;
100 hardware.bluetooth.enable = mkDefault true;
101 hardware.pulseaudio.enable = mkDefault true;
102 security.polkit.enable = true;
103 services.accounts-daemon.enable = true;
104 services.system-config-printer.enable = (mkIf config.services.printing.enable (mkDefault true));
105 services.dbus.packages = with pkgs.cinnamon; [
106 cinnamon-common
107 cinnamon-screensaver
108 nemo-with-extensions
109 xapp
110 ];
111 services.cinnamon.apps.enable = mkDefault true;
112 services.gnome.evolution-data-server.enable = true;
113 services.gnome.glib-networking.enable = true;
114 services.gnome.gnome-keyring.enable = true;
115 services.gvfs.enable = true;
116 services.udisks2.enable = true;
117 services.upower.enable = mkDefault config.powerManagement.enable;
118 services.xserver.libinput.enable = mkDefault true;
119 services.xserver.updateDbusEnvironment = true;
120 networking.networkmanager.enable = mkDefault true;
121
122 # Enable colord server
123 services.colord.enable = true;
124
125 # Enable dconf
126 programs.dconf.enable = true;
127
128 # Enable org.a11y.Bus
129 services.gnome.at-spi2-core.enable = true;
130
131 # Fix lockscreen
132 security.pam.services = {
133 cinnamon-screensaver = {};
134 };
135
136 environment.systemPackages = with pkgs.cinnamon // pkgs; ([
137 desktop-file-utils
138
139 # common-files
140 cinnamon-common
141 cinnamon-session
142 cinnamon-desktop
143 cinnamon-menus
144 cinnamon-translations
145
146 # utils needed by some scripts
147 killall
148
149 # session requirements
150 cinnamon-screensaver
151 # cinnamon-killer-daemon: provided by cinnamon-common
152 networkmanagerapplet # session requirement - also nm-applet not needed
153
154 # For a polkit authentication agent
155 polkit_gnome
156
157 # packages
158 nemo-with-extensions
159 cinnamon-control-center
160 cinnamon-settings-daemon
161 libgnomekbd
162
163 # theme
164 gnome.adwaita-icon-theme
165 gnome.gnome-themes-extra
166 gtk3.out
167
168 # other
169 glib # for gsettings
170 xdg-user-dirs
171 ] ++ utils.removePackagesByName [
172 # accessibility
173 onboard
174 orca
175
176 # theme
177 sound-theme-freedesktop
178 nixos-artwork.wallpapers.simple-dark-gray
179 mint-artwork
180 mint-cursor-themes
181 mint-themes
182 mint-x-icons
183 mint-y-icons
184 xapp # provides some xapp-* icons
185 ] config.environment.cinnamon.excludePackages);
186
187 xdg.mime.enable = true;
188 xdg.icons.enable = true;
189
190 # Override GSettings schemas
191 environment.sessionVariables.NIX_GSETTINGS_OVERRIDES_DIR = "${nixos-gsettings-overrides}/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas";
192
193 environment.pathsToLink = [
194 # FIXME: modules should link subdirs of `/share` rather than relying on this
195 "/share" # TODO: https://github.com/NixOS/nixpkgs/issues/47173
196 ];
197
198 # Shell integration for VTE terminals
199 programs.bash.vteIntegration = mkDefault true;
200 programs.zsh.vteIntegration = mkDefault true;
201
202 # Harmonize Qt applications under Cinnamon
203 qt.enable = true;
204 qt.platformTheme = "gnome";
205 qt.style = "adwaita";
206
207 # Default Fonts
208 fonts.fonts = with pkgs; [
209 source-code-pro # Default monospace font in 3.32
210 ubuntu_font_family # required for default theme
211 ];
212 })
213
214 (mkIf serviceCfg.apps.enable {
215 programs.geary.enable = mkDefault true;
216 programs.gnome-disks.enable = mkDefault true;
217 programs.gnome-terminal.enable = mkDefault true;
218 programs.file-roller.enable = mkDefault true;
219
220 environment.systemPackages = with pkgs // pkgs.gnome // pkgs.cinnamon; utils.removePackagesByName [
221 # cinnamon team apps
222 bulky
223 warpinator
224
225 # cinnamon xapp
226 xviewer
227 xreader
228 xed-editor
229 xplayer
230 pix
231
232 # external apps shipped with linux-mint
233 hexchat
234 gnome-calculator
235 gnome-calendar
236 gnome-screenshot
237 ] config.environment.cinnamon.excludePackages;
238 })
239 ];
240}