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