:
# $Id: fwin_lnx.sh,v 1.3 2002/03/22 01:34:38 rlawrence Exp $ 
# SCCSID(@(#)fwin_lnx.sh	1.7) Modified 10:41:22 7/9/01
# This is the "fwin" command for Linux systems.
# Unlike on UnixWare and SCO OpenServer systems, when you run xinit
# on a display that is already in use, it prints an error message and
# hangs, instead of returning an error.  So we have to make sure
# that we try for a display that is not already in use.

ME=$0

# Get the STATICMERGE and VARMERGE settings.
. /etc/mrgssv.sh

XFONTS=/usr/lib/X11/fonts/misc\;/usr/lib/X11/fonts/75dpi\;/usr/lib/X11/fonts/100dpi
XPATH=/usr/bin/X11
SYS_RC_DIR=$STATICMERGE/fullx
SYS_RC_FILE=fwin_start.sh

# If the user already has XPATH in their PATH, don't change the path 
if expr $PATH : ".*\/usr\/bin\/X11" >/dev/null
then :
else 
#  Add XPATH to user's PATH.
	PATH=${PATH}:${XPATH}
fi
export PATH XFONTS

Echo1()
{
	echo -e "$*"
}

Echo2()
{
	echo -e "$*" 1>&2
}


XFree86ver()
{
	XINFO=`xdpyinfo | grep "vendor string"`
	echo $XINFO | grep  XFree86 > /dev/null
	if [ $? -eq 0 ]
	then
        	XINFO=`xdpyinfo | grep "vendor release number: "`
        	XFREE86_VER=`echo $XINFO \
			 | while read A B C D E ; do echo $D;break;done`
	fi                                       
}
XFREE86_VER=not
XFree86ver

syntax()
{
	usrMsg STRING FWIN_SYNTAX "fwin" "$ME"
	if [ "_$USRMSG_STRING" != "_" -a "_$USRMSG_STRING" != "_fwin"  ]
	then
		echo -e $USRMSG_STRING
		return
	fi
  Echo2 "Syntax:"
  Echo2 "$ME" '[-auth] [-disp N] [-version] [-help] [<win parameters>]'
  Echo2 "   -auth is used when the '-auth' X server option is required."
  Echo2 "   -disp N is used to specify which console X display to use"
  Echo2 "       instead of it being automatically determined."
  Echo2 "       The number N must be 0, 1, 2, 3, 4, or 5."
  Echo2 "   -version prints out the build version."
  Echo2 "   -help prints out this syntax explanation."
  Echo2 "Any other parameters are passed on to the 'win' program."
  Echo2 "In addition, the environment variable FWIN_X_ARGS can be used to"
  Echo2 "specify additonal X server parameters."
}

print_xfree_ver()
{
	case $XFREE86_VER in
	33*)
		Echo2 "XFree86 3.3.x"
		;;
	3*)
		Echo2 "XFree86 3.x"
		;;
	4001*)
		Echo2 "XFree86 4.0.1"
		;;
	4002*)
		Echo2 "XFree86 4.0.2"
		;;
	4*)
		Echo2 "XFree86 4.x"
		;;
	*)
		usrMsg STRING FWIN_NOT_2 "Not XFree86 3.x or 4.x" "XFree86 3.x" 4.x
		Echo2 $USRMSG_STRING
		;;
	esac
}

# The script "set_nls.sh" uses STATICMERGE to set MFILE.
. $STATICMERGE/set_nls.sh
DM="LCC.MERGE.UNIX.FWIN"

# Scan for special fwin options
USE_AUTH=no
XX=xx
while true
do
	[ $# -eq 0 ] && break
	case "$1" in
	-help|--help|--h|-h|+h)
		syntax
		exit 1
		;;
	-version|--version|-v|--v)
		eval `grep "^VERSION=" $VARMERGE/Version`
		eval `grep "^WIN4LIN=" $VARMERGE/Version`
		eval `grep "^SERVER="  $VARMERGE/Version`
		eval `grep "^PRODUCT_STYLE="   $VARMERGE/Version`
		eval `grep "^CYCLE="   $VARMERGE/Version`
		eval `grep "^REL_DAY=" $VARMERGE/Version`
		if [ "_$PRODUCT_STYLE" = "_server" ]
		then
			NUMBER="$SERVER"
		elif [ "_$PRODUCT_STYLE" = "_desktop" ]
		then
			NUMBER="$WIN4LIN"
		else
			NUMBER=
		fi
		Echo1 $MERGENAME $NUMBER '('${VERSION}${CYCLE}')' $REL_DAY
		print_xfree_ver
		exit 0
		;;
	-auth|--auth)
		shift
		USE_AUTH=use_auth
		;;
	-disp|--disp)
		if [ $# -lt 2 ] 
		then
			usrMsg STRING FWIN_INVALID "Invalid parameters"
			Echo2 $USRMSG_STRING
			syntax
			exit 1
		fi
		shift
		case $1 in
		0|1|2|3|4|5)
			XX=$1
			shift
			;;
		*)
			usrMsg STRING FWIN_INVALID "Invalid parameters"
			Echo2 $USRMSG_STRING
			syntax
			exit 1
			;;
		esac
		;;
	*)
		break;
		;;
	esac
done

# Now make sure DISPLAY is set. If not, then set to ":0.0" (i.e. local default 
# display) so clients that don't default reasonably don't choke.

[ "$DISPLAY" = "" ] 
case $? in
0)
	DISPLAY=:0.0
	export DISPLAY
	;;
esac

[ "$MERGE_POSITION" = "" ]
case $? in
0)
	MERGE_POSITION=fullscreen
	export MERGE_POSITION
	;;
esac


[ "$MERGE_AUTOBACKGROUND" = "" ]
case $? in
0)
	MERGE_AUTOBACKGROUND=off
	export MERGE_AUTOBACKGROUND
	;;
esac

print_xfree_ver

find_free_display()
{
	# Look for a display that X is not running on.
	for XX in 0 1 2 3 4 5 allinuse
	do
		if [ "$XX" = "allinuse" ]
		then
			usrMsg STRING FWIN_IN_USE "All displays in use."
			Echo2 $USRMSG_STRING
			exit 1
		fi
		[ ! -e /tmp/.X${XX}-lock ] && break
		usrMsg STRING FWIN_RUNNING_ON "X running on $XX" "${XX}"
		Echo2 $USRMSG_STRING
	done
}

if [ "$XX" = "xx" ]
then
	find_free_display
fi
usrMsg STRING FWIN_TRYING "Trying display $XX." "${XX}"
Echo2 $USRMSG_STRING

if [ "$USE_AUTH" = "use_auth" ]
then
	FWIN_MCOOKIE=`mcookie`
	FWIN_HOSTNAME=`hostname -f 2> /dev/null`
	if [ "_$FWIN_HOSTNAME" = "_" ]
	then
		FWIN_HOSTNAME=`hostname 2> /dev/null`
	fi
	if [ "_$FWIN_HOSTNAME" = "_" ]
	then
		FWIN_HOSTNAME=localhost
	fi
	xauth add :$XX . $FWIN_MCOOKIE
	xauth add ${FWIN_HOSTNAME}:$XX . $FWIN_MCOOKIE
	if [ "_$XAUTHORITY" = "_" ]
	then
		FWIN_AUTH_FILE="$HOME/.Xauthority"
	else
		FWIN_AUTH_FILE="$XAUTHORITY"
	fi
	FWIN_X_ARGS="$FWIN_X_ARGS -auth $FWIN_AUTH_FILE"
fi

# Now start X and the intial clients specified in $SYS_RC_DIR/$SYS_RC_FILE

Echo2 xinit /bin/sh ${SYS_RC_DIR}/${SYS_RC_FILE} $* -- :$XX $FWIN_X_ARGS
xinit /bin/sh ${SYS_RC_DIR}/${SYS_RC_FILE} $* -- :$XX $FWIN_X_ARGS
