diff --git a/applets/batterymonitor/package/contents/ui/BatteryItem.qml b/applets/batterymonitor/package/contents/ui/BatteryItem.qml index 7e2d975..40a5797 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 50deee5..45b6b37 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 80e7e53..0083cf0 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 cb15cfa..a6976ba 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 8571521..294eab0 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 7a86d07..5b3030c 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 fe29f57..247db95 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 c992785..bd506ce 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 b3117b4..e70110e 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,61 +42,133 @@ 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 + +# 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" <"$gtk3_settings" <"$kcminputrc" <$configDir/startupconfigkeys <"$XDG_CONFIG_HOME/startupconfigkeys" <$plasmalocalerc <"$plasmalocalerc" <$kdeglobalsfile <"$kdeglobalsfile" <&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 @@ -99,26 +180,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 </plasma-workspace/env/*.sh -# (where 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 - -# 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 @@ -211,28 +236,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 @@ -257,44 +264,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 /plasma-workspace/env/*.sh +# (where 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 @@ -306,34 +334,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 @@ -342,15 +373,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 a5d09fa..d42c284 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 <&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 @@ -131,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 @@ -163,19 +109,19 @@ if test $? -eq 255; then 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 @@ -184,15 +130,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 8ac47aa..49970ef 100644 --- a/startkde/startplasmacompositor.cmake +++ b/startkde/startplasmacompositor.cmake @@ -1,118 +1,165 @@ #!/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 + +# 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" <"$gtk3_settings" <"$kcminputrc" <$configDir/startupconfigkeys <"$XDG_CONFIG_HOME/startupconfigkeys" <$plasmalocalerc <"$plasmalocalerc" <$kdeglobalsfile <"$kdeglobalsfile" </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 +188,10 @@ if qdbus --system org.freedesktop.locale1 >/dev/null 2>/dev/null; then fi fi -# Source scripts found in /plasma-workspace/env/*.sh -# (where 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 +228,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 @@ -222,20 +238,41 @@ export XDG_CURRENT_DESKTOP QT_QPA_PLATFORM=wayland export QT_QPA_PLATFORM +# Source scripts found in /plasma-workspace/env/*.sh +# (where 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 diff --git a/startkde/waitforname/org.kde.plasma.Notifications.service.in b/startkde/waitforname/org.kde.plasma.Notifications.service.in index 0a51b84..f48b5d8 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