From d34575dc1edb9fcc8e7608e82e63c6c9d20f37ea Mon Sep 17 00:00:00 2001 From: Thomas Tuegel Date: Thu, 27 Aug 2015 20:36:39 -0500 Subject: [PATCH] startkde NixOS patches --- startkde/startkde.cmake | 219 ++++++++++++++++++++---------------------------- 1 file changed, 89 insertions(+), 130 deletions(-) diff --git a/startkde/startkde.cmake b/startkde/startkde.cmake index cfbe227..999dd8f 100644 --- a/startkde/startkde.cmake +++ b/startkde/startkde.cmake @@ -1,8 +1,31 @@ -#!/bin/sh +#!@bash@/bin/bash # # DEFAULT KDE STARTUP SCRIPT ( @PROJECT_VERSION@ ) # +set -x + +# 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 $HOME/.config/Trolltech.conf ]; then + @gnused@/bin/sed -e '/nix\\store\|nix\/store/ d' -i $HOME/.config/Trolltech.conf +fi + if test "x$1" = x--failsafe; then KDE_FAILSAFE=1 # General failsafe flag KWIN_COMPOSE=N # Disable KWin's compositing @@ -16,29 +39,16 @@ trap 'echo GOT SIGHUP' HUP # we have to unset this for Darwin since it will screw up KDE's dynamic-loading unset DYLD_FORCE_FLAT_NAMESPACE -# 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 -fi - # Check if a KDE session already is running and whether it's possible to connect to X -kcheckrunning +@out@/bin/kcheckrunning kcheckrunning_result=$? if test $kcheckrunning_result -eq 0 ; then - echo "KDE seems to be already running on this display." - xmessage -geometry 500x100 "KDE seems to be already running on this display." > /dev/null 2>/dev/null + echo "KDE seems to be already running on this display." + @xmessage@/bin/xmessage -geometry 500x100 "KDE seems to be already running on this display." exit 1 elif test $kcheckrunning_result -eq 2 ; then echo "\$DISPLAY is not set or cannot connect to the X server." - exit 1 + exit 1 fi # Boot sequence: @@ -56,13 +66,8 @@ 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 -fi - -mkdir -p $configDir +configDir=$(@qttools@/bin/qtpaths --writable-path GenericConfigLocation) +mkdir -p "$configDir" #This is basically setting defaults so we can use them with kstartupconfig5 cat >$configDir/startupconfigkeys </dev/null 2>/dev/null; then + : # ok +else + echo 'startkde: Could not start D-Bus. Can you call qdbus?' 1>&2 + test -n "$ksplash_pid" && kill "$ksplash_pid" 2>/dev/null + @xmessage@/bin/xmessage -geometry 500x100 "Could not start D-Bus. Can you call qdbus?" + exit 1 +fi + ksplash_pid= if test -z "$dl"; then # the splashscreen and progress indicator case "$ksplashrc_ksplash_engine" in KSplashQML) - ksplash_pid=`ksplashqml "${ksplashrc_ksplash_theme}" --pid` + ksplash_pid=`@out@/bin/ksplashqml "${ksplashrc_ksplash_theme}" --pid` ;; None) ;; @@ -200,8 +189,7 @@ fi # 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'` +scriptpath=$(@qttools@/bin/qtpaths --paths GenericConfigLocation | tr ':' '\n' | @gnused@/bin/sed 's,$,/plasma-workspace,g') # Add /env/ to the directory to locate the scripts to be sourced for prefix in `echo $scriptpath`; do @@ -231,7 +219,7 @@ usr_odir=$HOME/.fonts/kde-override usr_fdir=$HOME/.fonts if test -n "$KDEDIRS"; then - kdedirs_first=`echo "$KDEDIRS"|sed -e 's/:.*//'` + kdedirs_first=`echo "$KDEDIRS" | @gnused@/bin/sed -e 's/:.*//'` sys_odir=$kdedirs_first/share/fonts/override sys_fdir=$kdedirs_first/share/fonts else @@ -244,23 +232,13 @@ fi # 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" +test -d "$sys_odir" && @xset@/bin/xset +fp "$sys_odir" +test -d "$usr_odir" && ( @mkfontdir@/bin/mkfontdir "$usr_odir" ; @xset@/bin/xset +fp "$usr_odir" ) +test -d "$usr_fdir" && ( @mkfontdir@/bin/mkfontdir "$usr_fdir" ; @xset@/bin/xset fp+ "$usr_fdir" ) +test -d "$sys_fdir" && @xset@/bin/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 -# minutes until anything appears on the screen. -# -# If the user has overwritten fonts, the cursor font may be different now -# so don't move this up. -# -xsetroot -cursor_name left_ptr +@xset@/bin/xset fp rehash # Get Ghostscript to look into user's KDE fonts dir for additional Fontmap if test -n "$GS_LIB" ; then @@ -273,30 +251,6 @@ fi 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 - -# Make sure that D-Bus is running -# D-Bus autolaunch is broken -if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then - eval `dbus-launch --sh-syntax --exit-with-session` -fi -if $qdbus >/dev/null 2>/dev/null; then - : # ok -else - echo 'startkde: Could not start D-Bus. Can you call qdbus?' 1>&2 - test -n "$ksplash_pid" && kill "$ksplash_pid" 2>/dev/null - xmessage -geometry 500x100 "Could not start D-Bus. Can you call qdbus?" - exit 1 -fi - - # 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 @@ -321,11 +275,11 @@ fi # KDE_FULL_SESSION=true export KDE_FULL_SESSION -xprop -root -f KDE_FULL_SESSION 8t -set KDE_FULL_SESSION true +@xprop@/bin/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 +@xprop@/bin/xprop -root -f KDE_SESSION_VERSION 32c -set KDE_SESSION_VERSION 5 KDE_SESSION_UID=`id -ru` export KDE_SESSION_UID @@ -335,11 +289,11 @@ export XDG_CURRENT_DESKTOP # At this point all the environment is ready, let's send it to kwalletd if running if test -n "$PAM_KWALLET_LOGIN" ; then - env | socat STDIN UNIX-CONNECT:$PAM_KWALLET_LOGIN + env | @socat@/bin/socat STDIN UNIX-CONNECT:$PAM_KWALLET_LOGIN fi # ...and also to kwalletd5 if test -n "$PAM_KWALLET5_LOGIN" ; then - env | socat STDIN UNIX-CONNECT:$PAM_KWALLET5_LOGIN + env | @socat@/bin/socat STDIN UNIX-CONNECT:$PAM_KWALLET5_LOGIN fi # At this point all environment variables are set, let's send it to the DBus session server to update the activation environment @@ -348,21 +302,26 @@ if test $? -ne 0; 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." + @xmessage@/bin/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 @kinit@/lib/libexec/kf5/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." + @xmessage@/bin/xmessage -geometry 500x100 "Could not start kdeinit5. Check your installation." exit 1 fi +# (NixOS) We run kbuildsycoca5 before starting the user session because things +# may be missing or moved if they have run nixos-rebuild and it may not be +# possible for them to start Konsole to run it manually! +@kservice@/bin/kbuildsycoca5 + # finally, give the session control to the session manager # see kdebase/ksmserver for the description of the rest of the startup sequence # if the KDEWM environment variable has been set, then it will be used as KDE's @@ -378,27 +337,27 @@ test -n "$KDEWM" && KDEWM="--windowmanager $KDEWM" # lock now and do the rest of the KDE startup underneath the locker. KSMSERVEROPTIONS="" test -n "$dl" && KSMSERVEROPTIONS=" --lockscreen" -kwrapper5 ksmserver $KDEWM $KSMSERVEROPTIONS +@kinit@/bin/kwrapper5 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." + @xmessage@/bin/xmessage -geometry 500x100 "Could not start ksmserver. Check your installation." fi -wait_drkonqi=`kreadconfig5 --file startkderc --group WaitForDrKonqi --key Enabled --default true` +wait_drkonqi=`@kconfig@/bin/kreadconfig5 --file startkderc --group WaitForDrKonqi --key Enabled --default true` if test 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=`@kconfig@/bin/kreadconfig5 --file startkderc --group WaitForDrKonqi --key Timeout --default 900` wait_drkonqi_counter=0 - while $qdbus | grep "^[^w]*org.kde.drkonqi" > /dev/null ; do + while @qttools@/bin/qdbus | @gnugrep@/bin/grep "^[^w]*org.kde.drkonqi" > /dev/null ; do sleep 5 wait_drkonqi_counter=$((wait_drkonqi_counter+5)) if test "$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" + @qttools@/bin/qdbus | @gnugrep@/bin/grep 'org.kde.drkonqi-' | while read address ; do + @qttools@/bin/qdbus "$address" "/MainApplication" "quit" done break fi @@ -410,21 +369,21 @@ echo 'startkde: Shutting down...' 1>&2 test -n "$ksplash_pid" && kill "$ksplash_pid" 2>/dev/null # Clean up -kdeinit5_shutdown +@kinit@/bin/kdeinit5_shutdown echo 'startkde: Running shutdown scripts...' 1>&2 # Run scripts found in /plasma-workspace/shutdown for prefix in `echo "$scriptpath"`; do - for file in `ls "$prefix"/shutdown 2> /dev/null | egrep -v '(~|\.bak)$'`; do + for file in `ls "$prefix"/shutdown 2> /dev/null | @gnugrep@/bin/egrep -v '(~|\.bak)$'`; do test -x "$prefix/shutdown/$file" && "$prefix/shutdown/$file" done done unset KDE_FULL_SESSION -xprop -root -remove KDE_FULL_SESSION +@xprop@/bin/xprop -root -remove KDE_FULL_SESSION unset KDE_SESSION_VERSION -xprop -root -remove KDE_SESSION_VERSION +@xprop@/bin/xprop -root -remove KDE_SESSION_VERSION unset KDE_SESSION_UID echo 'startkde: Done.' 1>&2 -- 2.5.0