233 lines
6.2 KiB
Text
233 lines
6.2 KiB
Text
|
#!/bin/sh
|
||
|
|
||
|
# vim :set ts=4 sw=4 sts=4 et :
|
||
|
|
||
|
#
|
||
|
# 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, start up a window manager,
|
||
|
# and pop a clock and several xterms.
|
||
|
#
|
||
|
# Site administrators are STRONGLY urged to write nicer versions.
|
||
|
#
|
||
|
|
||
|
unset DBUS_SESSION_BUS_ADDRESS
|
||
|
unset SESSION_MANAGER
|
||
|
|
||
|
|
||
|
# Bourne shell does not automatically export modified environment variables
|
||
|
# so export the new PATH just in case the user changes the shell
|
||
|
export PATH=@PATH@:$PATH
|
||
|
|
||
|
export FONTCONFIG_FILE="@FONTCONFIG_FILE@"
|
||
|
|
||
|
userclientrc=$HOME/.xinitrc
|
||
|
sysclientrc=@XINITRC@
|
||
|
|
||
|
userserverrc=$HOME/.xserverrc
|
||
|
sysserverrc=@XINITRC@
|
||
|
defaultclient=@DEFAULT_CLIENT@ # xterm
|
||
|
defaultserver=@DEFAULT_SERVER@
|
||
|
defaultclientargs=""
|
||
|
defaultserverargs=""
|
||
|
defaultdisplay=":0"
|
||
|
clientargs=""
|
||
|
serverargs=""
|
||
|
|
||
|
export X11_PREFS_DOMAIN=org.nixos.xquartz".X11"
|
||
|
|
||
|
# Initialize defaults (this will cut down on "safe" error messages)
|
||
|
if ! /usr/bin/defaults read $X11_PREFS_DOMAIN cache_fonts > /dev/null 2>&1 ; then
|
||
|
/usr/bin/defaults write $X11_PREFS_DOMAIN cache_fonts -bool true
|
||
|
fi
|
||
|
|
||
|
if ! /usr/bin/defaults read $X11_PREFS_DOMAIN no_auth > /dev/null 2>&1 ; then
|
||
|
/usr/bin/defaults write $X11_PREFS_DOMAIN no_auth -bool false
|
||
|
fi
|
||
|
|
||
|
if ! /usr/bin/defaults read $X11_PREFS_DOMAIN nolisten_tcp > /dev/null 2>&1 ; then
|
||
|
/usr/bin/defaults write $X11_PREFS_DOMAIN nolisten_tcp -bool true
|
||
|
fi
|
||
|
|
||
|
# First, start caching fonts
|
||
|
if [ x`/usr/bin/defaults read $X11_PREFS_DOMAIN cache_fonts` = x1 ] ; then
|
||
|
@FONT_CACHE@ &
|
||
|
fi
|
||
|
|
||
|
# a race to create /tmp/.X11-unix
|
||
|
@PRIVILEGED_STARTX@
|
||
|
|
||
|
if [ x`/usr/bin/defaults read $X11_PREFS_DOMAIN no_auth` = x0 ] ; then
|
||
|
enable_xauth=1
|
||
|
else
|
||
|
enable_xauth=0
|
||
|
fi
|
||
|
|
||
|
if [ x`defaults read $X11_PREFS_DOMAIN nolisten_tcp` = x1 ] ; then
|
||
|
defaultserverargs="$defaultserverargs -nolisten tcp"
|
||
|
fi
|
||
|
|
||
|
# The second check is the real one. The first is to hopefully avoid
|
||
|
# needless syslog spamming.
|
||
|
if /usr/bin/defaults read $X11_PREFS_DOMAIN 2> /dev/null | grep -q 'dpi' && /usr/bin/defaults read $X11_PREFS_DOMAIN dpi > /dev/null 2>&1 ; then
|
||
|
defaultserverargs="$defaultserverargs -dpi `/usr/bin/defaults read $X11_PREFS_DOMAIN dpi`"
|
||
|
fi
|
||
|
|
||
|
# Automatically determine an unused $DISPLAY
|
||
|
d=0
|
||
|
while true ; do
|
||
|
[ -e /tmp/.X$d-lock ] || break
|
||
|
d=$(($d + 1))
|
||
|
done
|
||
|
defaultdisplay=":$d"
|
||
|
unset d
|
||
|
|
||
|
whoseargs="client"
|
||
|
while [ x"$1" != x ]; do
|
||
|
case "$1" in
|
||
|
# '' required to prevent cpp from treating "/*" as a C comment.
|
||
|
/''*|\./''*)
|
||
|
if [ "$whoseargs" = "client" ]; then
|
||
|
if [ x"$client" = x ] && [ x"$clientargs" = x ]; then
|
||
|
client="$1"
|
||
|
else
|
||
|
clientargs="$clientargs $1"
|
||
|
fi
|
||
|
else
|
||
|
if [ x"$server" = x ] && [ x"$serverargs" = x ]; then
|
||
|
server="$1"
|
||
|
else
|
||
|
serverargs="$serverargs $1"
|
||
|
fi
|
||
|
fi
|
||
|
;;
|
||
|
--)
|
||
|
whoseargs="server"
|
||
|
;;
|
||
|
*)
|
||
|
if [ "$whoseargs" = "client" ]; then
|
||
|
clientargs="$clientargs $1"
|
||
|
else
|
||
|
# display must be the FIRST server argument
|
||
|
if [ x"$serverargs" = x ] && \
|
||
|
expr "$1" : ':[0-9][0-9]*$' > /dev/null 2>&1; then
|
||
|
display="$1"
|
||
|
else
|
||
|
serverargs="$serverargs $1"
|
||
|
fi
|
||
|
fi
|
||
|
;;
|
||
|
esac
|
||
|
shift
|
||
|
done
|
||
|
|
||
|
# process client arguments
|
||
|
if [ x"$client" = x ]; then
|
||
|
client=$defaultclient
|
||
|
|
||
|
# For compatibility reasons, only use startxrc if there were no client command line arguments
|
||
|
if [ x"$clientargs" = x ]; then
|
||
|
if [ -f "$userclientrc" ]; then
|
||
|
client=$userclientrc
|
||
|
elif [ -f "$sysclientrc" ]; then
|
||
|
client=$sysclientrc
|
||
|
fi
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
# if no client arguments, use defaults
|
||
|
if [ x"$clientargs" = x ]; then
|
||
|
clientargs=$defaultclientargs
|
||
|
fi
|
||
|
|
||
|
# process server arguments
|
||
|
if [ x"$server" = x ]; then
|
||
|
server=$defaultserver
|
||
|
|
||
|
# For compatibility reasons, only use xserverrc if there were no server command line arguments
|
||
|
if [ x"$serverargs" = x -a x"$display" = x ]; then
|
||
|
if [ -f "$userserverrc" ]; then
|
||
|
server=$userserverrc
|
||
|
elif [ -f "$sysserverrc" ]; then
|
||
|
server=$sysserverrc
|
||
|
fi
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
# if no server arguments, use defaults
|
||
|
if [ x"$serverargs" = x ]; then
|
||
|
serverargs=$defaultserverargs
|
||
|
fi
|
||
|
|
||
|
# if no display, use default
|
||
|
if [ x"$display" = x ]; then
|
||
|
display=$defaultdisplay
|
||
|
fi
|
||
|
|
||
|
if [ x"$enable_xauth" = x1 ] ; then
|
||
|
if [ x"$XAUTHORITY" = x ]; then
|
||
|
XAUTHORITY=$HOME/.Xauthority
|
||
|
export XAUTHORITY
|
||
|
fi
|
||
|
|
||
|
removelist=
|
||
|
|
||
|
# set up default Xauth info for this machine
|
||
|
hostname=`/bin/hostname`
|
||
|
|
||
|
authdisplay=${display:-:0}
|
||
|
|
||
|
mcookie=`/usr/bin/openssl rand -hex 16`
|
||
|
|
||
|
if test x"$mcookie" = x; then
|
||
|
echo "Couldn't create cookie"
|
||
|
exit 1
|
||
|
fi
|
||
|
dummy=0
|
||
|
|
||
|
# create a file with auth information for the server. ':0' is a dummy.
|
||
|
xserverauthfile=$HOME/.serverauth.$$
|
||
|
trap "rm -f '$xserverauthfile'" HUP INT QUIT ILL TRAP KILL BUS TERM
|
||
|
@XAUTH@ -q -f "$xserverauthfile" << EOF
|
||
|
add :$dummy . $mcookie
|
||
|
EOF
|
||
|
|
||
|
xserverauthfilequoted=$(echo ${xserverauthfile} | sed "s/'/'\\\\''/g")
|
||
|
serverargs=${serverargs}" -auth '"${xserverauthfilequoted}"'"
|
||
|
|
||
|
# now add the same credentials to the client authority file
|
||
|
# if '$displayname' already exists do not overwrite it as another
|
||
|
# server man need it. Add them to the '$xserverauthfile' instead.
|
||
|
for displayname in $authdisplay $hostname$authdisplay; do
|
||
|
authcookie=`@XAUTH@ list "$displayname" \
|
||
|
| sed -n "s/.*$displayname[[:space:]*].*[[:space:]*]//p"` 2>/dev/null;
|
||
|
if [ "z${authcookie}" = "z" ] ; then
|
||
|
@XAUTH@ -q << EOF
|
||
|
add $displayname . $mcookie
|
||
|
EOF
|
||
|
removelist="$displayname $removelist"
|
||
|
else
|
||
|
dummy=$(($dummy+1));
|
||
|
@XAUTH@ -q -f "$xserverauthfile" << EOF
|
||
|
add :$dummy . $authcookie
|
||
|
EOF
|
||
|
fi
|
||
|
done
|
||
|
fi
|
||
|
|
||
|
eval @XINIT@ \"$client\" $clientargs -- \"$server\" $display $serverargs "-xkbdir" "@XKEYBOARD_CONFIG@"
|
||
|
retval=$?
|
||
|
|
||
|
if [ x"$enable_xauth" = x1 ] ; then
|
||
|
if [ x"$removelist" != x ]; then
|
||
|
@XAUTH@ remove $removelist
|
||
|
fi
|
||
|
if [ x"$xserverauthfile" != x ]; then
|
||
|
rm -f "$xserverauthfile"
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
exit $retval
|