#!/bin/sh

# $Xorg: startx.cpp,v 1.3 2000/08/17 19:54:29 cpqbld Exp $
#
# This is just a sample implementation of a slightly less primitive
# interface than xinit.  It looks for user .xinitrc and .xserverrc
# files, then system xinitrc and xserverrc files, else lets xinit choose
# its default.  The system xinitrc should probably do things like check
# for .Xresources files and merge them in, startup up a window manager,
# and pop a clock and serveral xterms.
#
# $XFree86: xc/programs/xinit/startx.cpp,v 3.12 2001/11/30 20:57:48 dawes Exp $

userclientrc="$HOME/.xinitrc"
userserverrc="$HOME/.xserverrc"
sysclientrc=/etc/X11/xinit/xinitrc
sysserverrc=/etc/X11/xinit/xserverrc
defaultclientargs=""
defaultserverargs=""
clientargs=
serverargs=
display=

if [ -f $userclientrc ]; then
	defaultclientargs=$userclientrc
elif [ -f $sysclientrc ]; then
	defaultclientargs=$sysclientrc
fi

if [ -f $userserverrc ]; then
	defaultserverargs=$userserverrc
elif [ -f $sysserverrc ]; then
	defaultserverargs=$sysserverrc
fi

add_client_args()
{
	if [ -z "$clientargs" ]; then
		clientargs="$1"
	else
		clientargs="$clientargs $1"
	fi
}

add_server_args()
{
	if [ -z "$serverargs" ]; then
		serverargs="$1"
	else
		serverargs="$serverargs $1"
	fi
}

add_def_client_args()
{
	if [ -z "$clientargs" ]; then
		clientargs="$defaultclientargs $1"
	else
		clientargs="$clientargs $1"
	fi
}

add_def_server_args()
{
	if [ -z "$serverargs" ]; then
		serverargs="$defaultserverargs $1"
	else
		serverargs="$serverargs $1"
	fi
}

whoseargs=client

while [ -n "$1" ]; do
	case "$1" in
		/''*|\.*)
			if [ "$whoseargs" = client ]; then
				add_client_args "$1"
			else
				add_server_args "$1"
 			fi
			;;
		--)
			whoseargs=server
			;;
		*)
			if [ "$whoseargs" = client ]; then
				add_def_client_args "$1"
			else
				if [ -z "$display" -a -z "${1##:*}" ]; then
					display="$1"
				fi
				add_def_server_args "$1"
 			fi
			;;
	esac
	shift
done

# process client arguments
if [ -z "$clientargs" ]; then
	clientargs="$defaultclientargs"
fi

# process server arguments
if [ -z "$serverargs" ]; then
	serverargs="$defaultserverargs"
fi

if [ -z "$XAUTHORITY" ]; then
	export XAUTHORITY=$HOME/.Xauthority
fi

# select next free display if not specified
if [ -z "$display" ]; then
	last_display=`find /tmp/ -maxdepth 1 -type f -name '.X*-lock' |
		sed -ne 's,^/tmp/\.X\([[:digit:]]\+\)-lock$,\1,p' |
		sort -n |
		tail -1`
	[ -z "$last_display" ] || display=":$((1+last_display))"
fi

# set up default Xauth info for this machine
removelist=
authdisplay=${display:-:0}
mcookie=`mcookie`
for displayname in "$authdisplay" "`hostname -f`$authdisplay"; do
	if ! xauth list "$displayname" |fgrep -qs "$displayname "; then
		xauth add "$displayname" . "$mcookie"
		removelist="$displayname $removelist"
	fi
done

cleanup()
{
    [ -z "$xinit_pid" ] || kill "$xinit_pid"
}

trap cleanup EXIT

xinit $clientargs -- $serverargs $authdisplay &

xinit_pid=$!

wait "$xinit_pid"

# save dolphins, elecrtons, and errorlevels
return_val=$?

xinit_pid=

if [ -n "$removelist" ]; then
	xauth remove $removelist
fi

DEALLOCVT=/usr/bin/deallocvt
if [ -x "$DEALLOCVT" ]; then
	"$DEALLOCVT"
fi

exit $return_val
