grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / x11 / desktop-managers / xfce.nix
blob98d3555ccbc5eec25984d53d377a08706379b657
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 = "Enable the Xfce desktop environment.";
53       };
55       noDesktop = mkOption {
56         type = types.bool;
57         default = false;
58         description = "Don't install XFCE desktop components (xfdesktop and panel).";
59       };
61       enableXfwm = mkOption {
62         type = types.bool;
63         default = true;
64         description = "Enable the XFWM (default) window manager.";
65       };
67       enableScreensaver = mkOption {
68         type = types.bool;
69         default = true;
70         description = "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 = "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-themes-extra
88       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 || config.services.pipewire.pulse.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.gnupg.agent.pinentryPackage = mkDefault pkgs.pinentry-gtk2;
135     programs.xfconf.enable = true;
136     programs.thunar.enable = true;
138     environment.pathsToLink = [
139       "/share/xfce4"
140       "/lib/xfce4"
141       "/share/gtksourceview-3.0"
142       "/share/gtksourceview-4.0"
143     ];
145     services.xserver.desktopManager.session = [{
146       name = "xfce";
147       desktopNames = [ "XFCE" ];
148       bgSupport = !cfg.noDesktop;
149       start = ''
150         ${pkgs.runtimeShell} ${pkgs.xfce.xfce4-session.xinitrc} &
151         waitPID=$!
152       '';
153     }];
155     services.xserver.updateDbusEnvironment = true;
156     programs.gdk-pixbuf.modulePackages = [ pkgs.librsvg ];
158     # Enable helpful DBus services.
159     services.udisks2.enable = true;
160     security.polkit.enable = true;
161     services.accounts-daemon.enable = true;
162     services.upower.enable = config.powerManagement.enable;
163     services.gnome.glib-networking.enable = true;
164     services.gvfs.enable = true;
165     services.tumbler.enable = true;
166     services.system-config-printer.enable = (mkIf config.services.printing.enable (mkDefault true));
167     services.libinput.enable = mkDefault true; # used in xfce4-settings-manager
168     services.colord.enable = mkDefault true;
170     # Enable default programs
171     programs.dconf.enable = true;
173     # Shell integration for VTE terminals
174     programs.bash.vteIntegration = mkDefault true;
175     programs.zsh.vteIntegration = mkDefault true;
177     # Systemd services
178     systemd.packages = utils.removePackagesByName (with pkgs.xfce; [
179       xfce4-notifyd
180     ]) excludePackages;
182     security.pam.services.xfce4-screensaver.unixAuth = cfg.enableScreensaver;
184     xdg.portal.configPackages = mkDefault [ pkgs.xfce.xfce4-session ];
185   };