1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6
7 xcfg = config.services.xserver;
8 cfg = xcfg.desktopManager;
9
10 # If desktop manager `d' isn't capable of setting a background and
11 # the xserver is enabled, the `feh' program is used as a fallback.
12 needBGCond = d: ! (d ? bgSupport && d.bgSupport) && xcfg.enable;
13
14in
15
16{
17 # Note: the order in which desktop manager modules are imported here
18 # determines the default: later modules (if enabled) are preferred.
19 # E.g., if KDE is enabled, it supersedes xterm.
20 imports = [
21 ./none.nix ./xterm.nix ./xfce.nix ./kde4.nix ./kde5.nix
22 ./enlightenment.nix ./gnome3.nix ./kodi.nix
23 ];
24
25 options = {
26
27 services.xserver.desktopManager = {
28
29 session = mkOption {
30 internal = true;
31 default = [];
32 example = singleton
33 { name = "kde";
34 bgSupport = true;
35 start = "...";
36 };
37 description = ''
38 Internal option used to add some common line to desktop manager
39 scripts before forwarding the value to the
40 <varname>displayManager</varname>.
41 '';
42 apply = list: {
43 list = map (d: d // {
44 manage = "desktop";
45 start = d.start
46 + optionalString (needBGCond d) ''
47 if test -e $HOME/.background-image; then
48 ${pkgs.feh}/bin/feh --bg-scale $HOME/.background-image
49 fi
50 '';
51 }) list;
52 needBGPackages = [] != filter needBGCond list;
53 };
54 };
55
56 default = mkOption {
57 type = types.str;
58 default = "";
59 example = "none";
60 description = "Default desktop manager loaded if none have been chosen.";
61 apply = defaultDM:
62 if defaultDM == "" && cfg.session.list != [] then
63 (head cfg.session.list).name
64 else if any (w: w.name == defaultDM) cfg.session.list then
65 defaultDM
66 else
67 throw ''
68 Default desktop manager (${defaultDM}) not found.
69 Probably you want to change
70 services.xserver.desktopManager.default = "${defaultDM}";
71 to one of
72 ${concatMapStringsSep "\n " (w: "services.xserver.desktopManager.default = \"${w.name}\";") cfg.session.list}
73 '';
74 };
75
76 };
77
78 };
79
80 config = {
81 services.xserver.displayManager.session = cfg.session.list;
82 environment.systemPackages =
83 mkIf cfg.session.needBGPackages [ pkgs.feh ];
84 };
85}