nixos/preload: init
[NixPkgs.git] / nixos / modules / services / x11 / desktop-managers / xfce.nix
blobe28486bcc12d89aad52d944397bcbc044e933ea2
1 { config, lib, pkgs, utils, ... }:
3 with lib;
5 let
6   cfg = config.services.xserver.desktopManager.xfce;
7   excludePackages = config.environment.xfce.excludePackages;
9 in
11   meta = {
12     maintainers = teams.xfce.members;
13   };
15   imports = [
16     # added 2019-08-18
17     # needed to preserve some semblance of UI familarity
18     # with original XFCE module
19     (mkRenamedOptionModule
20       [ "services" "xserver" "desktopManager" "xfce4-14" "extraSessionCommands" ]
21       [ "services" "xserver" "displayManager" "sessionCommands" ])
23     # added 2019-11-04
24     # xfce4-14 module removed and promoted to xfce.
25     # Needed for configs that used xfce4-14 module to migrate to this one.
26     (mkRenamedOptionModule
27       [ "services" "xserver" "desktopManager" "xfce4-14" "enable" ]
28       [ "services" "xserver" "desktopManager" "xfce" "enable" ])
29     (mkRenamedOptionModule
30       [ "services" "xserver" "desktopManager" "xfce4-14" "noDesktop" ]
31       [ "services" "xserver" "desktopManager" "xfce" "noDesktop" ])
32     (mkRenamedOptionModule
33       [ "services" "xserver" "desktopManager" "xfce4-14" "enableXfwm" ]
34       [ "services" "xserver" "desktopManager" "xfce" "enableXfwm" ])
35     (mkRenamedOptionModule
36       [ "services" "xserver" "desktopManager" "xfce" "extraSessionCommands" ]
37       [ "services" "xserver" "displayManager" "sessionCommands" ])
38     (mkRemovedOptionModule [ "services" "xserver" "desktopManager" "xfce" "screenLock" ] "")
40     # added 2022-06-26
41     # thunar has its own module
42     (mkRenamedOptionModule
43       [ "services" "xserver" "desktopManager" "xfce" "thunarPlugins" ]
44       [ "programs" "thunar" "plugins" ])
45   ];
47   options = {
48     services.xserver.desktopManager.xfce = {
49       enable = mkOption {
50         type = types.bool;
51         default = false;
52         description = lib.mdDoc "Enable the Xfce desktop environment.";
53       };
55       noDesktop = mkOption {
56         type = types.bool;
57         default = false;
58         description = lib.mdDoc "Don't install XFCE desktop components (xfdesktop and panel).";
59       };
61       enableXfwm = mkOption {
62         type = types.bool;
63         default = true;
64         description = lib.mdDoc "Enable the XFWM (default) window manager.";
65       };
67       enableScreensaver = mkOption {
68         type = types.bool;
69         default = true;
70         description = lib.mdDoc "Enable the XFCE screensaver.";
71       };
72     };
74     environment.xfce.excludePackages = mkOption {
75       default = [];
76       example = literalExpression "[ pkgs.xfce.xfce4-volumed-pulse ]";
77       type = types.listOf types.package;
78       description = lib.mdDoc "Which packages XFCE should exclude from the default environment";
79     };
80   };
82   config = mkIf cfg.enable {
83     environment.systemPackages = utils.removePackagesByName (with pkgs.xfce // pkgs; [
84       glib # for gsettings
85       gtk3.out # gtk-update-icon-cache
87       gnome.gnome-themes-extra
88       gnome.adwaita-icon-theme
89       hicolor-icon-theme
90       tango-icon-theme
91       xfce4-icon-theme
93       desktop-file-utils
94       shared-mime-info # for update-mime-database
96       # For a polkit authentication agent
97       polkit_gnome
99       # Needed by Xfce's xinitrc script
100       xdg-user-dirs # Update user dirs as described in https://freedesktop.org/wiki/Software/xdg-user-dirs/
102       exo
103       garcon
104       libxfce4ui
106       mousepad
107       parole
108       ristretto
109       xfce4-appfinder
110       xfce4-notifyd
111       xfce4-screenshooter
112       xfce4-session
113       xfce4-settings
114       xfce4-taskmanager
115       xfce4-terminal
116     ] # TODO: NetworkManager doesn't belong here
117       ++ optional config.networking.networkmanager.enable networkmanagerapplet
118       ++ optional config.powerManagement.enable xfce4-power-manager
119       ++ optionals config.hardware.pulseaudio.enable [
120         pavucontrol
121         # volume up/down keys support:
122         # xfce4-pulseaudio-plugin includes all the functionalities of xfce4-volumed-pulse
123         # but can only be used with xfce4-panel, so for no-desktop usage we still include
124         # xfce4-volumed-pulse
125         (if cfg.noDesktop then xfce4-volumed-pulse else xfce4-pulseaudio-plugin)
126       ] ++ optionals cfg.enableXfwm [
127         xfwm4
128         xfwm4-themes
129       ] ++ optionals (!cfg.noDesktop) [
130         xfce4-panel
131         xfdesktop
132       ] ++ optional cfg.enableScreensaver xfce4-screensaver) excludePackages;
134     programs.xfconf.enable = true;
135     programs.thunar.enable = true;
137     environment.pathsToLink = [
138       "/share/xfce4"
139       "/lib/xfce4"
140       "/share/gtksourceview-3.0"
141       "/share/gtksourceview-4.0"
142     ];
144     services.xserver.desktopManager.session = [{
145       name = "xfce";
146       desktopNames = [ "XFCE" ];
147       bgSupport = true;
148       start = ''
149         ${pkgs.runtimeShell} ${pkgs.xfce.xfce4-session.xinitrc} &
150         waitPID=$!
151       '';
152     }];
154     services.xserver.updateDbusEnvironment = true;
155     services.xserver.gdk-pixbuf.modulePackages = [ pkgs.librsvg ];
157     # Enable helpful DBus services.
158     services.udisks2.enable = true;
159     security.polkit.enable = true;
160     services.accounts-daemon.enable = true;
161     services.upower.enable = config.powerManagement.enable;
162     services.gnome.glib-networking.enable = true;
163     services.gvfs.enable = true;
164     services.tumbler.enable = true;
165     services.system-config-printer.enable = (mkIf config.services.printing.enable (mkDefault true));
166     services.xserver.libinput.enable = mkDefault true; # used in xfce4-settings-manager
168     # Enable default programs
169     programs.dconf.enable = true;
171     # Shell integration for VTE terminals
172     programs.bash.vteIntegration = mkDefault true;
173     programs.zsh.vteIntegration = mkDefault true;
175     # Systemd services
176     systemd.packages = utils.removePackagesByName (with pkgs.xfce; [
177       xfce4-notifyd
178     ]) excludePackages;
180     security.pam.services.xfce4-screensaver.unixAuth = cfg.enableScreensaver;
182     xdg.portal.configPackages = mkDefault [ pkgs.xfce.xfce4-session ];
183   };