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}