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