{ config, pkgs, ... }: with pkgs.lib; let xcfg = config.services.xserver; cfg = xcfg.desktopManager.kde4; xorg = pkgs.xorg; isKDE47 = pkgs.kde4 ? kde_wallpapers; in { options = { services.xserver.desktopManager.kde4.enable = mkOption { default = false; example = true; description = "Enable the KDE 4 desktop environment."; }; environment.kdePackages = mkOption { default = []; example = "[ pkgs.kde4.kdesdk ]"; type = types.list types.package; description = "This option is obsolete. Please use instead."; }; }; config = mkIf (xcfg.enable && cfg.enable) { # If KDE 4 is enabled, make it the default desktop manager (unless # overriden by the user's configuration). # !!! doesn't work yet ("Multiple definitions. Only one is allowed # for this option.") # services.xserver.desktopManager.default = mkOverrideTemplate 900 "kde4"; services.xserver.desktopManager.session = singleton { name = "kde4"; bgSupport = true; start = '' # The KDE icon cache is supposed to update itself # automatically, but it uses the timestamp on the icon # theme directory as a trigger. Since in Nix the # timestamp is always the same, this doesn't work. So as # a workaround, nuke the icon cache on login. This isn't # perfect, since it may require logging out after # installing new applications to update the cache. # See http://lists-archives.org/kde-devel/26175-what-when-will-icon-cache-refresh.html rm -fv $HOME/.kde/cache-*/icon-cache.kcache # Qt writes a weird ‘libraryPath’ line to # ~/.config/Trolltech.conf that causes the KDE plugin # paths of previous KDE invocations to be searched. # Obviously using mismatching KDE libraries is potentially # disastrous, so here we nuke references to the Nix store # in Trolltech.conf. A better solution would be to stop # Qt from doing this wackiness in the first place. if [ -e $HOME/.config/Trolltech.conf ]; then sed -e '/nix\\store\|nix\/store/ d' -i $HOME/.config/Trolltech.conf fi ${optionalString (!isKDE47) '' export DBUS_FATAL_WARNINGS=0 ''} # Start KDE. exec ${pkgs.kde4.kdebase_workspace}/bin/startkde ''; }; security.setuidOwners = singleton { program = "kcheckpass"; source = "${pkgs.kde4.kdebase_workspace}/lib/kde4/libexec/kcheckpass"; owner = "root"; group = "root"; setuid = true; }; environment.systemPackages = (if !isKDE47 then # KDE <= 4.6 [ # temporary workarounds pkgs.shared_desktop_ontologies pkgs.strigi pkgs.kde4.kdelibs pkgs.kde4.kdebase pkgs.kde4.kdebase_runtime pkgs.kde4.kdebase_workspace pkgs.kde4.oxygen_icons pkgs.kde4.qt4 # needed for qdbus pkgs.shared_mime_info pkgs.gst_all.gstreamer pkgs.gst_all.gstPluginsBase pkgs.gst_all.gstPluginsGood pkgs.gst_all.gstFfmpeg # for mp3 playback xorg.xmessage # so that startkde can show error messages xorg.xset # used by startkde, non-essential ] ++ optional (pkgs ? phonon_backend_gstreamer) pkgs.phonon_backend_gstreamer else # KDE >= 4.7 [ pkgs.kde4.kdelibs pkgs.kde4.kde_baseapps # Splitted kdebase pkgs.kde4.kde_workspace pkgs.kde4.kde_runtime pkgs.kde4.konsole pkgs.kde4.kate pkgs.kde4.kde_wallpapers # contains kdm's default background pkgs.kde4.oxygen_icons pkgs.virtuoso # to enable Nepomuk to find Virtuoso # Starts KDE's Polkit authentication agent. pkgs.kde4.polkit_kde_agent # Phonon backends. pkgs.phonon_backend_gstreamer pkgs.gst_all.gstPluginsBase pkgs.gst_all.gstPluginsGood pkgs.gst_all.gstPluginsUgly pkgs.gst_all.gstPluginsBad pkgs.gst_all.gstFfmpeg # for mp3 playback pkgs.gst_all.gstreamer # needed? # Miscellaneous runtime dependencies. pkgs.kde4.qt4 # needed for qdbus pkgs.shared_mime_info xorg.xmessage # so that startkde can show error messages xorg.xset # used by startkde, non-essential xorg.xauth # used by kdesu pkgs.shared_desktop_ontologies # used by nepomuk pkgs.strigi # used by nepomuk ] ) ++ config.environment.kdePackages; environment.pathsToLink = [ "/share" ]; environment.etc = singleton { source = "${pkgs.xkeyboard_config}/etc/X11/xkb"; target = "X11/xkb"; }; # Enable helpful DBus services. services.hal = mkIf (!isKDE47) { enable = true; }; services.udisks = mkIf isKDE47 { enable = true; }; services.upower = mkIf (isKDE47 && config.powerManagement.enable) { enable = true; }; }; }