summary refs log tree commit diff
diff options
context:
space:
mode:
authorThomas Tuegel <ttuegel@mailbox.org>2017-10-19 18:22:03 -0500
committerThomas Tuegel <ttuegel@mailbox.org>2017-10-20 09:28:56 -0500
commitebcccaf7544457a2cce2f08a404d6ccb565b7acd (patch)
tree995caf2d255c9908bcdc0f8b04bdaa47d0433821
parentf7de0da188781aea2a4bf2b17e1fbaf8d65925da (diff)
downloadnixpkgs-ebcccaf7544457a2cce2f08a404d6ccb565b7acd.tar
nixpkgs-ebcccaf7544457a2cce2f08a404d6ccb565b7acd.tar.gz
nixpkgs-ebcccaf7544457a2cce2f08a404d6ccb565b7acd.tar.bz2
nixpkgs-ebcccaf7544457a2cce2f08a404d6ccb565b7acd.tar.lz
nixpkgs-ebcccaf7544457a2cce2f08a404d6ccb565b7acd.tar.xz
nixpkgs-ebcccaf7544457a2cce2f08a404d6ccb565b7acd.tar.zst
nixpkgs-ebcccaf7544457a2cce2f08a404d6ccb565b7acd.zip
plasma-workspace: enable Wayland session support
-rw-r--r--nixos/modules/services/x11/desktop-managers/plasma5.nix2
-rw-r--r--pkgs/desktops/plasma-5/plasma-workspace/default.nix56
-rw-r--r--pkgs/desktops/plasma-5/plasma-workspace/plasma-workspace.patch1191
-rw-r--r--pkgs/desktops/plasma-5/plasma-workspace/qml-import-path.patch52
-rw-r--r--pkgs/desktops/plasma-5/plasma-workspace/series1
5 files changed, 1235 insertions, 67 deletions
diff --git a/nixos/modules/services/x11/desktop-managers/plasma5.nix b/nixos/modules/services/x11/desktop-managers/plasma5.nix
index d7e72c4a7ae..b9498b1627f 100644
--- a/nixos/modules/services/x11/desktop-managers/plasma5.nix
+++ b/nixos/modules/services/x11/desktop-managers/plasma5.nix
@@ -47,7 +47,7 @@ in
             ${getBin config.hardware.pulseaudio.package}/bin/pactl load-module module-device-manager "do_routing=1"
           ''}
 
-          exec "${plasma5.startkde}"
+          exec "${getBin plasma5.plasma-workspace}/bin/startkde"
         '';
       };
 
diff --git a/pkgs/desktops/plasma-5/plasma-workspace/default.nix b/pkgs/desktops/plasma-5/plasma-workspace/default.nix
index b28a1e87fb6..6fc6ef6d9e1 100644
--- a/pkgs/desktops/plasma-5/plasma-workspace/default.nix
+++ b/pkgs/desktops/plasma-5/plasma-workspace/default.nix
@@ -1,19 +1,23 @@
 {
-  mkDerivation, lib, copyPathsToStore,
+  mkDerivation, lib,
 
   extra-cmake-modules, kdoctools,
 
-  isocodes, libdbusmenu, libSM, libXcursor, libXtst, pam, wayland,
+  coreutils, dbus, gnugrep, gnused, isocodes, libdbusmenu, libSM, libXcursor,
+  libXtst, pam, wayland, xmessage, xprop, xrdb, xsetroot,
 
   baloo, kactivities, kcmutils, kconfig, kcrash, kdbusaddons, kdeclarative,
-  kdelibs4support, kdesu, kglobalaccel, kidletime, kjsembed, knewstuff,
+  kdelibs4support, kdesu, kglobalaccel, kidletime, kinit, kjsembed, knewstuff,
   knotifyconfig, kpackage, krunner, kscreenlocker, ktexteditor, ktextwidgets,
   kwallet, kwayland, kwin, kxmlrpcclient, libkscreen, libksysguard,
   networkmanager-qt, phonon, plasma-framework, prison, solid,
 
-  qtgraphicaleffects, qtquickcontrols, qtquickcontrols2, qtscript, qtx11extras,
+  qtgraphicaleffects, qtquickcontrols, qtquickcontrols2, qtscript, qttools,
+  qtwayland, qtx11extras,
 }:
 
+let inherit (lib) getBin getLib; in
+
 mkDerivation {
   name = "plasma-workspace";
 
@@ -27,21 +31,47 @@ mkDerivation {
     kwallet kwayland kwin kxmlrpcclient libkscreen libksysguard
     networkmanager-qt phonon plasma-framework prison solid
 
-    qtgraphicaleffects qtquickcontrols qtquickcontrols2 qtscript qtx11extras
+    qtgraphicaleffects qtquickcontrols qtquickcontrols2 qtscript qtwayland qtx11extras
   ];
   outputs = [ "out" "dev" "bin" ];
 
-  patches = copyPathsToStore (lib.readPathsFromFile ./. ./series);
+  cmakeFlags = [
+    "-DNIXPKGS_XMESSAGE=${getBin xmessage}/bin/xmessage"
+    "-DNIXPKGS_MKDIR=${getBin coreutils}/bin/mkdir"
+    "-DNIXPKGS_XRDB=${getBin xrdb}/bin/xrdb"
+    "-DNIXPKGS_QTPATHS=${getBin qttools}/bin/qtpaths"
+    "-DNIXPKGS_XSETROOT=${getBin xsetroot}/bin/xsetroot"
+    "-DNIXPKGS_XPROP=${getBin xprop}/bin/xprop"
+    "-DNIXPKGS_ID=${getBin coreutils}/bin/id"
+    "-DNIXPKGS_DBUS_UPDATE_ACTIVATION_ENVIRONMENT=${getBin dbus}/bin/dbus-update-activation-environment"
+    "-DNIXPKGS_START_KDEINIT_WRAPPER=${getLib kinit}/lib/libexec/kf5/start_kdeinit_wrapper"
+    "-DNIXPKGS_QDBUS=${getBin qttools}/bin/qdbus"
+    "-DNIXPKGS_KWRAPPER5=${getBin kinit}/bin/kwrapper5"
+    "-DNIXPKGS_KREADCONFIG5=${getBin kconfig}/bin/kreadconfig5"
+    "-DNIXPKGS_GREP=${getBin gnugrep}/bin/grep"
+    "-DNIXPKGS_KDEINIT5_SHUTDOWN=${getBin kinit}/bin/kdeinit5_shutdown"
+    "-DNIXPKGS_SED=${getBin gnused}/bin/sed"
+  ];
+
+  # To regenerate ./plasma-workspace.patch,
+  #
+  # > git clone https://github.com/ttuegel/plasma-workspace
+  # > cd plasma-workspace
+  # > git checkout nixpkgs/$x.$y  # where $x.$y.$z == $version
+  # ... make some commits ...
+  # > git diff v$x.$y.$z
+  #
+  # Add upstream patches to the list below. For new patchs, particularly if not
+  # submitted upstream, please make a pull request and add it to
+  # ./plasma-workspace.patch.
+  patches = [ ./plasma-workspace.patch ];
 
-  postPatch = ''
-    substituteInPlace startkde/kstartupconfig/kstartupconfig.cpp \
-        --replace kdostartupconfig5 ''${!outputBin}/bin/kdostartupconfig5
+  preConfigure = ''
+    NIX_CFLAGS_COMPILE+=" -DNIXPKGS_KDOSTARTUPCONFIG5=\"''${!outputBin}/bin/kdostartupconfig5\""
+    cmakeFlags+=" -DNIXPKGS_STARTPLASMA=''${!outputBin}/lib/libexec/startplasma"
   '';
 
   postInstall = ''
-    rm "''${!outputBin}/bin/startkde"
-    rm "''${!outputBin}/bin/startplasmacompositor"
-    rm "''${!outputLib}/lib/libexec/startplasma"
-    rm -r "''${!outputBin}/share/wayland-sessions"
+    moveToOutput lib/libexec/startplasma ''${!outputBin}
   '';
 }
diff --git a/pkgs/desktops/plasma-5/plasma-workspace/plasma-workspace.patch b/pkgs/desktops/plasma-5/plasma-workspace/plasma-workspace.patch
new file mode 100644
index 00000000000..1f4b83cf83b
--- /dev/null
+++ b/pkgs/desktops/plasma-5/plasma-workspace/plasma-workspace.patch
@@ -0,0 +1,1191 @@
+diff --git a/applets/batterymonitor/package/contents/ui/BatteryItem.qml b/applets/batterymonitor/package/contents/ui/BatteryItem.qml
+index 7e2d9758..40a5797b 100644
+--- a/applets/batterymonitor/package/contents/ui/BatteryItem.qml
++++ b/applets/batterymonitor/package/contents/ui/BatteryItem.qml
+@@ -26,7 +26,7 @@ import org.kde.plasma.components 2.0 as PlasmaComponents
+ import org.kde.plasma.extras 2.0 as PlasmaExtras
+ import org.kde.plasma.workspace.components 2.0
+ import org.kde.kcoreaddons 1.0 as KCoreAddons
+-import "logic.js" as Logic
++import "../code/logic.js" as Logic
+ 
+ Item {
+     id: batteryItem
+diff --git a/applets/batterymonitor/package/contents/ui/batterymonitor.qml b/applets/batterymonitor/package/contents/ui/batterymonitor.qml
+index ae6d5919..c2f99c86 100644
+--- a/applets/batterymonitor/package/contents/ui/batterymonitor.qml
++++ b/applets/batterymonitor/package/contents/ui/batterymonitor.qml
+@@ -25,7 +25,7 @@ import org.kde.plasma.plasmoid 2.0
+ import org.kde.plasma.core 2.0 as PlasmaCore
+ import org.kde.kcoreaddons 1.0 as KCoreAddons
+ import org.kde.kquickcontrolsaddons 2.0
+-import "logic.js" as Logic
++import "../code/logic.js" as Logic
+ 
+ Item {
+     id: batterymonitor
+diff --git a/applets/lock_logout/contents/ui/lockout.qml b/applets/lock_logout/contents/ui/lockout.qml
+index 80e7e53b..0083cf01 100644
+--- a/applets/lock_logout/contents/ui/lockout.qml
++++ b/applets/lock_logout/contents/ui/lockout.qml
+@@ -23,7 +23,7 @@ import org.kde.plasma.plasmoid 2.0
+ import org.kde.plasma.core 2.0 as PlasmaCore
+ import org.kde.plasma.components 2.0
+ import org.kde.kquickcontrolsaddons 2.0
+-import "data.js" as Data
++import "../code/data.js" as Data
+ 
+ Flow {
+     id: lockout
+diff --git a/applets/notifications/package/contents/ui/main.qml b/applets/notifications/package/contents/ui/main.qml
+index acdda88f..989de8ab 100644
+--- a/applets/notifications/package/contents/ui/main.qml
++++ b/applets/notifications/package/contents/ui/main.qml
+@@ -28,7 +28,7 @@ import org.kde.plasma.extras 2.0 as PlasmaExtras
+ 
+ import org.kde.plasma.private.notifications 1.0
+ 
+-import "uiproperties.js" as UiProperties
++import "../code/uiproperties.js" as UiProperties
+ 
+ MouseEventListener {
+     id: notificationsApplet
+diff --git a/krunner/dbus/org.kde.krunner.service.in b/krunner/dbus/org.kde.krunner.service.in
+index 85715214..294eab08 100644
+--- a/krunner/dbus/org.kde.krunner.service.in
++++ b/krunner/dbus/org.kde.krunner.service.in
+@@ -1,4 +1,4 @@
+ [D-BUS Service]
+ Name=org.kde.krunner
+-Exec=@CMAKE_INSTALL_PREFIX@/bin/krunner
++Exec=@CMAKE_INSTALL_FULL_BINDIR@/krunner
+ 
+diff --git a/kuiserver/org.kde.kuiserver.service.in b/kuiserver/org.kde.kuiserver.service.in
+index 7a86d07f..5b3030cc 100644
+--- a/kuiserver/org.kde.kuiserver.service.in
++++ b/kuiserver/org.kde.kuiserver.service.in
+@@ -1,3 +1,3 @@
+ [D-BUS Service]
+ Name=org.kde.kuiserver
+-Exec=@CMAKE_INSTALL_PREFIX@/bin/kuiserver5
++Exec=@CMAKE_INSTALL_FULL_BINDIR@/kuiserver5
+diff --git a/startkde/CMakeLists.txt b/startkde/CMakeLists.txt
+index fe29f57a..247db953 100644
+--- a/startkde/CMakeLists.txt
++++ b/startkde/CMakeLists.txt
+@@ -3,11 +3,6 @@ add_subdirectory(kstartupconfig)
+ add_subdirectory(ksyncdbusenv)
+ add_subdirectory(waitforname)
+ 
+-#FIXME: reconsider, looks fishy
+-if(NOT CMAKE_INSTALL_PREFIX STREQUAL "/usr")
+-    set(EXPORT_XCURSOR_PATH "XCURSOR_PATH=${CMAKE_INSTALL_PREFIX}/share/icons:$XCURSOR_PATH\":~/.icons:/usr/share/icons:/usr/share/pixmaps:/usr/X11R6/lib/X11/icons\"; export XCURSOR_PATH")
+-endif()
+-
+ configure_file(startkde.cmake ${CMAKE_CURRENT_BINARY_DIR}/startkde  @ONLY)
+ configure_file(startplasmacompositor.cmake ${CMAKE_CURRENT_BINARY_DIR}/startplasmacompositor  @ONLY)
+ configure_file(startplasma.cmake ${CMAKE_CURRENT_BINARY_DIR}/startplasma  @ONLY)
+diff --git a/startkde/kstartupconfig/kstartupconfig.cpp b/startkde/kstartupconfig/kstartupconfig.cpp
+index c9927855..bd506ce2 100644
+--- a/startkde/kstartupconfig/kstartupconfig.cpp
++++ b/startkde/kstartupconfig/kstartupconfig.cpp
+@@ -147,5 +147,5 @@ int main()
+     fclose( keys );
+     fclose( config );
+   doit:
+-    return system( "kdostartupconfig5" );
++    return system( NIXPKGS_KDOSTARTUPCONFIG5 );
+     }
+diff --git a/startkde/startkde.cmake b/startkde/startkde.cmake
+index e9fa0bee..79e50a96 100644
+--- a/startkde/startkde.cmake
++++ b/startkde/startkde.cmake
+@@ -1,22 +1,31 @@
+ #!/bin/sh
+ #
+-#  DEFAULT Plasma STARTUP SCRIPT ( @PROJECT_VERSION@ )
++#  NIXPKGS KDE STARTUP SCRIPT ( @PROJECT_VERSION@ )
+ #
+ 
++if test "x$1" = x--failsafe; then
++    KDE_FAILSAFE=1 # General failsafe flag
++    KWIN_COMPOSE=N # Disable KWin's compositing
++    QT_XCB_FORCE_SOFTWARE_OPENGL=1
++    export KWIN_COMPOSE KDE_FAILSAFE QT_XCB_FORCE_SOFTWARE_OPENGL
++fi
++
+ # When the X server dies we get a HUP signal from xinit. We must ignore it
+ # because we still need to do some cleanup.
+ trap 'echo GOT SIGHUP' HUP
+ 
+-# Check if a Plasma session already is running and whether it's possible to connect to X
+-kcheckrunning
++# we have to unset this for Darwin since it will screw up KDE's dynamic-loading
++unset DYLD_FORCE_FLAT_NAMESPACE
++
++# Check if a KDE session already is running and whether it's possible to connect to X
++@CMAKE_INSTALL_FULL_BINDIR@/kcheckrunning
+ kcheckrunning_result=$?
+-if test $kcheckrunning_result -eq 0 ; then
+-	echo "Plasma seems to be already running on this display."
+-	xmessage -geometry 500x100 "Plasma seems to be already running on this display." > /dev/null 2>/dev/null
+-	exit 1
+-elif test $kcheckrunning_result -eq 2 ; then
+-	echo "\$DISPLAY is not set or cannot connect to the X server."
+-        exit 1
++if [ $kcheckrunning_result -eq 0 ]; then
++    echo "KDE seems to be already running on this display."
++    exit 1
++elif [ $kcheckrunning_result -eq 2 ]; then
++    echo "\$DISPLAY is not set or cannot connect to the X server."
++    exit 1
+ fi
+ 
+ # Boot sequence:
+@@ -33,59 +42,132 @@ fi
+ #
+ # * Then ksmserver is started which takes control of the rest of the startup sequence
+ 
+-# We need to create config folder so we can write startupconfigkeys
+-if [  ${XDG_CONFIG_HOME} ]; then
+-  configDir=$XDG_CONFIG_HOME;
+-else
+-  configDir=${HOME}/.config; #this is the default, http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
++export XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"
++@NIXPKGS_MKDIR@ -p "$XDG_CONFIG_HOME"
++
++# 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/.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 $XDG_CONFIG_HOME/Trolltech.conf ]; then
++    @NIXPKGS_SED@ -e '/nix\\store\|nix\/store/ d' -i $XDG_CONFIG_HOME/Trolltech.conf
+ fi
+ 
+-mkdir -p $configDir
++@NIXPKGS_KBUILDSYCOCA5@
++
++# Set the default GTK 2 theme
++gtkrc2="$HOME/.gtkrc-2.0"
++breeze_gtkrc2="/run/current-system/sw/share/themes/Breeze/gtk-2.0/gtkrc"
++if ! [ -e "$gtkrc2" ] && [ -e "$breeze_gtkrc2" ]; then
++    cat >"$gtkrc2" <<EOF
++# Default GTK+ 2 config for NixOS KDE 5
++include "$breeze_gtkrc2"
++style "user-font"
++{
++  font_name="Sans Serif Regular"
++}
++widget_class "*" style "user-font"
++gtk-font-name="Sans Serif Regular 10"
++gtk-theme-name="Breeze"
++gtk-icon-theme-name="breeze"
++gtk-fallback-icon-theme="hicolor"
++gtk-cursor-theme-name="breeze_cursors"
++gtk-toolbar-style=GTK_TOOLBAR_ICONS
++gtk-menu-images=1
++gtk-button-images=1
++EOF
++fi
++
++# Set the default GTK 3 theme
++gtk3_settings="$XDG_CONFIG_HOME/gtk-3.0/settings.ini"
++breeze_gtk3="/run/current-system/sw/share/themes/Breeze/gtk-3.0"
++if ! [ -e "$gtk3_settings" ] && [ -e "$breeze_gtk" ]; then
++    mkdir -p $(dirname "$gtk3_settings")
++    cat >"$gtk3_settings" <<EOF
++[Settings]
++gtk-font-name=Sans Serif Regular 10
++gtk-theme-name=Breeze
++gtk-icon-theme-name=breeze
++gtk-fallback-icon-theme=hicolor
++gtk-cursor-theme-name=breeze_cursors
++gtk-toolbar-style=GTK_TOOLBAR_ICONS
++gtk-menu-images=1
++gtk-button-images=1
++EOF
++fi
++
++kcminputrc="$XDG_CONFIG_HOME/kcminputrc"
++if ! [ -e "$kcminputrc" ]; then
++    cat >"$kcminputrc" <<EOF
++[Mouse]
++cursorTheme=breeze_cursors
++cursorSize=0
++EOF
++fi
+ 
+ #This is basically setting defaults so we can use them with kstartupconfig5
+-cat >$configDir/startupconfigkeys <<EOF
++cat >"$XDG_CONFIG_HOME/startupconfigkeys" <<EOF
+ kcminputrc Mouse cursorTheme 'breeze_cursors'
+ kcminputrc Mouse cursorSize ''
+-ksplashrc KSplash Theme Breeze
++ksplashrc KSplash Theme org.kde.breeze.desktop
+ ksplashrc KSplash Engine KSplashQML
+ kdeglobals KScreen ScreenScaleFactors ''
+ kcmfonts General forceFontDPI 0
++kcmfonts General dontChangeAASettings true
+ EOF
+ 
+ # preload the user's locale on first start
+-plasmalocalerc=$configDir/plasma-localerc
+-test -f $plasmalocalerc || {
+-cat >$plasmalocalerc <<EOF
++plasmalocalerc="$XDG_CONFIG_HOME/plasma-localerc"
++if ! [ -f "$plasmalocalerc" ]; then
++    cat >"$plasmalocalerc" <<EOF
+ [Formats]
+ LANG=$LANG
+ EOF
+-}
++fi
+ 
+ # export LC_* variables set by kcmshell5 formats into environment
+ # so it can be picked up by QLocale and friends.
+-exportformatssettings=$configDir/plasma-locale-settings.sh
+-test -f $exportformatssettings && {
+-    . $exportformatssettings
+-}
++exportformatssettings="$XDG_CONFIG_HOME/plasma-locale-settings.sh"
++if [ -r "$exportformatssettings" ]; then
++    . "$exportformatssettings"
++fi
+ 
+ # Write a default kdeglobals file to set up the font
+-kdeglobalsfile=$configDir/kdeglobals
+-test -f $kdeglobalsfile || {
+-cat >$kdeglobalsfile <<EOF
++kdeglobalsfile="$XDG_CONFIG_HOME/kdeglobals"
++if ! [ -f "$kdeglobalsfile" ]; then
++    cat >"$kdeglobalsfile" <<EOF
+ [General]
+-XftAntialias=true
+-XftHintStyle=hintmedium
+-XftSubPixel=none
++fixed=Monospace,10,-1,5,50,0,0,0,0,0,Regular
++font=Sans Serif,10,-1,5,50,0,0,0,0,0,Regular
++menuFont=Sans Serif,10,-1,5,50,0,0,0,0,0,Regular
++smallestReadableFont=Sans Serif,8,-1,5,50,0,0,0,0,0,Regular
++toolBarFont=Sans Serif,8,-1,5,50,0,0,0,0,0,Regular
++
++[WM]
++activeFont=Noto Sans,12,-1,5,50,0,0,0,0,0,Bold
+ EOF
+-}
++fi
+ 
+-kstartupconfig5
+-returncode=$?
+-if test $returncode -ne 0; then
+-    xmessage -geometry 500x100 "kstartupconfig5 does not exist or fails. The error code is $returncode. Check your installation."
++if ! @CMAKE_INSTALL_FULL_BINDIR@/kstartupconfig5; then
++    echo "kstartupconfig5 does not exist or fails. The error code is $returncode. Check your installation." 1>&2
+     exit 1
+ fi
+-[ -r $configDir/startupconfig ] && . $configDir/startupconfig
++if [ -r "$XDG_CONFIG_HOME/startupconfig" ]; then
++    . "$XDG_CONFIG_HOME/startupconfig"
++fi
+ 
+ if [ "$kdeglobals_kscreen_screenscalefactors" ]; then
+     export QT_SCREEN_SCALE_FACTORS="$kdeglobals_kscreen_screenscalefactors"
+@@ -94,26 +176,33 @@ fi
+ #otherwise apps that manually opt in for high DPI get auto scaled by the developer AND manually scaled by us
+ export QT_AUTO_SCREEN_SCALE_FACTOR=0
+ 
++#Set the QtQuickControls style to our own: for QtQuickControls1
++#it will fall back to Desktop, while it will use our own org.kde.desktop
++#for QtQuickControlsStyle and Kirigami
++export QT_QUICK_CONTROLS_STYLE=org.kde.desktop
++
++XCURSOR_PATH=~/.icons
++IFS=":" read -r -a xdgDirs <<< "$XDG_DATA_DIRS"
++for xdgDir in "${xdgDirs[@]}"; do
++    XCURSOR_PATH="$XCURSOR_PATH:$xdgDir/icons"
++done
++export XCURSOR_PATH
++
+ # XCursor mouse theme needs to be applied here to work even for kded or ksmserver
+ if test -n "$kcminputrc_mouse_cursortheme" -o -n "$kcminputrc_mouse_cursorsize" ; then
+-    @EXPORT_XCURSOR_PATH@
+-
+     kapplymousetheme "$kcminputrc_mouse_cursortheme" "$kcminputrc_mouse_cursorsize"
+-    if test $? -eq 10; then
+-        XCURSOR_THEME=breeze_cursors
+-        export XCURSOR_THEME
+-    elif test -n "$kcminputrc_mouse_cursortheme"; then
+-        XCURSOR_THEME="$kcminputrc_mouse_cursortheme"
+-        export XCURSOR_THEME
++    if [ $? -eq 10 ]; then
++        export XCURSOR_THEME=breeze_cursors
++    elif [ -n "$kcminputrc_mouse_cursortheme" ]; then
++        export XCURSOR_THEME="$kcminputrc_mouse_cursortheme"
+     fi
+-    if test -n "$kcminputrc_mouse_cursorsize"; then
+-        XCURSOR_SIZE="$kcminputrc_mouse_cursorsize"
+-        export XCURSOR_SIZE
++    if [ -n "$kcminputrc_mouse_cursorsize" ]; then
++        export XCURSOR_SIZE="$kcminputrc_mouse_cursorsize"
+     fi
+ fi
+ 
+-if test "$kcmfonts_general_forcefontdpi" -ne 0; then
+-    xrdb -quiet -merge -nocpp <<EOF
++if [ "${kcmfonts_general_forcefontdpi:-0}" -ne 0 ]; then
++    @NIXPKGS_XRDB@ -quiet -merge -nocpp <<EOF
+ Xft.dpi: $kcmfonts_general_forcefontdpi
+ EOF
+ fi
+@@ -122,11 +211,11 @@ dl=$DESKTOP_LOCKED
+ unset DESKTOP_LOCKED # Don't want it in the environment
+ 
+ ksplash_pid=
+-if test -z "$dl"; then
++if [ -z "$dl" ]; then
+   # the splashscreen and progress indicator
+   case "$ksplashrc_ksplash_engine" in
+     KSplashQML)
+-      ksplash_pid=`ksplashqml "${ksplashrc_ksplash_theme}" --pid`
++      ksplash_pid=$(@CMAKE_INSTALL_FULL_BINDIR@/ksplashqml "${ksplashrc_ksplash_theme}" --pid)
+       ;;
+     None)
+       ;;
+@@ -135,71 +224,6 @@ if test -z "$dl"; then
+   esac
+ fi
+ 
+-# Source scripts found in <config locations>/plasma-workspace/env/*.sh
+-# (where <config locations> correspond to the system and user's configuration
+-# directories, as identified by Qt's qtpaths,  e.g.  $HOME/.config
+-# and /etc/xdg/ on Linux)
+-#
+-# This is where you can define environment variables that will be available to
+-# all KDE programs, so this is where you can run agents using e.g. eval `ssh-agent`
+-# or eval `gpg-agent --daemon`.
+-# Note: if you do that, you should also put "ssh-agent -k" as a shutdown script
+-#
+-# (see end of this file).
+-# For anything else (that doesn't set env vars, or that needs a window manager),
+-# better use the Autostart folder.
+-
+-scriptpath=`qtpaths --locate-dirs GenericConfigLocation plasma-workspace | tr ':' '\n'`
+-
+-# Add /env/ to the directory to locate the scripts to be sourced
+-for prefix in `echo $scriptpath`; do
+-  for file in "$prefix"/env/*.sh; do
+-    test -r "$file" && . "$file" || true
+-  done
+-done
+-
+-# Activate the kde font directories.
+-#
+-# There are 4 directories that may be used for supplying fonts for KDE.
+-#
+-# There are two system directories. These belong to the administrator.
+-# There are two user directories, where the user may add her own fonts.
+-#
+-# The 'override' versions are for fonts that should come first in the list,
+-# i.e. if you have a font in your 'override' directory, it will be used in
+-# preference to any other.
+-#
+-# The preference order looks like this:
+-# user override, system override, X, user, system
+-#
+-# Where X is the original font database that was set up before this script
+-# runs.
+-
+-usr_odir=$HOME/.fonts/kde-override
+-usr_fdir=$HOME/.fonts
+-
+-if test -n "$KDEDIRS"; then
+-  kdedirs_first=`echo "$KDEDIRS"|sed -e 's/:.*//'`
+-  sys_odir=$kdedirs_first/share/fonts/override
+-  sys_fdir=$kdedirs_first/share/fonts
+-else
+-  sys_odir=$KDEDIR/share/fonts/override
+-  sys_fdir=$KDEDIR/share/fonts
+-fi
+-
+-# We run mkfontdir on the user's font dirs (if we have permission) to pick
+-# up any new fonts they may have installed. If mkfontdir fails, we still
+-# add the user's dirs to the font path, as they might simply have been made
+-# read-only by the administrator, for whatever reason.
+-
+-test -d "$sys_odir" && xset +fp "$sys_odir"
+-test -d "$usr_odir" && (mkfontdir "$usr_odir" ; xset +fp "$usr_odir")
+-test -d "$usr_fdir" && (mkfontdir "$usr_fdir" ; xset fp+ "$usr_fdir")
+-test -d "$sys_fdir" && xset fp+ "$sys_fdir"
+-
+-# Ask X11 to rebuild its font list.
+-xset fp rehash
+-
+ # Set a left cursor instead of the standard X11 "X" cursor, since I've heard
+ # from some users that they're confused and don't know what to do. This is
+ # especially necessary on slow machines, where starting KDE takes one or two
+@@ -208,28 +232,10 @@ xset fp rehash
+ # If the user has overwritten fonts, the cursor font may be different now
+ # so don't move this up.
+ #
+-xsetroot -cursor_name left_ptr
+-
+-# Get Ghostscript to look into user's KDE fonts dir for additional Fontmap
+-if test -n "$GS_LIB" ; then
+-    GS_LIB=$usr_fdir:$GS_LIB
+-    export GS_LIB
+-else
+-    GS_LIB=$usr_fdir
+-    export GS_LIB
+-fi
++@NIXPKGS_XSETROOT@ -cursor_name left_ptr
+ 
+ echo 'startkde: Starting up...'  1>&2
+ 
+-# Make sure that the KDE prefix is first in XDG_DATA_DIRS and that it's set at all.
+-# The spec allows XDG_DATA_DIRS to be not set, but X session startup scripts tend
+-# to set it to a list of paths *not* including the KDE prefix if it's not /usr or
+-# /usr/local.
+-if test -z "$XDG_DATA_DIRS"; then
+-    XDG_DATA_DIRS="@CMAKE_INSTALL_PREFIX@/@SHARE_INSTALL_PREFIX@:/usr/share:/usr/local/share"
+-fi
+-export XDG_DATA_DIRS
+-
+ # Mark that full KDE session is running (e.g. Konqueror preloading works only
+ # with full KDE running). The KDE_FULL_SESSION property can be detected by
+ # any X client connected to the same X session, even if not launched
+@@ -254,44 +260,65 @@ export XDG_DATA_DIRS
+ #
+ KDE_FULL_SESSION=true
+ export KDE_FULL_SESSION
+-xprop -root -f KDE_FULL_SESSION 8t -set KDE_FULL_SESSION true
++@NIXPKGS_XPROP@ -root -f KDE_FULL_SESSION 8t -set KDE_FULL_SESSION true
+ 
+ KDE_SESSION_VERSION=5
+ export KDE_SESSION_VERSION
+-xprop -root -f KDE_SESSION_VERSION 32c -set KDE_SESSION_VERSION 5
++@NIXPKGS_XPROP@ -root -f KDE_SESSION_VERSION 32c -set KDE_SESSION_VERSION 5
+ 
+-KDE_SESSION_UID=`id -ru`
++KDE_SESSION_UID=$(@NIXPKGS_ID@ -ru)
+ export KDE_SESSION_UID
+ 
+ XDG_CURRENT_DESKTOP=KDE
+ export XDG_CURRENT_DESKTOP
+ 
++# Enforce xcb QPA. Helps switching between Wayland and X sessions.
++export QT_QPA_PLATFORM=xcb
++
++# Source scripts found in <config locations>/plasma-workspace/env/*.sh
++# (where <config locations> correspond to the system and user's configuration
++# directories, as identified by Qt's qtpaths,  e.g.  $HOME/.config
++# and /etc/xdg/ on Linux)
++#
++# This is where you can define environment variables that will be available to
++# all KDE programs, so this is where you can run agents using e.g. eval `ssh-agent`
++# or eval `gpg-agent --daemon`.
++# Note: if you do that, you should also put "ssh-agent -k" as a shutdown script
++#
++# (see end of this file).
++# For anything else (that doesn't set env vars, or that needs a window manager),
++# better use the Autostart folder.
++
++IFS=":" read -r -a scriptpath <<< $(@NIXPKGS_QTPATHS@ --paths GenericConfigLocation)
++# Add /env/ to the directory to locate the scripts to be sourced
++for prefix in "${scriptpath[@]}"; do
++    for file in "$prefix"/plasma-workspace/env/*.sh; do
++        if [ -r "$file" ]; then
++            . "$file"
++        fi
++    done
++done
++
+ # At this point all environment variables are set, let's send it to the DBus session server to update the activation environment
+-if which dbus-update-activation-environment >/dev/null 2>/dev/null ; then
+-    dbus-update-activation-environment --systemd --all
+-else
+-    @CMAKE_INSTALL_FULL_LIBEXECDIR@/ksyncdbusenv
+-fi
+-if test $? -ne 0; then
++
++if ! @NIXPKGS_DBUS_UPDATE_ACTIVATION_ENVIRONMENT@ --systemd --all; then
+   # Startup error
+   echo 'startkde: Could not sync environment to dbus.'  1>&2
+   test -n "$ksplash_pid" && kill "$ksplash_pid" 2>/dev/null
+-  xmessage -geometry 500x100 "Could not sync environment to dbus."
+   exit 1
+ fi
+ 
+ # We set LD_BIND_NOW to increase the efficiency of kdeinit.
+ # kdeinit unsets this variable before loading applications.
+-LD_BIND_NOW=true @CMAKE_INSTALL_FULL_LIBEXECDIR_KF5@/start_kdeinit_wrapper --kded +kcminit_startup
++LD_BIND_NOW=true @NIXPKGS_START_KDEINIT_WRAPPER@ --kded +kcminit_startup
+ if test $? -ne 0; then
+   # Startup error
+   echo 'startkde: Could not start kdeinit5. Check your installation.'  1>&2
+   test -n "$ksplash_pid" && kill "$ksplash_pid" 2>/dev/null
+-  xmessage -geometry 500x100 "Could not start kdeinit5. Check your installation."
+   exit 1
+ fi
+ 
+-qdbus org.kde.KSplash /KSplash org.kde.KSplash.setStage kinit &
++@NIXPKGS_QDBUS@ org.kde.KSplash /KSplash org.kde.KSplash.setStage kinit &
+ 
+ # finally, give the session control to the session manager
+ # see kdebase/ksmserver for the description of the rest of the startup sequence
+@@ -303,34 +330,37 @@ qdbus org.kde.KSplash /KSplash org.kde.KSplash.setStage kinit &
+ # We only check for 255 which means that the ksmserver process could not be
+ # started, any problems thereafter, e.g. ksmserver failing to initialize,
+ # will remain undetected.
+-test -n "$KDEWM" && KDEWM="--windowmanager $KDEWM"
++if [ -n "$KDEWM" ]; then
++    KDEWM="--windowmanager $KDEWM"
++fi
+ # If the session should be locked from the start (locked autologin),
+ # lock now and do the rest of the KDE startup underneath the locker.
+ KSMSERVEROPTIONS=""
+-test -n "$dl" && KSMSERVEROPTIONS=" --lockscreen"
+-kwrapper5 @CMAKE_INSTALL_FULL_BINDIR@/ksmserver $KDEWM $KSMSERVEROPTIONS
++if [ -n "$dl" ]; then
++    KSMSERVEROPTIONS=" --lockscreen"
++fi
++@NIXPKGS_KWRAPPER5@ @CMAKE_INSTALL_FULL_BINDIR@/ksmserver $KDEWM $KSMSERVEROPTIONS
+ if test $? -eq 255; then
+   # Startup error
+   echo 'startkde: Could not start ksmserver. Check your installation.'  1>&2
+   test -n "$ksplash_pid" && kill "$ksplash_pid" 2>/dev/null
+-  xmessage -geometry 500x100 "Could not start ksmserver. Check your installation."
+ fi
+ 
+ #Anything after here is logout/shutdown
+ 
+-wait_drkonqi=`kreadconfig5 --file startkderc --group WaitForDrKonqi --key Enabled --default true`
++wait_drkonqi=$(@NIXPKGS_KREADCONFIG5@ --file startkderc --group WaitForDrKonqi --key Enabled --default true)
+ 
+-if test x"$wait_drkonqi"x = x"true"x ; then
++if [ x"$wait_drkonqi"x = x"true"x ]; then
+     # wait for remaining drkonqi instances with timeout (in seconds)
+-    wait_drkonqi_timeout=`kreadconfig5 --file startkderc --group WaitForDrKonqi --key Timeout --default 900`
++    wait_drkonqi_timeout=$(@NIXPKGS_KREADCONFIG5@ --file startkderc --group WaitForDrKonqi --key Timeout --default 900)
+     wait_drkonqi_counter=0
+-    while qdbus | grep "^[^w]*org.kde.drkonqi" > /dev/null ; do
++    while @NIXPKGS_QDBUS@ | @NIXPKGS_GREP@ -q "^[^w]*org.kde.drkonqi" ; do
+         sleep 5
+         wait_drkonqi_counter=$((wait_drkonqi_counter+5))
+-        if test "$wait_drkonqi_counter" -ge "$wait_drkonqi_timeout" ; then
++        if [ "$wait_drkonqi_counter" -ge "$wait_drkonqi_timeout" ]; then
+             # ask remaining drkonqis to die in a graceful way
+-            qdbus | grep 'org.kde.drkonqi-' | while read address ; do
+-                qdbus "$address" "/MainApplication" "quit"
++            @NIXPKGS_QDBUS@ | @NIXPKGS_GREP@ 'org.kde.drkonqi-' | while read address ; do
++                @NIXPKGS_QDBUS@ "$address" "/MainApplication" "quit"
+             done
+             break
+         fi
+@@ -339,15 +369,17 @@ fi
+ 
+ echo 'startkde: Shutting down...'  1>&2
+ # just in case
+-test -n "$ksplash_pid" && kill "$ksplash_pid" 2>/dev/null
++if [ -n "$ksplash_pid" ]; then
++    kill "$ksplash_pid" 2>/dev/null
++fi
+ 
+ # Clean up
+-kdeinit5_shutdown
++@NIXPKGS_KDEINIT5_SHUTDOWN@
+ 
+ unset KDE_FULL_SESSION
+-xprop -root -remove KDE_FULL_SESSION
++@NIXPKGS_XPROP@ -root -remove KDE_FULL_SESSION
+ unset KDE_SESSION_VERSION
+-xprop -root -remove KDE_SESSION_VERSION
++@NIXPKGS_XPROP@ -root -remove KDE_SESSION_VERSION
+ unset KDE_SESSION_UID
+ 
+ echo 'startkde: Done.'  1>&2
+diff --git a/startkde/startplasma.cmake b/startkde/startplasma.cmake
+index fd232bdf..e1c8fff6 100644
+--- a/startkde/startplasma.cmake
++++ b/startkde/startplasma.cmake
+@@ -1,6 +1,6 @@
+ #!/bin/sh
+ #
+-#  DEFAULT Plasma STARTUP SCRIPT ( @PROJECT_VERSION@ )
++#  NIXPKGS Plasma STARTUP SCRIPT ( @PROJECT_VERSION@ )
+ #
+ 
+ # Boot sequence:
+@@ -17,17 +17,13 @@
+ #
+ # * Then ksmserver is started which takes control of the rest of the startup sequence
+ 
+-# We need to create config folder so we can write startupconfigkeys
+-if [  ${XDG_CONFIG_HOME} ]; then
+-  configDir=$XDG_CONFIG_HOME;
+-else
+-  configDir=${HOME}/.config; #this is the default, http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
++export XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"
++if [ -r "$XDG_CONFIG_HOME/startupconfig" ]; then
++    . "$XDG_CONFIG_HOME/startupconfig"
+ fi
+ 
+-[ -r $configDir/startupconfig ] && . $configDir/startupconfig
+-
+-if test "$kcmfonts_general_forcefontdpi" -ne 0; then
+-    xrdb -quiet -merge -nocpp <<EOF
++if [ "$kcmfonts_general_forcefontdpi" -ne 0 ]; then
++    @NIXPKGS_XRDB@ -quiet -merge -nocpp <<EOF
+ Xft.dpi: $kcmfonts_general_forcefontdpi
+ EOF
+ fi
+@@ -36,11 +32,11 @@ dl=$DESKTOP_LOCKED
+ unset DESKTOP_LOCKED # Don't want it in the environment
+ 
+ ksplash_pid=
+-if test -z "$dl"; then
++if [ -z "$dl" ]; then
+   # the splashscreen and progress indicator
+   case "$ksplashrc_ksplash_engine" in
+     KSplashQML)
+-      ksplash_pid=`ksplashqml "${ksplashrc_ksplash_theme}" --pid`
++      ksplash_pid=$(@CMAKE_INSTALL_FULL_BINDIR@/ksplashqml "${ksplashrc_ksplash_theme}" --pid)
+       ;;
+     None)
+       ;;
+@@ -52,48 +48,6 @@ fi
+ #In wayland we want Plasma to use Qt's scaling
+ export PLASMA_USE_QT_SCALING=1
+ 
+-# Activate the kde font directories.
+-#
+-# There are 4 directories that may be used for supplying fonts for KDE.
+-#
+-# There are two system directories. These belong to the administrator.
+-# There are two user directories, where the user may add her own fonts.
+-#
+-# The 'override' versions are for fonts that should come first in the list,
+-# i.e. if you have a font in your 'override' directory, it will be used in
+-# preference to any other.
+-#
+-# The preference order looks like this:
+-# user override, system override, X, user, system
+-#
+-# Where X is the original font database that was set up before this script
+-# runs.
+-
+-usr_odir=$HOME/.fonts/kde-override
+-usr_fdir=$HOME/.fonts
+-
+-if test -n "$KDEDIRS"; then
+-  kdedirs_first=`echo "$KDEDIRS"|sed -e 's/:.*//'`
+-  sys_odir=$kdedirs_first/share/fonts/override
+-  sys_fdir=$kdedirs_first/share/fonts
+-else
+-  sys_odir=$KDEDIR/share/fonts/override
+-  sys_fdir=$KDEDIR/share/fonts
+-fi
+-
+-# We run mkfontdir on the user's font dirs (if we have permission) to pick
+-# up any new fonts they may have installed. If mkfontdir fails, we still
+-# add the user's dirs to the font path, as they might simply have been made
+-# read-only by the administrator, for whatever reason.
+-
+-test -d "$sys_odir" && xset +fp "$sys_odir"
+-test -d "$usr_odir" && (mkfontdir "$usr_odir" ; xset +fp "$usr_odir")
+-test -d "$usr_fdir" && (mkfontdir "$usr_fdir" ; xset fp+ "$usr_fdir")
+-test -d "$sys_fdir" && xset fp+ "$sys_fdir"
+-
+-# Ask X11 to rebuild its font list.
+-xset fp rehash
+-
+ # Set a left cursor instead of the standard X11 "X" cursor, since I've heard
+ # from some users that they're confused and don't know what to do. This is
+ # especially necessary on slow machines, where starting KDE takes one or two
+@@ -102,35 +56,25 @@ xset fp rehash
+ # If the user has overwritten fonts, the cursor font may be different now
+ # so don't move this up.
+ #
+-xsetroot -cursor_name left_ptr
+-
+-# Get Ghostscript to look into user's KDE fonts dir for additional Fontmap
+-if test -n "$GS_LIB" ; then
+-    GS_LIB=$usr_fdir:$GS_LIB
+-    export GS_LIB
+-else
+-    GS_LIB=$usr_fdir
+-    export GS_LIB
+-fi
++@NIXPKGS_XSETROOT@ -cursor_name left_ptr
+ 
+ echo 'startplasma: Starting up...'  1>&2
+ 
+ # export our session variables to the Xwayland server
+-xprop -root -f KDE_FULL_SESSION 8t -set KDE_FULL_SESSION true
+-xprop -root -f KDE_SESSION_VERSION 32c -set KDE_SESSION_VERSION 5
++@NIXPKGS_XPROP@ -root -f KDE_FULL_SESSION 8t -set KDE_FULL_SESSION true
++@NIXPKGS_XPROP@ -root -f KDE_SESSION_VERSION 32c -set KDE_SESSION_VERSION 5
+ 
+ # We set LD_BIND_NOW to increase the efficiency of kdeinit.
+ # kdeinit unsets this variable before loading applications.
+-LD_BIND_NOW=true @CMAKE_INSTALL_FULL_LIBEXECDIR_KF5@/start_kdeinit_wrapper --kded +kcminit_startup
++LD_BIND_NOW=true @NIXPKGS_START_KDEINIT_WRAPPER@ --kded +kcminit_startup
+ if test $? -ne 0; then
+   # Startup error
+   echo 'startplasma: Could not start kdeinit5. Check your installation.'  1>&2
+   test -n "$ksplash_pid" && kill "$ksplash_pid" 2>/dev/null
+-  xmessage -geometry 500x100 "Could not start kdeinit5. Check your installation."
+   exit 1
+ fi
+ 
+-qdbus org.kde.KSplash /KSplash org.kde.KSplash.setStage kinit
++@NIXPKGS_QDBUS@ org.kde.KSplash /KSplash org.kde.KSplash.setStage kinit
+ 
+ # finally, give the session control to the session manager
+ # see kdebase/ksmserver for the description of the rest of the startup sequence
+@@ -145,27 +89,26 @@ qdbus org.kde.KSplash /KSplash org.kde.KSplash.setStage kinit
+ # If the session should be locked from the start (locked autologin),
+ # lock now and do the rest of the KDE startup underneath the locker.
+ KSMSERVEROPTIONS=" --no-lockscreen"
+-kwrapper5 @CMAKE_INSTALL_FULL_BINDIR@/ksmserver $KDEWM $KSMSERVEROPTIONS
++@NIXPKGS_KWRAPPER5@ @CMAKE_INSTALL_FULL_BINDIR@/ksmserver $KDEWM $KSMSERVEROPTIONS
+ if test $? -eq 255; then
+   # Startup error
+   echo 'startplasma: Could not start ksmserver. Check your installation.'  1>&2
+   test -n "$ksplash_pid" && kill "$ksplash_pid" 2>/dev/null
+-  xmessage -geometry 500x100 "Could not start ksmserver. Check your installation."
+ fi
+ 
+-wait_drkonqi=`kreadconfig5 --file startkderc --group WaitForDrKonqi --key Enabled --default true`
++wait_drkonqi=$(@NIXPKGS_KREADCONFIG5@ --file startkderc --group WaitForDrKonqi --key Enabled --default true)
+ 
+-if test x"$wait_drkonqi"x = x"true"x ; then
++if [ x"$wait_drkonqi"x = x"true"x ]; then
+     # wait for remaining drkonqi instances with timeout (in seconds)
+-    wait_drkonqi_timeout=`kreadconfig5 --file startkderc --group WaitForDrKonqi --key Timeout --default 900`
++    wait_drkonqi_timeout=$(@NIXPKGS_KREADCONFIG5@ --file startkderc --group WaitForDrKonqi --key Timeout --default 900)
+     wait_drkonqi_counter=0
+-    while qdbus | grep "^[^w]*org.kde.drkonqi" > /dev/null ; do
++    while @NIXPKGS_QDBUS@ | @NIXPKGS_GREP@ -q "^[^w]*org.kde.drkonqi" ; do
+         sleep 5
+         wait_drkonqi_counter=$((wait_drkonqi_counter+5))
+-        if test "$wait_drkonqi_counter" -ge "$wait_drkonqi_timeout" ; then
++        if [ "$wait_drkonqi_counter" -ge "$wait_drkonqi_timeout" ]; then
+             # ask remaining drkonqis to die in a graceful way
+-            qdbus | grep 'org.kde.drkonqi-' | while read address ; do
+-                qdbus "$address" "/MainApplication" "quit"
++            @NIXPKGS_QDBUS@ | @NIXPKGS_GREP@ 'org.kde.drkonqi-' | while read address ; do
++                @NIXPKGS_QDBUS@ "$address" "/MainApplication" "quit"
+             done
+             break
+         fi
+@@ -174,15 +117,17 @@ fi
+ 
+ echo 'startplasma: Shutting down...'  1>&2
+ # just in case
+-test -n "$ksplash_pid" && kill "$ksplash_pid" 2>/dev/null
++if [ -n "$ksplash_pid" ]; then
++    kill "$ksplash_pid" 2>/dev/null
++fi
+ 
+ # Clean up
+-kdeinit5_shutdown
++@NIXPKGS_KDEINIT5_SHUTDOWN@
+ 
+ unset KDE_FULL_SESSION
+-xprop -root -remove KDE_FULL_SESSION
++@NIXPKGS_XPROP@ -root -remove KDE_FULL_SESSION
+ unset KDE_SESSION_VERSION
+-xprop -root -remove KDE_SESSION_VERSION
++@NIXPKGS_XPROP@ -root -remove KDE_SESSION_VERSION
+ unset KDE_SESSION_UID
+ 
+ echo 'startplasma: Done.'  1>&2
+diff --git a/startkde/startplasmacompositor.cmake b/startkde/startplasmacompositor.cmake
+index 417a87d4..3f62745a 100644
+--- a/startkde/startplasmacompositor.cmake
++++ b/startkde/startplasmacompositor.cmake
+@@ -1,173 +1,171 @@
+ #!/bin/sh
+ #
+-#  DEFAULT Plasma STARTUP SCRIPT ( @PROJECT_VERSION@ )
++#  NIXPKGS Plasma STARTUP SCRIPT ( @PROJECT_VERSION@ )
+ #
+ 
+-# in case we have been started with full pathname spec without being in PATH
+-bindir=`echo "$0" | sed -n 's,^\(/.*\)/[^/][^/]*$,\1,p'`
+-if [ -n "$bindir" ]; then
+-  qbindir=`qtpaths --binaries-dir`
+-  qdbus=$qbindir/qdbus
+-  case $PATH in
+-    $bindir|$bindir:*|*:$bindir|*:$bindir:*) ;;
+-    *) PATH=$bindir:$PATH; export PATH;;
+-  esac
+-else
+-  qdbus=qdbus
++# we have to unset this for Darwin since it will screw up KDE's dynamic-loading
++unset DYLD_FORCE_FLAT_NAMESPACE
++
++export XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"
++@NIXPKGS_MKDIR@ -p "$XDG_CONFIG_HOME"
++
++# 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/.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 $XDG_CONFIG_HOME/Trolltech.conf ]; then
++    @NIXPKGS_SED@ -e '/nix\\store\|nix\/store/ d' -i $XDG_CONFIG_HOME/Trolltech.conf
+ fi
+ 
+-# We need to create config folder so we can write startupconfigkeys
+-if [  ${XDG_CONFIG_HOME} ]; then
+-  configDir=$XDG_CONFIG_HOME;
+-else
+-  configDir=${HOME}/.config; #this is the default, http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
++@NIXPKGS_KBUILDSYCOCA5@
++
++# Set the default GTK 2 theme
++gtkrc2="$HOME/.gtkrc-2.0"
++breeze_gtkrc2="/run/current-system/sw/share/themes/Breeze/gtk-2.0/gtkrc"
++if ! [ -e "$gtkrc2" ] && [ -e "$breeze_gtkrc2" ]; then
++    cat >"$gtkrc2" <<EOF
++# Default GTK+ 2 config for NixOS KDE 5
++include "$breeze_gtkrc2"
++style "user-font"
++{
++  font_name="Sans Serif Regular"
++}
++widget_class "*" style "user-font"
++gtk-font-name="Sans Serif Regular 10"
++gtk-theme-name="Breeze"
++gtk-icon-theme-name="breeze"
++gtk-fallback-icon-theme="hicolor"
++gtk-cursor-theme-name="breeze_cursors"
++gtk-toolbar-style=GTK_TOOLBAR_ICONS
++gtk-menu-images=1
++gtk-button-images=1
++EOF
+ fi
+ 
+-mkdir -p $configDir
++# Set the default GTK 3 theme
++gtk3_settings="$XDG_CONFIG_HOME/gtk-3.0/settings.ini"
++breeze_gtk3="/run/current-system/sw/share/themes/Breeze/gtk-3.0"
++if ! [ -e "$gtk3_settings" ] && [ -e "$breeze_gtk" ]; then
++    mkdir -p $(dirname "$gtk3_settings")
++    cat >"$gtk3_settings" <<EOF
++[Settings]
++gtk-font-name=Sans Serif Regular 10
++gtk-theme-name=Breeze
++gtk-icon-theme-name=breeze
++gtk-fallback-icon-theme=hicolor
++gtk-cursor-theme-name=breeze_cursors
++gtk-toolbar-style=GTK_TOOLBAR_ICONS
++gtk-menu-images=1
++gtk-button-images=1
++EOF
++fi
++
++kcminputrc="$XDG_CONFIG_HOME/kcminputrc"
++if ! [ -e "$kcminputrc" ]; then
++    cat >"$kcminputrc" <<EOF
++[Mouse]
++cursorTheme=breeze_cursors
++cursorSize=0
++EOF
++fi
+ 
+ #This is basically setting defaults so we can use them with kstartupconfig5
+-cat >$configDir/startupconfigkeys <<EOF
++cat >"$XDG_CONFIG_HOME/startupconfigkeys" <<EOF
+ kcminputrc Mouse cursorTheme 'breeze_cursors'
+ kcminputrc Mouse cursorSize ''
+-ksplashrc KSplash Theme Breeze
++ksplashrc KSplash Theme org.kde.breeze.desktop
+ ksplashrc KSplash Engine KSplashQML
+-kcmfonts General forceFontDPIWayland 0
++kdeglobals KScreen ScreenScaleFactors ''
++kcmfonts General forceFontDPI 0
++kcmfonts General dontChangeAASettings true
+ EOF
+ 
+ # preload the user's locale on first start
+-plasmalocalerc=$configDir/plasma-localerc
+-test -f $plasmalocalerc || {
+-cat >$plasmalocalerc <<EOF
++plasmalocalerc="$XDG_CONFIG_HOME/plasma-localerc"
++if ! [ -f "$plasmalocalerc" ]; then
++    cat >"$plasmalocalerc" <<EOF
+ [Formats]
+ LANG=$LANG
+ EOF
+-}
++fi
+ 
+ # export LC_* variables set by kcmshell5 formats into environment
+ # so it can be picked up by QLocale and friends.
+-exportformatssettings=$configDir/plasma-locale-settings.sh
+-test -f $exportformatssettings && {
+-    . $exportformatssettings
+-}
++exportformatssettings="$XDG_CONFIG_HOME/plasma-locale-settings.sh"
++if [ -r "$exportformatssettings" ]; then
++    . "$exportformatssettings"
++fi
+ 
+ # Write a default kdeglobals file to set up the font
+-kdeglobalsfile=$configDir/kdeglobals
+-test -f $kdeglobalsfile || {
+-cat >$kdeglobalsfile <<EOF
++kdeglobalsfile="$XDG_CONFIG_HOME/kdeglobals"
++if ! [ -f "$kdeglobalsfile" ]; then
++    cat >"$kdeglobalsfile" <<EOF
+ [General]
+-XftAntialias=true
+-XftHintStyle=hintmedium
+-XftSubPixel=none
++fixed=Monospace,10,-1,5,50,0,0,0,0,0,Regular
++font=Sans Serif,10,-1,5,50,0,0,0,0,0,Regular
++menuFont=Sans Serif,10,-1,5,50,0,0,0,0,0,Regular
++smallestReadableFont=Sans Serif,8,-1,5,50,0,0,0,0,0,Regular
++toolBarFont=Sans Serif,8,-1,5,50,0,0,0,0,0,Regular
++
++[WM]
++activeFont=Noto Sans,12,-1,5,50,0,0,0,0,0,Bold
+ EOF
+-}
+-
+-# Make sure the Oxygen font is installed
+-# This is necessary for setups where CMAKE_INSTALL_PREFIX
+-# is not in /usr. fontconfig looks in /usr, ~/.fonts and
+-# $XDG_DATA_HOME for fonts. In this case, we symlink the
+-# Oxygen font under ${XDG_DATA_HOME} and make it known to
+-# fontconfig
+-
+-usr_share="/usr/share"
+-install_share="@KDE_INSTALL_FULL_DATADIR@"
+-
+-if [ ! $install_share = $usr_share ]; then
+-
+-    if [ ${XDG_DATA_HOME} ]; then
+-        fontsDir="${XDG_DATA_HOME}/fonts"
+-    else
+-        fontsDir="${HOME}/.fonts"
+-    fi
+-
+-    test -d $fontsDir || {
+-        mkdir -p $fontsDir
+-    }
+-
+-    oxygenDir=$fontsDir/truetype/oxygen
+-    prefixDir="@KDE_INSTALL_FULL_DATADIR@/fonts/truetype/oxygen"
+-
+-    # if the oxygen dir doesn't exist, create a symlink to be sure that the
+-    # Oxygen font is available to the user
+-    test -d $oxygenDir || test -d $prefixDir && {
+-        test -h $oxygenDir || ln -s $prefixDir $oxygenDir && fc-cache $oxygenDir
+-    }
+ fi
+ 
+-kstartupconfig5
+-returncode=$?
+-if test $returncode -ne 0; then
++if ! @CMAKE_INSTALL_FULL_BINDIR@/kstartupconfig5; then
+     exit 1
+ fi
+-[ -r $configDir/startupconfig ] && . $configDir/startupconfig
++if [ -r "$XDG_CONFIG_HOME/startupconfig" ]; then
++    . "$XDG_CONFIG_HOME/startupconfig"
++fi
+ 
+ #Manually disable auto scaling because we are scaling above
+ #otherwise apps that manually opt in for high DPI get auto scaled by the developer AND scaled by the wl_output
+ export QT_AUTO_SCREEN_SCALE_FACTOR=0
+ 
++XCURSOR_PATH=~/.icons
++IFS=":" read -r -a xdgDirs <<< "$XDG_DATA_DIRS"
++for xdgDir in "${xdgDirs[@]}"; do
++    XCURSOR_PATH="$XCURSOR_PATH:$xdgDir/icons"
++done
++export XCURSOR_PATH
++
+ # XCursor mouse theme needs to be applied here to work even for kded or ksmserver
+-if test -n "$kcminputrc_mouse_cursortheme" -o -n "$kcminputrc_mouse_cursorsize" ; then
+-    @EXPORT_XCURSOR_PATH@
+-
+-    # TODO: is kapplymousetheme a core app?
+-    #kapplymousetheme "$kcminputrc_mouse_cursortheme" "$kcminputrc_mouse_cursorsize"
+-    if test $? -eq 10; then
+-        XCURSOR_THEME=breeze_cursors
+-        export XCURSOR_THEME
+-    elif test -n "$kcminputrc_mouse_cursortheme"; then
+-        XCURSOR_THEME="$kcminputrc_mouse_cursortheme"
+-        export XCURSOR_THEME
++if [ -n "$kcminputrc_mouse_cursortheme" -o -n "$kcminputrc_mouse_cursorsize" ]; then
++    kapplymousetheme "$kcminputrc_mouse_cursortheme" "$kcminputrc_mouse_cursorsize"
++    if [ $? -eq 10 ]; then
++        export XCURSOR_THEME=breeze_cursors
++    elif [ -n "$kcminputrc_mouse_cursortheme" ]; then
++        export XCURSOR_THEME="$kcminputrc_mouse_cursortheme"
+     fi
+-    if test -n "$kcminputrc_mouse_cursorsize"; then
+-        XCURSOR_SIZE="$kcminputrc_mouse_cursorsize"
+-        export XCURSOR_SIZE
++    if [ -n "$kcminputrc_mouse_cursorsize" ]; then
++        export XCURSOR_SIZE="$kcminputrc_mouse_cursorsize"
+     fi
+ fi
+ 
+-if test "$kcmfonts_general_forcefontdpiwayland" -ne 0; then
++if [ "${kcmfonts_general_forcefontdpiwayland:-0}" -ne 0 ]; then
+     export QT_WAYLAND_FORCE_DPI=$kcmfonts_general_forcefontdpiwayland
+ else
+     export QT_WAYLAND_FORCE_DPI=96
+ fi
+ 
+-# Source scripts found in <config locations>/plasma-workspace/env/*.sh
+-# (where <config locations> correspond to the system and user's configuration
+-# directories, as identified by Qt's qtpaths,  e.g.  $HOME/.config
+-# and /etc/xdg/ on Linux)
+-#
+-# This is where you can define environment variables that will be available to
+-# all KDE programs, so this is where you can run agents using e.g. eval `ssh-agent`
+-# or eval `gpg-agent --daemon`.
+-# Note: if you do that, you should also put "ssh-agent -k" as a shutdown script
+-#
+-# (see end of this file).
+-# For anything else (that doesn't set env vars, or that needs a window manager),
+-# better use the Autostart folder.
+-
+-# TODO: Use GenericConfigLocation once we depend on Qt 5.4
+-scriptpath=`qtpaths --paths ConfigLocation | tr ':' '\n' | sed 's,$,/plasma-workspace,g'`
+-
+-# Add /env/ to the directory to locate the scripts to be sourced
+-for prefix in `echo $scriptpath`; do
+-  for file in "$prefix"/env/*.sh; do
+-    test -r "$file" && . "$file"
+-  done
+-done
+-
+ echo 'startplasmacompositor: Starting up...'  1>&2
+ 
+-# Make sure that the KDE prefix is first in XDG_DATA_DIRS and that it's set at all.
+-# The spec allows XDG_DATA_DIRS to be not set, but X session startup scripts tend
+-# to set it to a list of paths *not* including the KDE prefix if it's not /usr or
+-# /usr/local.
+-if test -z "$XDG_DATA_DIRS"; then
+-XDG_DATA_DIRS="@KDE_INSTALL_FULL_DATADIR@:/usr/share:/usr/local/share"
+-fi
+-export XDG_DATA_DIRS
+-
+ # Make sure that D-Bus is running
+-if $qdbus >/dev/null 2>/dev/null; then
+-    : # ok
+-else
++if ! @NIXPKGS_QDBUS@ >/dev/null 2>/dev/null; then
+     echo 'startplasmacompositor: Could not start D-Bus. Can you call qdbus?'  1>&2
+     test -n "$ksplash_pid" && kill "$ksplash_pid" 2>/dev/null
+     exit 1
+@@ -202,7 +200,7 @@ export KDE_FULL_SESSION
+ KDE_SESSION_VERSION=5
+ export KDE_SESSION_VERSION
+ 
+-KDE_SESSION_UID=`id -ru`
++KDE_SESSION_UID=$(@NIXPKGS_ID@ -ru)
+ export KDE_SESSION_UID
+ 
+ XDG_CURRENT_DESKTOP=KDE
+@@ -212,26 +210,47 @@ export XDG_CURRENT_DESKTOP
+ QT_QPA_PLATFORM=wayland
+ export QT_QPA_PLATFORM
+ 
++# Source scripts found in <config locations>/plasma-workspace/env/*.sh
++# (where <config locations> correspond to the system and user's configuration
++# directories, as identified by Qt's qtpaths,  e.g.  $HOME/.config
++# and /etc/xdg/ on Linux)
++#
++# This is where you can define environment variables that will be available to
++# all KDE programs, so this is where you can run agents using e.g. eval `ssh-agent`
++# or eval `gpg-agent --daemon`.
++# Note: if you do that, you should also put "ssh-agent -k" as a shutdown script
++#
++# (see end of this file).
++# For anything else (that doesn't set env vars, or that needs a window manager),
++# better use the Autostart folder.
++
++IFS=":" read -r -a scriptpath <<< $(@NIXPKGS_QTPATHS@ --paths GenericConfigLocation)
++# Add /env/ to the directory to locate the scripts to be sourced
++for prefix in "${scriptpath[@]}"; do
++    for file in "$prefix"/plasma-workspace/env/*.sh; do
++        if [ -r "$file" ]; then
++            . "$file"
++        fi
++    done
++done
++
+ # At this point all environment variables are set, let's send it to the DBus session server to update the activation environment
+-if which dbus-update-activation-environment >/dev/null 2>/dev/null ; then
+-    dbus-update-activation-environment --systemd --all
+-else
+-    @CMAKE_INSTALL_FULL_LIBEXECDIR@/ksyncdbusenv
+-fi
+-if test $? -ne 0; then
+-  # Startup error
+-  echo 'startplasmacompositor: Could not sync environment to dbus.'  1>&2
+-  exit 1
++if ! @NIXPKGS_DBUS_UPDATE_ACTIVATION_ENVIRONMENT@ --systemd --all; then
++    # Startup error
++    echo 'startkde: Could not sync environment to dbus.'  1>&2
++    test -n "$ksplash_pid" && kill "$ksplash_pid" 2>/dev/null
++    echo 'startplasmacompositor: Could not sync environment to dbus.'  1>&2
++    exit 1
+ fi
+ 
+-@KWIN_WAYLAND_BIN_PATH@ --xwayland --libinput --exit-with-session=@CMAKE_INSTALL_FULL_LIBEXECDIR@/startplasma
++@KWIN_WAYLAND_BIN_PATH@ --xwayland --libinput --exit-with-session=@NIXPKGS_STARTPLASMA@
+ 
+ echo 'startplasmacompositor: Shutting down...'  1>&2
+ 
+ unset KDE_FULL_SESSION
+-xprop -root -remove KDE_FULL_SESSION
++@NIXPKGS_XPROP@ -root -remove KDE_FULL_SESSION
+ unset KDE_SESSION_VERSION
+-xprop -root -remove KDE_SESSION_VERSION
++@NIXPKGS_XPROP@ -root -remove KDE_SESSION_VERSION
+ unset KDE_SESSION_UID
+ 
+ echo 'startplasmacompositor: Done.'  1>&2
+diff --git a/startkde/waitforname/org.kde.plasma.Notifications.service.in b/startkde/waitforname/org.kde.plasma.Notifications.service.in
+index 0a51b84b..f48b5d8a 100644
+--- a/startkde/waitforname/org.kde.plasma.Notifications.service.in
++++ b/startkde/waitforname/org.kde.plasma.Notifications.service.in
+@@ -1,3 +1,3 @@
+ [D-BUS Service]
+ Name=org.freedesktop.Notifications
+-Exec=@CMAKE_INSTALL_PREFIX@/bin/plasma_waitforname org.freedesktop.Notifications
++Exec=@CMAKE_INSTALL_FULL_BINDIR@/plasma_waitforname org.freedesktop.Notifications
diff --git a/pkgs/desktops/plasma-5/plasma-workspace/qml-import-path.patch b/pkgs/desktops/plasma-5/plasma-workspace/qml-import-path.patch
deleted file mode 100644
index 3b3d318d3bb..00000000000
--- a/pkgs/desktops/plasma-5/plasma-workspace/qml-import-path.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-Index: plasma-workspace-5.6.3/applets/batterymonitor/package/contents/ui/BatteryItem.qml
-===================================================================
---- plasma-workspace-5.6.3.orig/applets/batterymonitor/package/contents/ui/BatteryItem.qml
-+++ plasma-workspace-5.6.3/applets/batterymonitor/package/contents/ui/BatteryItem.qml
-@@ -26,7 +26,7 @@ import org.kde.plasma.components 2.0 as
- import org.kde.plasma.extras 2.0 as PlasmaExtras
- import org.kde.plasma.workspace.components 2.0
- import org.kde.kcoreaddons 1.0 as KCoreAddons
--import "logic.js" as Logic
-+import "../code/logic.js" as Logic
-
- Item {
-     id: batteryItem
-Index: plasma-workspace-5.6.3/applets/batterymonitor/package/contents/ui/batterymonitor.qml
-===================================================================
---- plasma-workspace-5.6.3.orig/applets/batterymonitor/package/contents/ui/batterymonitor.qml
-+++ plasma-workspace-5.6.3/applets/batterymonitor/package/contents/ui/batterymonitor.qml
-@@ -25,7 +25,7 @@ import org.kde.plasma.plasmoid 2.0
- import org.kde.plasma.core 2.0 as PlasmaCore
- import org.kde.kcoreaddons 1.0 as KCoreAddons
- import org.kde.kquickcontrolsaddons 2.0
--import "logic.js" as Logic
-+import "../code/logic.js" as Logic
-
- Item {
-     id: batterymonitor
-Index: plasma-workspace-5.6.3/applets/lock_logout/contents/ui/lockout.qml
-===================================================================
---- plasma-workspace-5.6.3.orig/applets/lock_logout/contents/ui/lockout.qml
-+++ plasma-workspace-5.6.3/applets/lock_logout/contents/ui/lockout.qml
-@@ -23,7 +23,7 @@ import org.kde.plasma.plasmoid 2.0
- import org.kde.plasma.core 2.0 as PlasmaCore
- import org.kde.plasma.components 2.0
- import org.kde.kquickcontrolsaddons 2.0
--import "data.js" as Data
-+import "../code/data.js" as Data
-
- Flow {
-     id: lockout
-Index: plasma-workspace-5.6.3/applets/notifications/package/contents/ui/main.qml
-===================================================================
---- plasma-workspace-5.6.3.orig/applets/notifications/package/contents/ui/main.qml
-+++ plasma-workspace-5.6.3/applets/notifications/package/contents/ui/main.qml
-@@ -28,7 +28,7 @@ import org.kde.plasma.extras 2.0 as Plas
-
- import org.kde.plasma.private.notifications 1.0
-
--import "uiproperties.js" as UiProperties
-+import "../code/uiproperties.js" as UiProperties
-
- MouseEventListener {
-     id: notificationsApplet
diff --git a/pkgs/desktops/plasma-5/plasma-workspace/series b/pkgs/desktops/plasma-5/plasma-workspace/series
deleted file mode 100644
index b9081298bd6..00000000000
--- a/pkgs/desktops/plasma-5/plasma-workspace/series
+++ /dev/null
@@ -1 +0,0 @@
-qml-import-path.patch