#!/bin/sh
#
#  DEFAULT KDE STARTUP SCRIPT ( KDE-3.0.4 )
#

# Boot sequence:
#
# kdeinit is used to fork off processes which improves memory usage
# and startup time.
#
# * kdeinit starts the dcopserver and klauncher first.
# * Then kded is started. kded is responsible for keeping the sycoca
#   database up to date. When an up to date database is present it goes
#   into the background and the startup continues.
# * Then kdeinit starts kcminit. kcminit performs initialisation of
#   certain devices according to the user's settings
#
# * Then ksmserver is started which in turn starts 
#   1) the window manager (kwin)
#   2) everything in $KDEDIR/share/autostart (kdesktop, kicker, etc.)
#   3) the rest of the session.

# Help message.
if [ $# -eq 1 ] && [ $1 = "--help" ]; then
    echo "This script starts KDE."
    echo "Usage: startkde [window_manager]"
    exit 1
fi

# Prevent an ever growing .ICEauthority file, since that will kill application
# startup performance.
rm -f $HOME/.ICEauthority*
rm -f $HOME/.DCOPserver*
rm -f $HOME/.dcop*

# 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.
#
# Set the background to plain grey.
# The standard X background is nasty, causing moire effects and exploding
# people's heads. We use colours from the standard KDE palette for those with
# palettised displays.

test "$XDM_MANAGED" || bkg="-solid #C0C0C0"
xsetroot -cursor_name left_ptr $bkg

# The user's personal KDE directory is usually ~/.kde, but this setting
# may be overridden by setting KDEHOME.

kdehome=$HOME/.kde
test -n "$KDEHOME" && kdehome=`echo "$KDEHOME"|sed "s,^\~/,$HOME/,"`

# Link "tmp" resource to directory in /tmp
# Creates a directory /tmp/kde-$USER and links $KDEHOME/tmp-$HOSTNAME to it.
lnusertemp tmp >/dev/null

# Link "socket" resource to directory in /tmp
# Creates a directory /tmp/ksocket-$USER and links $KDEHOME/socket-$HOSTNAME to it.
lnusertemp socket >/dev/null

# In case of dcop sockets left by a previous session, cleanup
dcopserver_shutdown

# run KPersonalizer before the session, if this is the first login
grep 'FirstLogin=false' $kdehome/share/config/kpersonalizerrc >/dev/null 2>/dev/null
if test $? -ne 0; then
    # start only dcopserver, don't start whole kdeinit (takes too long)
    dcopserver
    kwin &
    kpersonalizer --before-session
    # handle kpersonalizer restarts (language change)
    while test $? -eq 1; do
        kpersonalizer --r --before-session
    done
    dcopserver_shutdown
    # shutdown will also make kwin quit, give it time to do so
    sleep 1
fi

# the splashscreen and progress indicator
ksplash

# We set LD_BIND_NOW to increase the efficiency of kdeinit.
# kdeinit unsets this variable before loading applications.
LD_BIND_NOW=true kdeinit +kcminit +knotify || \
  xmessage -geometry 500x100 "Couldn't start kdeinit. Check your installation."

# finally, give the session control to the session manager
# Syntax:   ksmserver [--restore] [--windowmanager <wm>]
# if no windowmanager is specified, ksmserver will ensure kwin is started.
# [--restore] should be controlled by kdm
# kwrapper is used to reduce startup time and memory usage
if [ $# -eq 1 ]; then
	kwrapper ksmserver --windowmanager $1
else
	kwrapper ksmserver --restore
fi

# Clean up
kdeinit_shutdown
dcopserver_shutdown
artsshell -q terminate
