startx.cpp revision 7aed6334
1a73027baSmrgXCOMM!SHELL_CMD 2a73027baSmrg 3a73027baSmrgXCOMM 4a73027baSmrgXCOMM This is just a sample implementation of a slightly less primitive 57aed6334SmrgXCOMM interface than xinit. It looks for XINITRC and XSERVERRC environment 67aed6334SmrgXCOMM variables, then user .xinitrc and .xserverrc files, and then system 77aed6334SmrgXCOMM xinitrc and xserverrc files, else lets xinit choose its default. 87aed6334SmrgXCOMM The system xinitrc should probably do things like check for 97aed6334SmrgXCOMM .Xresources files and merge them in, start up a window manager, and 107aed6334SmrgXCOMM pop a clock and several xterms. 11a73027baSmrgXCOMM 12a73027baSmrgXCOMM Site administrators are STRONGLY urged to write nicer versions. 13a73027baSmrgXCOMM 14a73027baSmrg 15a73027baSmrgunset SESSION_MANAGER 16a73027baSmrg 1741667ceaSmrg#ifdef __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 36a73027baSmrgoldbindir=/usr/X11R6/bin 37a73027baSmrg 38a73027baSmrgif [ -d "$oldbindir" ] ; then 39a73027baSmrg case $PATH in 40a73027baSmrg *:$oldbindir | *:$oldbindir:* | $oldbindir:*) ;; 41a73027baSmrg *) PATH=$PATH:$oldbindir ;; 42a73027baSmrg esac 43a73027baSmrgfi 44a73027baSmrg 45a73027baSmrgXCOMM Bourne shell does not automatically export modified environment variables 46a73027baSmrgXCOMM so export the new PATH just in case the user changes the shell 47a73027baSmrgexport PATH 48a73027baSmrg#endif 49a73027baSmrg 50a73027baSmrguserclientrc=$HOME/.xinitrc 517aed6334Smrg[ -f "${XINITRC}" ] && userclientrc="${XINITRC}" 52a73027baSmrgsysclientrc=XINITDIR/xinitrc 53a73027baSmrg 54a73027baSmrguserserverrc=$HOME/.xserverrc 557aed6334Smrg[ -f "${XSERVERRC}" ] && userclientrc="${XSERVERRC}" 56a73027baSmrgsysserverrc=XINITDIR/xserverrc 57a73027baSmrgdefaultclient=XTERM 58a73027baSmrgdefaultserver=XSERVER 59a73027baSmrgdefaultclientargs="" 60040e9fe7Smartindefaultserverargs="-noretro" 61d712a854Smrgdefaultdisplay="" 62a73027baSmrgclientargs="" 63a73027baSmrgserverargs="" 6441667ceaSmrgvtarg="" 65a73027baSmrg 66a73027baSmrg#ifdef __APPLE__ 67a73027baSmrg 6872e81212Smrgif [ "x$X11_PREFS_DOMAIN" = x ] ; then 69c81d8f5eSmrg export X11_PREFS_DOMAIN=BUNDLE_ID_PREFIX".X11" 7072e81212Smrgfi 7172e81212Smrg 72a73027baSmrgXCOMM Initialize defaults (this will cut down on "safe" error messages) 7329004570Smrgif ! defaults read $X11_PREFS_DOMAIN cache_fonts > /dev/null 2>&1 ; then 7472e81212Smrg defaults write $X11_PREFS_DOMAIN cache_fonts -bool true 75a73027baSmrgfi 76a73027baSmrg 7729004570Smrgif ! defaults read $X11_PREFS_DOMAIN no_auth > /dev/null 2>&1 ; then 7872e81212Smrg defaults write $X11_PREFS_DOMAIN no_auth -bool false 79a73027baSmrgfi 80a73027baSmrg 8129004570Smrgif ! defaults read $X11_PREFS_DOMAIN nolisten_tcp > /dev/null 2>&1 ; then 8272e81212Smrg defaults write $X11_PREFS_DOMAIN nolisten_tcp -bool true 83a73027baSmrgfi 84a73027baSmrg 85d712a854Smrgif ! defaults read $X11_PREFS_DOMAIN enable_iglx > /dev/null 2>&1 ; then 86d712a854Smrg defaults write $X11_PREFS_DOMAIN enable_iglx -bool false 87d712a854Smrgfi 88d712a854Smrg 89a73027baSmrgXCOMM First, start caching fonts 9072e81212Smrgif [ x`defaults read $X11_PREFS_DOMAIN cache_fonts` = x1 ] ; then 9172e81212Smrg if [ -x $bindir/font_cache ] ; then 927aed6334Smrg $bindir/font_cache 9372e81212Smrg elif [ -x $bindir/font_cache.sh ] ; then 947aed6334Smrg $bindir/font_cache.sh 9572e81212Smrg elif [ -x $bindir/fc-cache ] ; then 967aed6334Smrg $bindir/fc-cache 97a73027baSmrg fi 98a73027baSmrgfi 99a73027baSmrg 100d712a854Smrgif [ -x __libexecdir__/privileged_startx ] ; then 1017aed6334Smrg XCOMM Don't push this into the background because it can cause 1027aed6334Smrg XCOMM a race to create /tmp/.X11-unix 103d712a854Smrg __libexecdir__/privileged_startx 104a73027baSmrgfi 105a73027baSmrg 10672e81212Smrgif [ x`defaults read $X11_PREFS_DOMAIN no_auth` = x0 ] ; then 107a73027baSmrg enable_xauth=1 108a73027baSmrgelse 109a73027baSmrg enable_xauth=0 110a73027baSmrgfi 111a73027baSmrg 11272e81212Smrgif [ x`defaults read $X11_PREFS_DOMAIN nolisten_tcp` = x1 ] ; then 113a73027baSmrg defaultserverargs="$defaultserverargs -nolisten tcp" 114d712a854Smrgelse 115d712a854Smrg defaultserverargs="$defaultserverargs -listen tcp" 116d712a854Smrgfi 117d712a854Smrg 118d712a854Smrgif [ x`defaults read $X11_PREFS_DOMAIN enable_iglx` = x1 ] ; then 1197aed6334Smrg defaultserverargs="$defaultserverargs +iglx +extension GLX" 120d712a854Smrgelse 121d712a854Smrg defaultserverargs="$defaultserverargs -iglx" 122a73027baSmrgfi 123a73027baSmrg 12436ffeb23SmrgXCOMM The second check is the real one. The first is to hopefully avoid 12536ffeb23SmrgXCOMM needless syslog spamming. 12636ffeb23Smrgif defaults read $X11_PREFS_DOMAIN 2> /dev/null | grep -q 'dpi' && defaults read $X11_PREFS_DOMAIN dpi > /dev/null 2>&1 ; then 12772e81212Smrg defaultserverargs="$defaultserverargs -dpi `defaults read $X11_PREFS_DOMAIN dpi`" 12872e81212Smrgfi 12972e81212Smrg 1301b180c10Smrg#else 1311b180c10Smrgenable_xauth=1 1321b180c10Smrg#endif 1331b180c10Smrg 1341b180c10SmrgXCOMM Automatically determine an unused $DISPLAY 13529004570Smrgd=0 13629004570Smrgwhile true ; do 137d712a854Smrg [ -e "/tmp/.X$d-lock" -o -S "/tmp/.X11-unix/X$d" ] || break 13829004570Smrg d=$(($d + 1)) 139a73027baSmrgdone 140a73027baSmrgdefaultdisplay=":$d" 14129004570Smrgunset d 142a73027baSmrg 143a73027baSmrgwhoseargs="client" 144a73027baSmrgwhile [ x"$1" != x ]; do 145a73027baSmrg case "$1" in 146a73027baSmrg XCOMM '' required to prevent cpp from treating "/*" as a C comment. 147a73027baSmrg /''*|\./''*) 148a73027baSmrg if [ "$whoseargs" = "client" ]; then 149bf4a254eSmrg if [ x"$client" = x ] && [ x"$clientargs" = x ]; then 150a73027baSmrg client="$1" 151a73027baSmrg else 152a73027baSmrg clientargs="$clientargs $1" 153a73027baSmrg fi 154a73027baSmrg else 155bf4a254eSmrg if [ x"$server" = x ] && [ x"$serverargs" = x ]; then 156a73027baSmrg server="$1" 157a73027baSmrg else 158a73027baSmrg serverargs="$serverargs $1" 159a73027baSmrg fi 160a73027baSmrg fi 161a73027baSmrg ;; 162a73027baSmrg --) 163a73027baSmrg whoseargs="server" 164a73027baSmrg ;; 165a73027baSmrg *) 166a73027baSmrg if [ "$whoseargs" = "client" ]; then 167a73027baSmrg clientargs="$clientargs $1" 168a73027baSmrg else 169a73027baSmrg XCOMM display must be the FIRST server argument 170a73027baSmrg if [ x"$serverargs" = x ] && @@ 171a73027baSmrg expr "$1" : ':[0-9][0-9]*$' > /dev/null 2>&1; then 172a73027baSmrg display="$1" 173a73027baSmrg else 174a73027baSmrg serverargs="$serverargs $1" 175a73027baSmrg fi 176a73027baSmrg fi 177a73027baSmrg ;; 178a73027baSmrg esac 179a73027baSmrg shift 180a73027baSmrgdone 181a73027baSmrg 182a73027baSmrgXCOMM process client arguments 183a73027baSmrgif [ x"$client" = x ]; then 18472e81212Smrg client=$defaultclient 18572e81212Smrg 1861b180c10Smrg XCOMM For compatibility reasons, only use startxrc if there were no client command line arguments 187a73027baSmrg if [ x"$clientargs" = x ]; then 18872e81212Smrg if [ -f "$userclientrc" ]; then 18972e81212Smrg client=$userclientrc 19072e81212Smrg elif [ -f "$sysclientrc" ]; then 19172e81212Smrg client=$sysclientrc 19272e81212Smrg fi 193a73027baSmrg fi 194a73027baSmrgfi 195a73027baSmrg 1961b180c10SmrgXCOMM if no client arguments, use defaults 1971b180c10Smrgif [ x"$clientargs" = x ]; then 1981b180c10Smrg clientargs=$defaultclientargs 1991b180c10Smrgfi 2001b180c10Smrg 201a73027baSmrgXCOMM process server arguments 202a73027baSmrgif [ x"$server" = x ]; then 203a73027baSmrg server=$defaultserver 204a73027baSmrg 20541667ceaSmrg#ifdef __linux__ 20641667ceaSmrg XCOMM When starting the defaultserver start X on the current tty to avoid 20741667ceaSmrg XCOMM the startx session being seen as inactive: 20841667ceaSmrg XCOMM "https://bugzilla.redhat.com/show_bug.cgi?id=806491" 20941667ceaSmrg tty=$(tty) 210d712a854Smrg if expr "$tty" : '/dev/tty[0-9][0-9]*$' > /dev/null; then 2117aed6334Smrg tty_num=${tty#/dev/tty} 212d712a854Smrg vtarg="vt$tty_num -keeptty" 21341667ceaSmrg fi 21441667ceaSmrg#endif 21541667ceaSmrg 2161b180c10Smrg XCOMM For compatibility reasons, only use xserverrc if there were no server command line arguments 217a73027baSmrg if [ x"$serverargs" = x -a x"$display" = x ]; then 21872e81212Smrg if [ -f "$userserverrc" ]; then 219a73027baSmrg server=$userserverrc 22072e81212Smrg elif [ -f "$sysserverrc" ]; then 221a73027baSmrg server=$sysserverrc 222a73027baSmrg fi 223a73027baSmrg fi 224a73027baSmrgfi 225a73027baSmrg 2261b180c10SmrgXCOMM if no server arguments, use defaults 2271b180c10Smrgif [ x"$serverargs" = x ]; then 2281b180c10Smrg serverargs=$defaultserverargs 2291b180c10Smrgfi 2301b180c10Smrg 23141667ceaSmrgXCOMM if no vt is specified add vtarg (which may be empty) 23241667ceaSmrghave_vtarg="no" 23341667ceaSmrgfor i in $serverargs; do 2345dda8871Swiz if expr "$i" : 'vt[0-9][0-9]*$' > /dev/null; then 23541667ceaSmrg have_vtarg="yes" 23641667ceaSmrg fi 23741667ceaSmrgdone 23841667ceaSmrgif [ "$have_vtarg" = "no" ]; then 23941667ceaSmrg serverargs="$serverargs $vtarg" 24041667ceaSmrgfi 24141667ceaSmrg 2421b180c10SmrgXCOMM if no display, use default 2431b180c10Smrgif [ x"$display" = x ]; then 2441b180c10Smrg display=$defaultdisplay 2451b180c10Smrgfi 2461b180c10Smrg 247a73027baSmrgif [ x"$enable_xauth" = x1 ] ; then 248a73027baSmrg if [ x"$XAUTHORITY" = x ]; then 249a73027baSmrg XAUTHORITY=$HOME/.Xauthority 250a73027baSmrg export XAUTHORITY 251a73027baSmrg fi 252a73027baSmrg 253a73027baSmrg removelist= 254a73027baSmrg 255a73027baSmrg XCOMM set up default Xauth info for this machine 2567aed6334Smrg hostname=`uname -n` 257a73027baSmrg 258a73027baSmrg authdisplay=${display:-:0} 259a73027baSmrg#if defined(HAS_COOKIE_MAKER) && defined(MK_COOKIE) 260a73027baSmrg mcookie=`MK_COOKIE` 261a73027baSmrg#else 262a73027baSmrg if [ -r /dev/urandom ]; then 263a73027baSmrg mcookie=`dd if=/dev/urandom bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"` 264a73027baSmrg else 265a73027baSmrg mcookie=`dd if=/dev/random bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"` 266a73027baSmrg fi 267a73027baSmrg#endif 268a73027baSmrg if test x"$mcookie" = x; then 269a73027baSmrg echo "Couldn't create cookie" 270a73027baSmrg exit 1 271a73027baSmrg fi 272a73027baSmrg dummy=0 273a73027baSmrg 274a73027baSmrg XCOMM create a file with auth information for the server. ':0' is a dummy. 275a73027baSmrg xserverauthfile=$HOME/.serverauth.$$ 276a8eb8bc0Snia trap "rm -f '$xserverauthfile'" HUP INT QUIT ILL TRAP BUS TERM 27772e81212Smrg xauth -q -f "$xserverauthfile" << EOF 278a73027baSmrgadd :$dummy . $mcookie 279a73027baSmrgEOF 280bf4a254eSmrg#if defined(__APPLE__) || defined(__CYGWIN__) 28129004570Smrg xserverauthfilequoted=$(echo ${xserverauthfile} | sed "s/'/'\\\\''/g") 28229004570Smrg serverargs=${serverargs}" -auth '"${xserverauthfilequoted}"'" 28372e81212Smrg#else 284a73027baSmrg serverargs=${serverargs}" -auth "${xserverauthfile} 28572e81212Smrg#endif 286a73027baSmrg 287a73027baSmrg XCOMM now add the same credentials to the client authority file 288a73027baSmrg XCOMM if '$displayname' already exists do not overwrite it as another 289d712a854Smrg XCOMM server may need it. Add them to the '$xserverauthfile' instead. 290a73027baSmrg for displayname in $authdisplay $hostname$authdisplay; do 291a73027baSmrg authcookie=`XAUTH list "$displayname" @@ 292a73027baSmrg | sed -n "s/.*$displayname[[:space:]*].*[[:space:]*]//p"` 2>/dev/null; 293a73027baSmrg if [ "z${authcookie}" = "z" ] ; then 294a73027baSmrg XAUTH -q << EOF 295a73027baSmrgadd $displayname . $mcookie 296a73027baSmrgEOF 297a73027baSmrg removelist="$displayname $removelist" 298a73027baSmrg else 299a73027baSmrg dummy=$(($dummy+1)); 30072e81212Smrg XAUTH -q -f "$xserverauthfile" << EOF 301a73027baSmrgadd :$dummy . $authcookie 302a73027baSmrgEOF 303a73027baSmrg fi 304a73027baSmrg done 305a73027baSmrgfi 306a73027baSmrg 307bf4a254eSmrg#if defined(__APPLE__) || defined(__CYGWIN__) 30872e81212Smrgeval XINIT \"$client\" $clientargs -- \"$server\" $display $serverargs 30972e81212Smrg#else 31072e81212SmrgXINIT "$client" $clientargs -- "$server" $display $serverargs 311a73027baSmrg#endif 312bf4a254eSmrgretval=$? 313a73027baSmrg 314a73027baSmrgif [ x"$enable_xauth" = x1 ] ; then 315a73027baSmrg if [ x"$removelist" != x ]; then 316a73027baSmrg XAUTH remove $removelist 317a73027baSmrg fi 318a73027baSmrg if [ x"$xserverauthfile" != x ]; then 31972e81212Smrg rm -f "$xserverauthfile" 320a73027baSmrg fi 321a73027baSmrgfi 322a73027baSmrg 323a73027baSmrg/* 324a73027baSmrg * various machines need special cleaning up 325a73027baSmrg */ 326a73027baSmrg#ifdef __linux__ 327a73027baSmrgif command -v deallocvt > /dev/null 2>&1; then 328a73027baSmrg deallocvt 329a73027baSmrgfi 330a73027baSmrg#endif 331a73027baSmrg 332a73027baSmrg#if defined(sun) 333a73027baSmrgkbd_mode -a 334a73027baSmrg#endif 335bf4a254eSmrg 336bf4a254eSmrgexit $retval 337bf4a254eSmrg 338