#!/bin/bash
#
#  DEFAULT KDE STARTUP SCRIPT ( KDE-3.4.3 )
#

echo "$0: Starting KDE 3.4.2"
export XPG4ID="`/usr/xpg4/bin/id -u`"

/bin/coreadm -p core.%f.%p

# KDE
export KDE_IS_PRELINKED="1"
export KDE_DEBUG="1"
export KDEDIR="/opt/kde-3.4.3"
export KDEDIRS="/opt/kde-3.4.3"
export KDEHOME="${HOME}/.kde-3.4.3"
export ADMIN_ACCOUNT="root"

# GST
export GST_PLUGIN_PATH="/usr/lib/gstreamer-0.8"

### DEBUGGING ###
## export KDE_SLAVE_DEBUG_WAIT="1218"
### DEBUGGING ###

# Set the Locale
export LANGUAGE="en_US.ISO8859-1"
export LANG="en_US.ISO8859-1"
export LC_CTYPE="en_US.ISO8859-1"
export LC_NUMERIC="en_US.ISO8859-1"
export LC_TIME="en_US.ISO8859-1"
export LC_COLLATE="en_US.ISO8859-1"
export LC_MONETARY="en_US.ISO8859-1"
export LC_MESSAGES="en_US.ISO8859-1"
export LC_ALL="en_US.ISO8859-1"

# Set the Locale paths
export I18NPATH="/usr/lib/locale/${LANG}:/opt/fsw4sun/lib/locale/${LANG}:/opt/fsw4sun/share/locale/${LANG}:/usr/openwin/lib/locale/${LANG}:/usr/dt/config/${LANG}:/usr/lib/secure"
export NLSPATH="/usr/lib/locale/${LANG}:/opt/fsw4sun/lib/locale/${LANG}:/opt/fsw4sun/share/locale/${LANG}:/usr/openwin/lib/locale/${LANG}:/usr/dt/config/${LANG}:/opt/kde-3.4.3/share/locale/${LANG}:/usr/lib/secure"
export LOCALE_LIBPATH="/usr/lib/locale/${LANG}:/usr/lib/locale:/opt/fsw4sun/share/locale/${LANG}:/usr/openwin/lib/locale/${LANG}:/opt/kde-3.4.3/share/locale/${LANG}"

# Set the KDE Language
export KDE_LANG="${LANG}"

# Enable the Sun XServer Transport Shared Memory Extension
export XSUNTRANSPORT="shmem"
export XSUNSMESIZE=32768

# Set GS_LIB
export GS_LIB="/opt/fsw4sun/share/ghostscript/8.15/lib/fonts"

#QT
export QTDIR="/opt/qt-3.3.4-32"

# DEFAULT CD DEVICE
export KDE_DEFAULT_CD_DEVICE="/dev/cdrom"

# NAS Audio Server
export AUDIOSERVER="`hostname`:0"

# Set the XIM Input Method
export XIM="htt"

# GDK
export GDK_USE_XFT=1

# GTK
export GTK_IM_MODULE="iiim"

# XMODIFIERS
export XMODIFIERS="@im=${XIM}"

# Stolen shamelessly from RedHat
# Clean up old kde /tmp files that belong to the user
real_display=`echo $DISPLAY | sed "s/://" | sed "s/\..*//"`
rm -f ~/.DCOPserver-`/bin/hostname`_$DISPLAY
for i in /tmp/.ICE-unix/* /tmp/.ICE-unix/.*; do
        [ -O $i ] && rm -f $i
done

[ -d "${HOME}"/.kde-3.4.3/share/config ] || mkdir -p "${HOME}"/.kde-3.4.3/share/config

# 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

# Set Sun MediaLib Home
export MLIBHOME="/opt/SUNWmlib"

# Set the Python path
export PYTHONPATH="/opt/fsw4sun/python-2.3.4/lib:/opt/fsw4sun/python-2.3.4/lib/python2.3:/opt/fsw4sun/python-2.3.4/lib/python2.3/site-packages:${QTDIR}/lib"
export PYTHONY2K="1"

# Set the Java CLASSPATH
export CLASSPATH="${CLASSPATH}:/opt/kde-3.4.3/lib/java/qtjava.jar:/opt/kde-3.4.3/lib/java/koala.jar:/opt/kde-3.4.3/share/apps/kjava/kjava.jar"

# PATH
export PATH="/opt/fsw4sun/bin:/usr/bin:/usr/sbin:/usr/openwin/bin:/usr/X11/bin:/usr/dt/bin:${QTDIR}/bin:/opt/kde-3.4.3/bin:/usr/ccs/bin"

# LD_LIBRARY_PATH
export LD_LIBRARY_PATH="/opt/fsw4sun/python-2.3.4/lib"

# XINE Plugins Path
export XINE_PLUGIN_PATH="/opt/fsw4sun/lib/xine/plugins/1.1.0"

# DVD Debug
export DVDCSS_VERBOSE=8
export DVDPLAY_VERBOSE=8
export DVDREAD_VERBOSE=8
export DVDNAV_VERBOSE=8

# DocBook XSL
if [ -f /opt/fsw4sun/docbook-xsl-1.69.1/.profile.incl ] ; then
	. /opt/fsw4sun/docbook-xsl-1.69.1/.profile.incl
fi
export XML_CATALOG_FILES="${KDEDIR}/share/apps/ksgmltools2/customization/catalog
 ${XML_CATALOG_FILES}"

# Start NAS Audio Server
n=`pgrep -f nasd`
if [ -z $n ] ; then
        echo "Starting NAS Server at ${AUDIOSERVER} ..."        
        /opt/fsw4sun/bin/nasd -aa -b
fi

# Start CDDA Slave
n=`pgrep -f cddaslave`
if [ -z $n ] ; then
	echo "Starting the CDDA Slave ... "
	/opt/kde-3.4.3/bin/cddaslave -d /dev/audio -s sun -v /dev/audio -c /dev/audioctl > /dev/null 2>&1 &
fi

# Start the GPG-Agent in daemon mode
export GPGOUT="/tmp/gpgout.${USER}"
export GPGENV="/tmp/gpgenv.${USER}"
export XPG4ID="`/usr/xpg4/bin/id -u`"
m=`pgrep -f -U ${XPG4ID} gpg-agent`
if [ -z $m ] ; then
	echo "Starting the GPG-Agent For UserID ${XPG4ID} ... "
	cat /dev/null > ${GPGOUT}
	/opt/fsw4sun/bin/gpg-agent -s --daemon > ${GPGOUT} 2>&1
	chmod 0700 ${GPGOUT}
fi
cat /dev/null > ${GPGENV}
cat ${GPGOUT} | egrep export > ${GPGENV}
chmod 0700 ${GPGENV}
eval "`cat ${GPGENV}`"
echo "GPG_AGENT_INFO set to ${GPG_AGENT_INFO}."

# Start the SSH-Agent
SSHOUT="/tmp/sshout.${USER}"
SSHENV="/tmp/gpgenv.${USER}"
m=`pgrep -f -U ${XPG4ID} ssh-agent`
if [ -z $m ] ; then
	echo "Starting the SSH-Agent for UserID ${XPG4ID} ... "
	cat /dev/null > ${SSHOUT}
	/opt/fsw4sun/openssh-3.8.1/bin/ssh-agent -s > ${SSHOUT} 2>&1
	chmod 0700 ${SSHOUT}
fi
cat /dev/null > ${SSHENV}
cat ${SSHOUT} | egrep export > ${SSHENV}
chmod 0700 ${SSHENV}
eval "`cat ${SSHENV}`"
echo "SSH_AUTH_SOCK set to ${SSH_AUTH_SOCK}."

# 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 KDE session already is running
dcop kdesktop KDesktopIface isRunning >/dev/null 2>/dev/null
if [ $? -eq 0 ]; then
	echo "ERROR: KDE seems to be already running on this display."
	xmessage -geometry 500x100 "ERROR: KDE seems to be already running on this display." > /dev/null 2>/dev/null
	exit 1
fi

# 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
  case $PATH in
    $bindir|$bindir:*|*:$bindir|*:$bindir:*) ;;
    *) PATH=$bindir:$PATH; export PATH;;
  esac
fi

# 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.

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

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

# Source scripts found in <localprefix>/env/*.sh and <prefixes>/env/*.sh
# (where <localprefix> is $KDEHOME or ~/.kde, and <prefixes> is where KDE is installed)
#
# 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.

exepath=`kde-config --path exe`

for prefix in `echo "$exepath" | sed -e 's^/bin/^/env/^g;s^:^ ^g'`; do
  for file in "$prefix"*.sh; do
    test -r "$file" && . "$file"
  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.
echo "Adding ${LANG} font paths ..."
if [ -f /opt/kde-3.4.3/share/locale/${LANG}/OWfontpath.${LANG} ] ; then
	for f in `cat /opt/kde-3.4.3/share/locale/${LANG}/OWfontpath.${LANG}` ; do
		echo "adding fontpath $f"
		/usr/openwin/bin/xset fp+ $f
		/usr/openwin/bin/xset fp rehash
	done
fi

usr_odir=${HOME}/.fonts/kde-override
usr_fdir=${HOME}/.fonts
usr_sunfontdir="${HOME}/.fonts"

# Add any user-installed font directories to the X font path
kde_fontpaths=$usr_fdir/fontpaths
do_usr_fdir=1
do_usr_odir=1
if test -r "$kde_fontpaths" ; then
	savifs=$IFS
	IFS="
"
	for fpath in `grep -v '^[   ]*#' < "$kde_fontpaths"` ; do
		rfpath=`echo $fpath | sed "s:^~:$HOME:g"`
		if test -s "$rfpath"/fonts.dir; then
			/usr/openwin/bin/xset fp+ "$rfpath"
			if test "$rfpath" = "$usr_fdir"; then
				do_usr_fdir=0
			fi
			if test "$rfpath" = "$usr_odir"; then
				do_usr_odir=0
			fi
		fi
	done
	IFS=$savifs
fi

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.

# Only do usr_fdir and usr_odir if they are *not* listed in fontpaths
test -d "$usr_sunfontdir" && /usr/openwin/bin/xset fp+ "$usr_sunfontdir"
test -d "$sys_odir" && /usr/openwin/bin/xset +fp "$sys_odir"
test $do_usr_odir -eq 1 && test -d "$usr_odir" && (/usr/openwin/bin/mkfontdir "$usr_odir" ; /usr/openwin/bin/xset +fp "$usr_odir")
test $do_usr_fdir -eq 1 && test -d "$usr_fdir" && (/usr/openwin/bin/mkfontdir "$usr_fdir" ; /usr/openwin/bin/xset fp+ "$usr_fdir")
test -d "$sys_fdir" && /usr/openwin/bin/xset fp+ "$sys_fdir"

# Ask X11 to rebuild its font list.
/usr/openwin/bin/xset fp rehash

# if the user has overwritten fonts, the cursor font may be different now
# so don't move this up

# 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 #100D50"
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-3.4.3"
test -n "$KDEHOME" && kdehome=`echo "${KDEHOME}"|sed "s,^\~/,$HOME/,"`

# 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

# Set LD_BIND_NOW to load shared objects in memory
# Set LD_DEMANGLE to get meanigful debug messages
export LD_DEMANGLE="1"
export LD_NOLAZYLOAD="1"
export LD_NOVERSION="1"
export LD_BIND_NOW="1"

# Make sure /tmp/mcop-${USER}, /tmp/kde-${USER} and /tmp/ksocket-${USER}
# have the correct ownership and permissions
echo "Setting correct permissions for /tmp directories ..."
/opt/kde-3.4.3/bin/kstartupcheck

# On Solaris, make sure /tmp/.X11-unix and /tmp/.X11-pipe have
# the right permissions ...
echo "Setting X11 security permissions ... "
/opt/kde-3.4.3/bin/kchmod

# 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

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

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

echo 'startkde: Starting up...'  1>&2

# run KPersonalizer before the session, if this is the first login
if kreadconfig --file kpersonalizerrc --group General --key FirstLogin --default true --type bool; then
    # start only dcopserver, don't start whole kdeinit (takes too long)
    echo 'startkde: Running kpersonalizer...'  1>&2
    dcopserver
    kwin --lock &
    kpersonalizer --before-session
    # handle kpersonalizer restarts (language change)
    while test $? -eq 1; do
        kpersonalizer --r --before-session
    done
    dcopquit kwin
    dcopserver_shutdown --wait
    # shutdown will also make kwin quit, give it time to do so
    sleep 1
fi

# the splashscreen and progress indicator
splash=`kreadconfig --file ksplashrc --group KSplash --key Theme`
if test "$splash" = "None" ; then
	echo > /dev/null #nothing
elif test "$splash" = "Simple" ; then
	ksplashsimple
else
	ksplash --nodcop
	## ksplash --nodcop --noxim
fi

# Set the KDE Session Environment
# export KDE_FULL_SESSION=true

# 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
## kdeinit +kcminit +knotify
export LD_BIND_NOW=1
kdeinit +kcminit +knotify
if test $? -ne 0; then
  # Startup error
  echo 'startkde: Could not start kdeinit. Check your installation.'  1>&2
  xmessage -geometry 500x100 "Could not start kdeinit. Check your installation."
fi

# Try loading users' X Defaults

if [ -f ${HOME}/.Xdefaults ] ; then
	/usr/openwin/bin/xrdb -load < ${HOME}/.Xdefaults
fi

# Set the KDE Session Environment
export KDE_FULL_SESSION=true

# finally, give the session control to the session manager
# if the KDEWM environment variable has been set, then it will be used as KDE's
# window manager instead of kwin.
# if KDEWM is not set, ksmserver will ensure kwin is started.
# kwrapper is used to reduce startup time and memory usage
# kwrapper does not return usefull error codes such as the exit code of ksmserver.
# 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"
kwrapper ksmserver $KDEWM 
## exec ksmserver $KDEWM 
ksmpid=$?
echo "ksmserver returned ${ksmpid}."
if test ${ksmpid} -eq 255; then
  # Startup error
  echo 'startkde: Could not start ksmserver. Check your installation.'  1>&2
  xmessage -geometry 500x100 "Could not start ksmserver. Check your installation."
fi

# dcopserver_shutdown --wait
# dcopquit kwin

echo 'startkde: Shutting down...'  1>&2

# Clean up
kdeinit_shutdown
dcopserver_shutdown
artsshell -q terminate

echo 'startkde: Running shutdown scripts...'  1>&2

# Run scripts found in $KDEDIRS/shutdown
for prefix in `echo "$exepath" | sed -e 's^/bin/^/shutdown/^g;s^:^ ^g'`; do
  for file in `ls "$prefix" 2> /dev/null | egrep -v '(~|\.bak)$'`; do
    test -x "$prefix$file" && "$prefix$file"
  done
done

export CLEANUPDIR="/tmp/mcop-${USER}"

if [ -d ${CLEANUPDIR} ] && [ -r ${CLEANUPDIR} ] ; then
        echo 'startkde: shutdown cleanup.'
        cd ${CLEANUPDIR}
        /bin/rm -rf `ls -1`
        cd /tmp
fi

echo 'startkde: Done.'  1>&2

