startx.cpp revision ac57ed83
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 15ac57ed83Smrgxinitdir=XINITDIR 16ac57ed83Smrgxterm=XTERM 17ac57ed83Smrgxserver=XSERVER 18ac57ed83Smrgxinit=XINIT 19ac57ed83Smrgbundle_id_prefix=BUNDLE_ID_PREFIX 20ac57ed83Smrgxauth=XAUTH 21ac57ed83Smrgbindir=__bindir__ 22ac57ed83Smrglibexecdir=__libexecdir__ 23ac57ed83Smrgmk_cookie=MK_COOKIE 24ac57ed83Smrghas_cookie_maker=HAS_COOKIE_MAKER 25ac57ed83Smrg 26a73027baSmrgunset SESSION_MANAGER 27a73027baSmrg 28ac57ed83Smrgif [ "$(uname -s)" = "Darwin" ] ; then 29a73027baSmrg 30ac57ed83Smrg XCOMM Check for /usr/bin/X11 and BINDIR in the path, if not add them. 31ac57ed83Smrg XCOMM This allows startx to be placed in a place like /usr/bin or /usr/local/bin 32ac57ed83Smrg XCOMM and people may use X without changing their PATH. 33ac57ed83Smrg XCOMM Note that we put our own bin directory at the front of the path, and 34ac57ed83Smrg XCOMM the standard system path at the back, since if you are using the Xorg 35ac57ed83Smrg XCOMM server there's a pretty good chance you want to bias the Xorg clients 36ac57ed83Smrg XCOMM over the old system's clients. 37a73027baSmrg 38ac57ed83Smrg case $PATH in 39ac57ed83Smrg *:$bindir | *:$bindir:* | $bindir:*) ;; 40ac57ed83Smrg *) PATH=$bindir:$PATH ;; 41ac57ed83Smrg esac 42a73027baSmrg 43ac57ed83Smrg XCOMM Now the "old" compiled path 44ac57ed83Smrg oldbindir=/usr/X11R6/bin 45a73027baSmrg 46ac57ed83Smrg if [ -d "$oldbindir" ] ; then 47ac57ed83Smrg case $PATH in 48ac57ed83Smrg *:$oldbindir | *:$oldbindir:* | $oldbindir:*) ;; 49ac57ed83Smrg *) PATH=$PATH:$oldbindir ;; 50ac57ed83Smrg esac 51ac57ed83Smrg fi 52a73027baSmrg 53ac57ed83Smrg XCOMM Bourne shell does not automatically export modified environment variables 54ac57ed83Smrg XCOMM so export the new PATH just in case the user changes the shell 55ac57ed83Smrg export PATH 56a73027baSmrgfi 57a73027baSmrg 58a73027baSmrguserclientrc=$HOME/.xinitrc 597aed6334Smrg[ -f "${XINITRC}" ] && userclientrc="${XINITRC}" 60a73027baSmrgsysclientrc=XINITDIR/xinitrc 61a73027baSmrg 62a73027baSmrguserserverrc=$HOME/.xserverrc 63ac57ed83Smrg[ -f "${XSERVERRC}" ] && userserverrc="${XSERVERRC}" 64ac57ed83Smrgsysserverrc=$xinitdir/xserverrc 65ac57ed83Smrgdefaultclient=$xterm 66ac57ed83Smrgdefaultserver=$xserver 67a73027baSmrgdefaultclientargs="" 68040e9fe7Smartindefaultserverargs="-noretro" 69d712a854Smrgdefaultdisplay="" 70a73027baSmrgclientargs="" 71a73027baSmrgserverargs="" 7241667ceaSmrgvtarg="" 73a73027baSmrg 74a73027baSmrg 75ac57ed83Smrgif [ "$(uname -s)" = "Darwin" ] ; then 7672e81212Smrg 77ac57ed83Smrg if [ "$X11_PREFS_DOMAIN" = "" ] ; then 78ac57ed83Smrg export X11_PREFS_DOMAIN=$bundle_id_prefix".X11" 79ac57ed83Smrg fi 80a73027baSmrg 81ac57ed83Smrg XCOMM Initialize defaults (this will cut down on "safe" error messages) 82ac57ed83Smrg if ! defaults read $X11_PREFS_DOMAIN cache_fonts > /dev/null 2>&1 ; then 83ac57ed83Smrg defaults write $X11_PREFS_DOMAIN cache_fonts -bool true 84ac57ed83Smrg fi 85a73027baSmrg 86ac57ed83Smrg if ! defaults read $X11_PREFS_DOMAIN no_auth > /dev/null 2>&1 ; then 87ac57ed83Smrg defaults write $X11_PREFS_DOMAIN no_auth -bool false 88ac57ed83Smrg fi 89a73027baSmrg 90ac57ed83Smrg if ! defaults read $X11_PREFS_DOMAIN nolisten_tcp > /dev/null 2>&1 ; then 91ac57ed83Smrg defaults write $X11_PREFS_DOMAIN nolisten_tcp -bool true 92ac57ed83Smrg fi 93d712a854Smrg 94ac57ed83Smrg if ! defaults read $X11_PREFS_DOMAIN enable_iglx > /dev/null 2>&1 ; then 95ac57ed83Smrg defaults write $X11_PREFS_DOMAIN enable_iglx -bool false 96a73027baSmrg fi 97a73027baSmrg 98ac57ed83Smrg XCOMM First, start caching fonts 99ac57ed83Smrg if [ "$(defaults read $X11_PREFS_DOMAIN cache_fonts)" = 1 ] ; then 100ac57ed83Smrg if [ -x $bindir/font_cache ] ; then 101ac57ed83Smrg $bindir/font_cache 102ac57ed83Smrg elif [ -x $bindir/font_cache.sh ] ; then 103ac57ed83Smrg $bindir/font_cache.sh 104ac57ed83Smrg elif [ -x $bindir/fc-cache ] ; then 105ac57ed83Smrg $bindir/fc-cache 106ac57ed83Smrg fi 107ac57ed83Smrg fi 108ac57ed83Smrg 109ac57ed83Smrg if [ -x $libexecdir/privileged_startx ] ; then 1107aed6334Smrg XCOMM Don't push this into the background because it can cause 1117aed6334Smrg XCOMM a race to create /tmp/.X11-unix 112ac57ed83Smrg $libexecdir/privileged_startx 113ac57ed83Smrg fi 114a73027baSmrg 115ac57ed83Smrg if [ "$(defaults read $X11_PREFS_DOMAIN no_auth)" = 0 ] ; then 116ac57ed83Smrg enable_xauth=1 117ac57ed83Smrg else 118ac57ed83Smrg enable_xauth=0 119ac57ed83Smrg fi 120a73027baSmrg 121ac57ed83Smrg if [ "$(defaults read $X11_PREFS_DOMAIN nolisten_tcp)" = 1 ] ; then 122ac57ed83Smrg defaultserverargs="$defaultserverargs -nolisten tcp" 123ac57ed83Smrg else 124ac57ed83Smrg defaultserverargs="$defaultserverargs -listen tcp" 125ac57ed83Smrg fi 126d712a854Smrg 127ac57ed83Smrg if [ "$(defaults read $X11_PREFS_DOMAIN enable_iglx)" = 1 ] ; then 128ac57ed83Smrg defaultserverargs="$defaultserverargs +iglx +extension GLX" 129ac57ed83Smrg else 130ac57ed83Smrg defaultserverargs="$defaultserverargs -iglx" 131ac57ed83Smrg fi 132a73027baSmrg 133ac57ed83Smrg XCOMM The second check is the real one. The first is to hopefully avoid 134ac57ed83Smrg XCOMM needless syslog spamming. 135ac57ed83Smrg if defaults read $X11_PREFS_DOMAIN 2> /dev/null | grep -q 'dpi' && defaults read $X11_PREFS_DOMAIN dpi > /dev/null 2>&1 ; then 136ac57ed83Smrg defaultserverargs="$defaultserverargs -dpi $(defaults read $X11_PREFS_DOMAIN dpi)" 137ac57ed83Smrg fi 13872e81212Smrg 139ac57ed83Smrgelse 140ac57ed83Smrg enable_xauth=1 141ac57ed83Smrgfi 1421b180c10Smrg 1431b180c10SmrgXCOMM Automatically determine an unused $DISPLAY 14429004570Smrgd=0 14529004570Smrgwhile true ; do 146d712a854Smrg [ -e "/tmp/.X$d-lock" -o -S "/tmp/.X11-unix/X$d" ] || break 14729004570Smrg d=$(($d + 1)) 148a73027baSmrgdone 149a73027baSmrgdefaultdisplay=":$d" 15029004570Smrgunset d 151a73027baSmrg 152a73027baSmrgwhoseargs="client" 153ac57ed83Smrgwhile [ "$1" != "" ]; do 154a73027baSmrg case "$1" in 155a73027baSmrg XCOMM '' required to prevent cpp from treating "/*" as a C comment. 156a73027baSmrg /''*|\./''*) 157a73027baSmrg if [ "$whoseargs" = "client" ]; then 158ac57ed83Smrg if [ "$client" = "" ] && [ "$clientargs" = "" ]; then 159a73027baSmrg client="$1" 160a73027baSmrg else 161a73027baSmrg clientargs="$clientargs $1" 162a73027baSmrg fi 163a73027baSmrg else 164ac57ed83Smrg if [ "$server" = "" ] && [ "$serverargs" = "" ]; then 165a73027baSmrg server="$1" 166a73027baSmrg else 167a73027baSmrg serverargs="$serverargs $1" 168a73027baSmrg fi 169a73027baSmrg fi 170a73027baSmrg ;; 171a73027baSmrg --) 172a73027baSmrg whoseargs="server" 173a73027baSmrg ;; 174a73027baSmrg *) 175a73027baSmrg if [ "$whoseargs" = "client" ]; then 176a73027baSmrg clientargs="$clientargs $1" 177a73027baSmrg else 178a73027baSmrg XCOMM display must be the FIRST server argument 179ac57ed83Smrg if [ "$serverargs" = "" ] && @@ 180a73027baSmrg expr "$1" : ':[0-9][0-9]*$' > /dev/null 2>&1; then 181a73027baSmrg display="$1" 182a73027baSmrg else 183a73027baSmrg serverargs="$serverargs $1" 184a73027baSmrg fi 185a73027baSmrg fi 186a73027baSmrg ;; 187a73027baSmrg esac 188a73027baSmrg shift 189a73027baSmrgdone 190a73027baSmrg 191a73027baSmrgXCOMM process client arguments 192ac57ed83Smrgif [ "$client" = "" ]; then 19372e81212Smrg client=$defaultclient 19472e81212Smrg 1951b180c10Smrg XCOMM For compatibility reasons, only use startxrc if there were no client command line arguments 196ac57ed83Smrg if [ "$clientargs" = "" ]; then 19772e81212Smrg if [ -f "$userclientrc" ]; then 19872e81212Smrg client=$userclientrc 19972e81212Smrg elif [ -f "$sysclientrc" ]; then 20072e81212Smrg client=$sysclientrc 20172e81212Smrg fi 202a73027baSmrg fi 203a73027baSmrgfi 204a73027baSmrg 2051b180c10SmrgXCOMM if no client arguments, use defaults 206ac57ed83Smrgif [ "$clientargs" = "" ]; then 2071b180c10Smrg clientargs=$defaultclientargs 2081b180c10Smrgfi 2091b180c10Smrg 210a73027baSmrgXCOMM process server arguments 211ac57ed83Smrgif [ "$server" = "" ]; then 212a73027baSmrg server=$defaultserver 213a73027baSmrg 214ac57ed83Smrgif [ "$(uname -s)" = "Linux" ] ; then 21541667ceaSmrg XCOMM When starting the defaultserver start X on the current tty to avoid 21641667ceaSmrg XCOMM the startx session being seen as inactive: 21741667ceaSmrg XCOMM "https://bugzilla.redhat.com/show_bug.cgi?id=806491" 21841667ceaSmrg tty=$(tty) 219d712a854Smrg if expr "$tty" : '/dev/tty[0-9][0-9]*$' > /dev/null; then 2207aed6334Smrg tty_num=${tty#/dev/tty} 221d712a854Smrg vtarg="vt$tty_num -keeptty" 22241667ceaSmrg fi 223ac57ed83Smrgfi 22441667ceaSmrg 2251b180c10Smrg XCOMM For compatibility reasons, only use xserverrc if there were no server command line arguments 226ac57ed83Smrg if [ "$serverargs" = "" ] && [ "$display" = "" ]; then 22772e81212Smrg if [ -f "$userserverrc" ]; then 228a73027baSmrg server=$userserverrc 22972e81212Smrg elif [ -f "$sysserverrc" ]; then 230a73027baSmrg server=$sysserverrc 231a73027baSmrg fi 232a73027baSmrg fi 233a73027baSmrgfi 234a73027baSmrg 2351b180c10SmrgXCOMM if no server arguments, use defaults 236ac57ed83Smrgif [ "$serverargs" = "" ]; then 2371b180c10Smrg serverargs=$defaultserverargs 2381b180c10Smrgfi 2391b180c10Smrg 24041667ceaSmrgXCOMM if no vt is specified add vtarg (which may be empty) 24141667ceaSmrghave_vtarg="no" 24241667ceaSmrgfor i in $serverargs; do 2435dda8871Swiz if expr "$i" : 'vt[0-9][0-9]*$' > /dev/null; then 24441667ceaSmrg have_vtarg="yes" 24541667ceaSmrg fi 24641667ceaSmrgdone 24741667ceaSmrgif [ "$have_vtarg" = "no" ]; then 24841667ceaSmrg serverargs="$serverargs $vtarg" 24941667ceaSmrgfi 25041667ceaSmrg 2511b180c10SmrgXCOMM if no display, use default 252ac57ed83Smrgif [ "$display" = "" ]; then 2531b180c10Smrg display=$defaultdisplay 2541b180c10Smrgfi 2551b180c10Smrg 256ac57ed83Smrgif [ "$enable_xauth" = 1 ] ; then 257ac57ed83Smrg if [ "$XAUTHORITY" = "" ]; then 258a73027baSmrg XAUTHORITY=$HOME/.Xauthority 259a73027baSmrg export XAUTHORITY 260a73027baSmrg fi 261a73027baSmrg 262a73027baSmrg removelist= 263a73027baSmrg 264a73027baSmrg XCOMM set up default Xauth info for this machine 265ac57ed83Smrg hostname="$(uname -n)" 266a73027baSmrg 267a73027baSmrg authdisplay=${display:-:0} 268ac57ed83Smrg if [ -n "$has_cookie_maker" ] && [ -n "$mk_cookie" ] ; then 269ac57ed83Smrg mcookie=$($mk_cookie) 270a73027baSmrg else 271ac57ed83Smrg if [ -r /dev/urandom ]; then 272ac57ed83Smrg mcookie=$(dd if=dev/urandom bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\") 273ac57ed83Smrg else 274ac57ed83Smrg mcookie=$(dd if=/dev/random bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\") 275ac57ed83Smrg fi 276a73027baSmrg fi 277ac57ed83Smrg if [ "$mcookie" = "" ]; then 278a73027baSmrg echo "Couldn't create cookie" 279a73027baSmrg exit 1 280a73027baSmrg fi 281a73027baSmrg dummy=0 282a73027baSmrg 283a73027baSmrg XCOMM create a file with auth information for the server. ':0' is a dummy. 284a73027baSmrg xserverauthfile=$HOME/.serverauth.$$ 285a8eb8bc0Snia trap "rm -f '$xserverauthfile'" HUP INT QUIT ILL TRAP BUS TERM 28672e81212Smrg xauth -q -f "$xserverauthfile" << EOF 287a73027baSmrgadd :$dummy . $mcookie 288a73027baSmrgEOF 289ac57ed83Smrg 290ac57ed83Smrg case "$(uname -s)" in 291ac57ed83Smrg CYGWIN*|Darwin) 292ac57ed83Smrg xserverauthfilequoted=$(echo ${xserverauthfile} | sed "s/'/'\\\\''/g") 293ac57ed83Smrg serverargs=${serverargs}" -auth '"${xserverauthfilequoted}"'" 294ac57ed83Smrg ;; 295ac57ed83Smrg *) 296ac57ed83Smrg serverargs=${serverargs}" -auth "${xserverauthfile} 297ac57ed83Smrg ;; 298ac57ed83Smrg esac 299a73027baSmrg 300a73027baSmrg XCOMM now add the same credentials to the client authority file 301a73027baSmrg XCOMM if '$displayname' already exists do not overwrite it as another 302d712a854Smrg XCOMM server may need it. Add them to the '$xserverauthfile' instead. 303a73027baSmrg for displayname in $authdisplay $hostname$authdisplay; do 304ac57ed83Smrg authcookie=$(xauth list "$displayname" @@ 305ac57ed83Smrg | sed -n 's/.*'"$displayname"'[[:space:]*].*[[:space:]*]//p' 2>/dev/null); 306a73027baSmrg if [ "z${authcookie}" = "z" ] ; then 307ac57ed83Smrg $xauth -q << EOF 308a73027baSmrgadd $displayname . $mcookie 309a73027baSmrgEOF 310a73027baSmrg removelist="$displayname $removelist" 311a73027baSmrg else 312a73027baSmrg dummy=$(($dummy+1)); 313ac57ed83Smrg $xauth -q -f "$xserverauthfile" << EOF 314a73027baSmrgadd :$dummy . $authcookie 315a73027baSmrgEOF 316a73027baSmrg fi 317a73027baSmrg done 318a73027baSmrgfi 319a73027baSmrg 320ac57ed83Smrgcase "$(uname -s)" in 321ac57ed83SmrgCYGWIN_NT*|Darwin) 322ac57ed83Smrg eval $xinit \"$client\" $clientargs -- \"$server\" $display $serverargs 323ac57ed83Smrg ;; 324ac57ed83Smrg*) 325ac57ed83Smrg $xinit "$client" $clientargs -- "$server" $display $serverargs 326ac57ed83Smrg ;; 327ac57ed83Smrgesac 328bf4a254eSmrgretval=$? 329a73027baSmrg 330ac57ed83Smrgif [ "$enable_xauth" = 1 ] ; then 331ac57ed83Smrg if [ "$removelist" != "" ]; then 332ac57ed83Smrg $xauth remove $removelist 333a73027baSmrg fi 334ac57ed83Smrg if [ "$xserverauthfile" != "" ]; then 33572e81212Smrg rm -f "$xserverauthfile" 336a73027baSmrg fi 337a73027baSmrgfi 338a73027baSmrg 339ac57ed83SmrgXCOMM various machines need special cleaning up 340ac57ed83Smrgif [ "$(uname -s)" = "Linux" ]; then 341ac57ed83Smrg if command -v deallocvt > /dev/null 2>&1; then 342ac57ed83Smrg deallocvt 343ac57ed83Smrg fi 344a73027baSmrgfi 345a73027baSmrg 346ac57ed83Smrgif [ "$(uname -s)" = "SunOS" ]; then 347ac57ed83Smrg kbd_mode -a 348ac57ed83Smrgfi 349bf4a254eSmrg 350bf4a254eSmrgexit $retval 351