startx.cpp revision 36ffeb23
1a73027baSmrgXCOMM!SHELL_CMD 2a73027baSmrg 3a73027baSmrgXCOMM 4a73027baSmrgXCOMM This is just a sample implementation of a slightly less primitive 5a73027baSmrgXCOMM interface than xinit. It looks for user .xinitrc and .xserverrc 6a73027baSmrgXCOMM files, then system xinitrc and xserverrc files, else lets xinit choose 7a73027baSmrgXCOMM its default. The system xinitrc should probably do things like check 8c81d8f5eSmrgXCOMM for .Xresources files and merge them in, start up a window manager, 9c81d8f5eSmrgXCOMM and pop a clock and several xterms. 10a73027baSmrgXCOMM 11a73027baSmrgXCOMM Site administrators are STRONGLY urged to write nicer versions. 12a73027baSmrgXCOMM 13a73027baSmrg 14a73027baSmrgunset DBUS_SESSION_BUS_ADDRESS 15a73027baSmrgunset SESSION_MANAGER 16a73027baSmrg 17a73027baSmrg#if defined(__SCO__) || defined(__UNIXWARE__) || defined(__APPLE__) 18a73027baSmrg 19a73027baSmrgXCOMM Check for /usr/bin/X11 and BINDIR in the path, if not add them. 20a73027baSmrgXCOMM This allows startx to be placed in a place like /usr/bin or /usr/local/bin 21a73027baSmrgXCOMM and people may use X without changing their PATH. 22a73027baSmrgXCOMM Note that we put our own bin directory at the front of the path, and 23a73027baSmrgXCOMM the standard system path at the back, since if you are using the Xorg 24c81d8f5eSmrgXCOMM server there's a pretty good chance you want to bias the Xorg clients 25a73027baSmrgXCOMM over the old system's clients. 26a73027baSmrg 27a73027baSmrgXCOMM First our compiled path 28a73027baSmrgbindir=__bindir__ 29a73027baSmrg 30a73027baSmrgcase $PATH in 31a73027baSmrg *:$bindir | *:$bindir:* | $bindir:*) ;; 32a73027baSmrg *) PATH=$bindir:$PATH ;; 33a73027baSmrgesac 34a73027baSmrg 35a73027baSmrgXCOMM Now the "old" compiled path 36a73027baSmrg#ifdef __APPLE__ 37a73027baSmrgoldbindir=/usr/X11R6/bin 38a73027baSmrg#else 39a73027baSmrgoldbindir=/usr/bin/X11 40a73027baSmrg#endif 41a73027baSmrg 42a73027baSmrgif [ -d "$oldbindir" ] ; then 43a73027baSmrg case $PATH in 44a73027baSmrg *:$oldbindir | *:$oldbindir:* | $oldbindir:*) ;; 45a73027baSmrg *) PATH=$PATH:$oldbindir ;; 46a73027baSmrg esac 47a73027baSmrgfi 48a73027baSmrg 49a73027baSmrgXCOMM Bourne shell does not automatically export modified environment variables 50a73027baSmrgXCOMM so export the new PATH just in case the user changes the shell 51a73027baSmrgexport PATH 52a73027baSmrg#endif 53a73027baSmrg 54a73027baSmrg#if defined(__SCO__) || defined(__UNIXWARE__) 55a73027baSmrgXCOMM Set up the XMERGE env var so that dos merge is happy under X 56a73027baSmrg 57a73027baSmrgif [ -f /usr/lib/merge/xmergeset.sh ]; then 58a73027baSmrg . /usr/lib/merge/xmergeset.sh 59a73027baSmrgelif [ -f /usr/lib/merge/console.disp ]; then 60a73027baSmrg XMERGE=`cat /usr/lib/merge/console.disp` 61a73027baSmrg export XMERGE 62a73027baSmrgfi 63a73027baSmrg 64a73027baSmrguserclientrc=$HOME/.startxrc 65a73027baSmrgsysclientrc=LIBDIR/sys.startxrc 66a73027baSmrgscouserclientrc=$HOME/.xinitrc 67a73027baSmrgscosysclientrc=XINITDIR/xinitrc 68a73027baSmrg#else 69a73027baSmrguserclientrc=$HOME/.xinitrc 70a73027baSmrgsysclientrc=XINITDIR/xinitrc 71a73027baSmrg#endif 72a73027baSmrg 73a73027baSmrguserserverrc=$HOME/.xserverrc 74a73027baSmrgsysserverrc=XINITDIR/xserverrc 75a73027baSmrgdefaultclient=XTERM 76a73027baSmrgdefaultserver=XSERVER 77a73027baSmrgdefaultclientargs="" 78040e9fe7Smartindefaultserverargs="-noretro" 79a73027baSmrgdefaultdisplay=":0" 80a73027baSmrgclientargs="" 81a73027baSmrgserverargs="" 82a73027baSmrg 83a73027baSmrg#ifdef __APPLE__ 84a73027baSmrg 8572e81212Smrgif [ "x$X11_PREFS_DOMAIN" = x ] ; then 86c81d8f5eSmrg export X11_PREFS_DOMAIN=BUNDLE_ID_PREFIX".X11" 8772e81212Smrgfi 8872e81212Smrg 89a73027baSmrgXCOMM Initialize defaults (this will cut down on "safe" error messages) 9029004570Smrgif ! defaults read $X11_PREFS_DOMAIN cache_fonts > /dev/null 2>&1 ; then 9172e81212Smrg defaults write $X11_PREFS_DOMAIN cache_fonts -bool true 92a73027baSmrgfi 93a73027baSmrg 9429004570Smrgif ! defaults read $X11_PREFS_DOMAIN no_auth > /dev/null 2>&1 ; then 9572e81212Smrg defaults write $X11_PREFS_DOMAIN no_auth -bool false 96a73027baSmrgfi 97a73027baSmrg 9829004570Smrgif ! defaults read $X11_PREFS_DOMAIN nolisten_tcp > /dev/null 2>&1 ; then 9972e81212Smrg defaults write $X11_PREFS_DOMAIN nolisten_tcp -bool true 100a73027baSmrgfi 101a73027baSmrg 102a73027baSmrgXCOMM First, start caching fonts 10372e81212Smrgif [ x`defaults read $X11_PREFS_DOMAIN cache_fonts` = x1 ] ; then 10472e81212Smrg if [ -x $bindir/font_cache ] ; then 10572e81212Smrg $bindir/font_cache & 10672e81212Smrg elif [ -x $bindir/font_cache.sh ] ; then 10772e81212Smrg $bindir/font_cache.sh & 10872e81212Smrg elif [ -x $bindir/fc-cache ] ; then 10972e81212Smrg $bindir/fc-cache & 110a73027baSmrg fi 111a73027baSmrgfi 112a73027baSmrg 113a73027baSmrgif [ -x XINITDIR/privileged_startx ] ; then 114a73027baSmrg # Don't push this into the background becasue it can cause 115a73027baSmrg # a race to create /tmp/.X11-unix 116a73027baSmrg XINITDIR/privileged_startx 117a73027baSmrgfi 118a73027baSmrg 11972e81212Smrgif [ x`defaults read $X11_PREFS_DOMAIN no_auth` = x0 ] ; then 120a73027baSmrg enable_xauth=1 121a73027baSmrgelse 122a73027baSmrg enable_xauth=0 123a73027baSmrgfi 124a73027baSmrg 12572e81212Smrgif [ x`defaults read $X11_PREFS_DOMAIN nolisten_tcp` = x1 ] ; then 126a73027baSmrg defaultserverargs="$defaultserverargs -nolisten tcp" 127a73027baSmrgfi 128a73027baSmrg 12936ffeb23SmrgXCOMM The second check is the real one. The first is to hopefully avoid 13036ffeb23SmrgXCOMM needless syslog spamming. 13136ffeb23Smrgif defaults read $X11_PREFS_DOMAIN 2> /dev/null | grep -q 'dpi' && defaults read $X11_PREFS_DOMAIN dpi > /dev/null 2>&1 ; then 13272e81212Smrg defaultserverargs="$defaultserverargs -dpi `defaults read $X11_PREFS_DOMAIN dpi`" 13372e81212Smrgfi 13472e81212Smrg 1351b180c10Smrg#else 1361b180c10Smrgenable_xauth=1 1371b180c10Smrg#endif 1381b180c10Smrg 1391b180c10SmrgXCOMM Automatically determine an unused $DISPLAY 14029004570Smrgd=0 14129004570Smrgwhile true ; do 14229004570Smrg [ -e /tmp/.X$d-lock ] || break 14329004570Smrg d=$(($d + 1)) 144a73027baSmrgdone 145a73027baSmrgdefaultdisplay=":$d" 14629004570Smrgunset d 147a73027baSmrg 148a73027baSmrg#if defined(__SCO__) || defined(__UNIXWARE__) 149a73027baSmrg 150a73027baSmrgXCOMM SCO -t option: do not start an X server 151a73027baSmrgcase $1 in 152a73027baSmrg -t) if [ -n "$DISPLAY" ]; then 153a73027baSmrg REMOTE_SERVER=TRUE 154a73027baSmrg shift 155a73027baSmrg else 156a73027baSmrg echo "DISPLAY environment variable not set" 157a73027baSmrg exit 1 158a73027baSmrg fi 159a73027baSmrg ;; 160a73027baSmrgesac 161a73027baSmrg#endif 162a73027baSmrg 163a73027baSmrgwhoseargs="client" 164a73027baSmrgwhile [ x"$1" != x ]; do 165a73027baSmrg case "$1" in 166a73027baSmrg XCOMM '' required to prevent cpp from treating "/*" as a C comment. 167a73027baSmrg /''*|\./''*) 168a73027baSmrg if [ "$whoseargs" = "client" ]; then 169bf4a254eSmrg if [ x"$client" = x ] && [ x"$clientargs" = x ]; then 170a73027baSmrg client="$1" 171a73027baSmrg else 172a73027baSmrg clientargs="$clientargs $1" 173a73027baSmrg fi 174a73027baSmrg else 175bf4a254eSmrg if [ x"$server" = x ] && [ x"$serverargs" = x ]; then 176a73027baSmrg server="$1" 177a73027baSmrg else 178a73027baSmrg serverargs="$serverargs $1" 179a73027baSmrg fi 180a73027baSmrg fi 181a73027baSmrg ;; 182a73027baSmrg --) 183a73027baSmrg whoseargs="server" 184a73027baSmrg ;; 185a73027baSmrg *) 186a73027baSmrg if [ "$whoseargs" = "client" ]; then 187a73027baSmrg clientargs="$clientargs $1" 188a73027baSmrg else 189a73027baSmrg XCOMM display must be the FIRST server argument 190a73027baSmrg if [ x"$serverargs" = x ] && @@ 191a73027baSmrg expr "$1" : ':[0-9][0-9]*$' > /dev/null 2>&1; then 192a73027baSmrg display="$1" 193a73027baSmrg else 194a73027baSmrg serverargs="$serverargs $1" 195a73027baSmrg fi 196a73027baSmrg fi 197a73027baSmrg ;; 198a73027baSmrg esac 199a73027baSmrg shift 200a73027baSmrgdone 201a73027baSmrg 202a73027baSmrgXCOMM process client arguments 203a73027baSmrgif [ x"$client" = x ]; then 20472e81212Smrg client=$defaultclient 20572e81212Smrg 2061b180c10Smrg XCOMM For compatibility reasons, only use startxrc if there were no client command line arguments 207a73027baSmrg if [ x"$clientargs" = x ]; then 20872e81212Smrg if [ -f "$userclientrc" ]; then 20972e81212Smrg client=$userclientrc 21072e81212Smrg elif [ -f "$sysclientrc" ]; then 21172e81212Smrg client=$sysclientrc 21272e81212Smrg#if defined(__SCO__) || defined(__UNIXWARE__) 21372e81212Smrg elif [ -f "$scouserclientrc" ]; then 21472e81212Smrg client=$scouserclientrc 21572e81212Smrg elif [ -f "$scosysclientrc" ]; then 21672e81212Smrg client=$scosysclientrc 21772e81212Smrg#endif 21872e81212Smrg fi 219a73027baSmrg fi 220a73027baSmrgfi 221a73027baSmrg 2221b180c10SmrgXCOMM if no client arguments, use defaults 2231b180c10Smrgif [ x"$clientargs" = x ]; then 2241b180c10Smrg clientargs=$defaultclientargs 2251b180c10Smrgfi 2261b180c10Smrg 227a73027baSmrgXCOMM process server arguments 228a73027baSmrgif [ x"$server" = x ]; then 229a73027baSmrg server=$defaultserver 230a73027baSmrg 2311b180c10Smrg XCOMM For compatibility reasons, only use xserverrc if there were no server command line arguments 232a73027baSmrg if [ x"$serverargs" = x -a x"$display" = x ]; then 23372e81212Smrg if [ -f "$userserverrc" ]; then 234a73027baSmrg server=$userserverrc 23572e81212Smrg elif [ -f "$sysserverrc" ]; then 236a73027baSmrg server=$sysserverrc 237a73027baSmrg fi 238a73027baSmrg fi 239a73027baSmrgfi 240a73027baSmrg 2411b180c10SmrgXCOMM if no server arguments, use defaults 2421b180c10Smrgif [ x"$serverargs" = x ]; then 2431b180c10Smrg serverargs=$defaultserverargs 2441b180c10Smrgfi 2451b180c10Smrg 2461b180c10SmrgXCOMM if no display, use default 2471b180c10Smrgif [ x"$display" = x ]; then 2481b180c10Smrg display=$defaultdisplay 2491b180c10Smrgfi 2501b180c10Smrg 251a73027baSmrgif [ x"$enable_xauth" = x1 ] ; then 252a73027baSmrg if [ x"$XAUTHORITY" = x ]; then 253a73027baSmrg XAUTHORITY=$HOME/.Xauthority 254a73027baSmrg export XAUTHORITY 255a73027baSmrg fi 256a73027baSmrg 257a73027baSmrg removelist= 258a73027baSmrg 259a73027baSmrg XCOMM set up default Xauth info for this machine 260a73027baSmrg case `uname` in 261a73027baSmrg Linux*) 262a73027baSmrg if [ -z "`hostname --version 2>&1 | grep GNU`" ]; then 263a73027baSmrg hostname=`hostname -f` 264a73027baSmrg else 265a73027baSmrg hostname=`hostname` 266a73027baSmrg fi 267a73027baSmrg ;; 268a73027baSmrg *) 269a73027baSmrg hostname=`hostname` 270a73027baSmrg ;; 271a73027baSmrg esac 272a73027baSmrg 273a73027baSmrg authdisplay=${display:-:0} 274a73027baSmrg#if defined(HAS_COOKIE_MAKER) && defined(MK_COOKIE) 275a73027baSmrg mcookie=`MK_COOKIE` 276a73027baSmrg#else 277a73027baSmrg if [ -r /dev/urandom ]; then 278a73027baSmrg mcookie=`dd if=/dev/urandom bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"` 279a73027baSmrg else 280a73027baSmrg mcookie=`dd if=/dev/random bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"` 281a73027baSmrg fi 282a73027baSmrg#endif 283a73027baSmrg if test x"$mcookie" = x; then 284a73027baSmrg echo "Couldn't create cookie" 285a73027baSmrg exit 1 286a73027baSmrg fi 287a73027baSmrg dummy=0 288a73027baSmrg 289a73027baSmrg XCOMM create a file with auth information for the server. ':0' is a dummy. 290a73027baSmrg xserverauthfile=$HOME/.serverauth.$$ 29172e81212Smrg trap "rm -f '$xserverauthfile'" HUP INT QUIT ILL TRAP KILL BUS TERM 29272e81212Smrg xauth -q -f "$xserverauthfile" << EOF 293a73027baSmrgadd :$dummy . $mcookie 294a73027baSmrgEOF 295bf4a254eSmrg#if defined(__APPLE__) || defined(__CYGWIN__) 29629004570Smrg xserverauthfilequoted=$(echo ${xserverauthfile} | sed "s/'/'\\\\''/g") 29729004570Smrg serverargs=${serverargs}" -auth '"${xserverauthfilequoted}"'" 29872e81212Smrg#else 299a73027baSmrg serverargs=${serverargs}" -auth "${xserverauthfile} 30072e81212Smrg#endif 301a73027baSmrg 302a73027baSmrg XCOMM now add the same credentials to the client authority file 303a73027baSmrg XCOMM if '$displayname' already exists do not overwrite it as another 304a73027baSmrg XCOMM server man need it. Add them to the '$xserverauthfile' instead. 305a73027baSmrg for displayname in $authdisplay $hostname$authdisplay; do 306a73027baSmrg authcookie=`XAUTH list "$displayname" @@ 307a73027baSmrg | sed -n "s/.*$displayname[[:space:]*].*[[:space:]*]//p"` 2>/dev/null; 308a73027baSmrg if [ "z${authcookie}" = "z" ] ; then 309a73027baSmrg XAUTH -q << EOF 310a73027baSmrgadd $displayname . $mcookie 311a73027baSmrgEOF 312a73027baSmrg removelist="$displayname $removelist" 313a73027baSmrg else 314a73027baSmrg dummy=$(($dummy+1)); 31572e81212Smrg XAUTH -q -f "$xserverauthfile" << EOF 316a73027baSmrgadd :$dummy . $authcookie 317a73027baSmrgEOF 318a73027baSmrg fi 319a73027baSmrg done 320a73027baSmrgfi 321a73027baSmrg 322a73027baSmrg#if defined(__SCO__) || defined(__UNIXWARE__) 323a73027baSmrgif [ "$REMOTE_SERVER" = "TRUE" ]; then 324a73027baSmrg exec SHELL_CMD ${client} 325a73027baSmrgelse 32672e81212Smrg XINIT "$client" $clientargs -- "$server" $display $serverargs 327a73027baSmrgfi 328a73027baSmrg#else 32972e81212Smrg 330bf4a254eSmrg#if defined(__APPLE__) || defined(__CYGWIN__) 33172e81212Smrgeval XINIT \"$client\" $clientargs -- \"$server\" $display $serverargs 33272e81212Smrg#else 33372e81212SmrgXINIT "$client" $clientargs -- "$server" $display $serverargs 33472e81212Smrg#endif 33572e81212Smrg 336a73027baSmrg#endif 337bf4a254eSmrgretval=$? 338a73027baSmrg 339a73027baSmrgif [ x"$enable_xauth" = x1 ] ; then 340a73027baSmrg if [ x"$removelist" != x ]; then 341a73027baSmrg XAUTH remove $removelist 342a73027baSmrg fi 343a73027baSmrg if [ x"$xserverauthfile" != x ]; then 34472e81212Smrg rm -f "$xserverauthfile" 345a73027baSmrg fi 346a73027baSmrgfi 347a73027baSmrg 348a73027baSmrg/* 349a73027baSmrg * various machines need special cleaning up 350a73027baSmrg */ 351a73027baSmrg#ifdef __linux__ 352a73027baSmrgif command -v deallocvt > /dev/null 2>&1; then 353a73027baSmrg deallocvt 354a73027baSmrgfi 355a73027baSmrg#endif 356a73027baSmrg 357a73027baSmrg#ifdef macII 358a73027baSmrgXrepair 359a73027baSmrgscreenrestore 360a73027baSmrg#endif 361a73027baSmrg 362a73027baSmrg#if defined(sun) 363a73027baSmrgkbd_mode -a 364a73027baSmrg#endif 365bf4a254eSmrg 366bf4a254eSmrgexit $retval 367bf4a254eSmrg 368