summary refs log tree commit diff
path: root/pkgs/desktops/plasma-5/plasma-workspace/plasma-workspace.patch
blob: 5159328ed3fe517a1b06de2d6952b44db216d2cd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
diff --git a/sddm-theme/theme.conf.cmake b/sddm-theme/theme.conf.cmake
index ea9a943..f98ddd2 100644
--- a/sddm-theme/theme.conf.cmake
+++ b/sddm-theme/theme.conf.cmake
@@ -2,4 +2,4 @@
 type=image
 color=#1d99f3
 fontSize=10
-background=${CMAKE_INSTALL_PREFIX}/${WALLPAPER_INSTALL_DIR}/Next/contents/images/5120x2880.png
+background=${NIXPKGS_WALLPAPER_INSTALL_DIR}/Next/contents/images/5120x2880.png
diff --git a/startkde/CMakeLists.txt b/startkde/CMakeLists.txt
index 6a1a212..f03fd34 100644
--- a/startkde/CMakeLists.txt
+++ b/startkde/CMakeLists.txt
@@ -4,11 +4,6 @@ add_subdirectory(ksyncdbusenv)
 add_subdirectory(waitforname)
 add_subdirectory(kcheckrunning)

-#FIXME: reconsider, looks fishy
-if(NOT CMAKE_INSTALL_PREFIX STREQUAL "/usr")
-    set(EXPORT_XCURSOR_PATH "XCURSOR_PATH=${KDE_INSTALL_FULL_DATAROOTDIR}/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 493218e..d507aa5 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 b68f0c6..97a13a1 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,62 +42,143 @@ fi
 #
 # * Then ksmserver is started which takes control of the rest of the startup sequence

-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
+
+# xdg-desktop-settings generates this empty file but
+# it makes kbuildsyscoca5 fail silently. To fix this
+# remove that menu if it exists.
+rm -fv $HOME/.config/menus/applications-merged/xdg-desktop-menu-dummy.menu
+
+# Remove the kbuildsyscoca5 cache. It will be regenerated immediately after.
+# This is necessary for kbuildsyscoca5 to recognize that software that has been removed.
+rm -fv $HOME/.cache/ksycoca*
+
+# 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
 sysConfigDirs=${XDG_CONFIG_DIRS:-/etc/xdg}

-# We need to create config folder so we can write startupconfigkeys
-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 ScaleFactor ''
 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

 #Do not sync any of this section with the wayland versions as there scale factors are
 #sent properly over wl_output
@@ -104,26 +194,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
@@ -132,11 +229,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)
       ;;
@@ -145,27 +242,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
-# directory.
-#
-# 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=`echo "$configDir:$sysConfigDirs" | tr ':' '\n'`
-
-for prefix in `echo $scriptpath`; do
-  for file in "$prefix"/plasma-workspace/env/*.sh; do
-    test -r "$file" && . "$file" || true
-  done
-done
-
 # 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
@@ -221,44 +297,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
@@ -270,12 +367,16 @@ 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
@@ -286,19 +387,19 @@ fi
 #Anything after here is logout
 #It is not called after shutdown/restart

-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
@@ -307,15 +408,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 1fe41c5..11757df 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,28 +17,26 @@
 #
 # * 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
-
-xrdb -quiet -merge -nocpp <<EOF
+if [ "$kcmfonts_general_forcefontdpi" -ne 0 ]; then
+    @NIXPKGS_XRDB@ -quiet -merge -nocpp <<EOF
 Xft.dpi: $QT_WAYLAND_FORCE_DPI
 EOF
+fi

 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)
       ;;
@@ -58,23 +56,13 @@ export PLASMA_USE_QT_SCALING=1
 # 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
-usr_fdir=$HOME/.fonts
-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

 # 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
@@ -90,16 +78,15 @@ 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 '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
@@ -125,19 +112,19 @@ fi
 #Anything after here is logout
 #It is not called after shutdown/restart

-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
@@ -146,15 +133,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
+ "$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 dcb473a..0988740 100644
--- a/startkde/startplasmacompositor.cmake
+++ b/startkde/startplasmacompositor.cmake
@@ -1,118 +1,174 @@
 #!/bin/sh
 #
-#  DEFAULT Plasma STARTUP SCRIPT ( @PROJECT_VERSION@ )
+#  NIXPKGS Plasma STARTUP SCRIPT ( @PROJECT_VERSION@ )
 #

-# 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
+# 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
+
+# xdg-desktop-settings generates this empty file but
+# it makes kbuildsyscoca5 fail silently. To fix this
+# remove that menu if it exists.
+rm -fv $HOME/.config/menus/applications-merged/xdg-desktop-menu-dummy.menu
+
+# Remove the kbuildsyscoca5 cache. It will be regenerated immediately after.
+# This is necessary for kbuildsyscoca5 to recognize that software that has been removed.
+rm -fv $HOME/.cache/ksycoca*
+
+# 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
+
+@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
 sysConfigDirs=${XDG_CONFIG_DIRS:-/etc/xdg}

-# We need to create config folder so we can write startupconfigkeys
-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
+@CMAKE_INSTALL_FULL_BINDIR@/kstartupconfig5
 returncode=$?
 if test $returncode -ne 0; 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 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@
+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

-    # TODO: is kapplymousetheme a core app?
+# XCursor mouse theme needs to be applied here to work even for kded or ksmserver
+if [ -n "$kcminputrc_mouse_cursortheme" -o -n "$kcminputrc_mouse_cursorsize" ]; then
     #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_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
@@ -120,12 +176,12 @@ fi

 # Get a property value from org.freedesktop.locale1
 queryLocale1() {
-    qdbus --system org.freedesktop.locale1 /org/freedesktop/locale1 "$1"
+    @NIXPKGS_QDBUS@ --system org.freedesktop.locale1 /org/freedesktop/locale1 "$1"
 }

 # Query whether org.freedesktop.locale1 is available. If it is, try to
 # set XKB_DEFAULT_{MODEL,LAYOUT,VARIANT,OPTIONS} accordingly.
-if qdbus --system org.freedesktop.locale1 >/dev/null 2>/dev/null; then
+if @NIXPKGS_QDBUS@ --system org.freedesktop.locale1 >/dev/null 2>/dev/null; then
     # Do not overwrite existing values. There is no point in setting only some
     # of them as then they would not match anymore.
     if [ -z "${XKB_DEFAULT_MODEL}" -a -z "${XKB_DEFAULT_LAYOUT}" -a \
@@ -141,41 +197,10 @@ if qdbus --system org.freedesktop.locale1 >/dev/null 2>/dev/null; then
     fi
 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=`echo "$configDir:$sysConfigDirs" | tr ':' '\n'`
-
-for prefix in `echo $scriptpath`; do
-  for file in "$prefix"/plasma-workspace/env/*.sh; do
-    test -r "$file" && . "$file" || true
-  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
+if @NIXPKGS_QDBUS@ >/dev/null 2>/dev/null; then
     : # ok
 else
     echo 'startplasmacompositor: Could not start D-Bus. Can you call qdbus?'  1>&2
@@ -212,7 +237,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
@@ -221,20 +246,41 @@ export XDG_CURRENT_DESKTOP
 XDG_SESSION_TYPE=wayland
 export XDG_SESSION_TYPE

+# 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
+
 # kwin_wayland can possibly also start dbus-activated services which need env variables.
 # In that case, the update in startplasma might be too late.
-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