startx.cpp revision a8eb8bc0
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 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 51a73027baSmrgsysclientrc=XINITDIR/xinitrc 52a73027baSmrg 53a73027baSmrguserserverrc=$HOME/.xserverrc 54a73027baSmrgsysserverrc=XINITDIR/xserverrc 55a73027baSmrgdefaultclient=XTERM 56a73027baSmrgdefaultserver=XSERVER 57a73027baSmrgdefaultclientargs="" 58040e9fe7Smartindefaultserverargs="-noretro" 59d712a854Smrgdefaultdisplay="" 60a73027baSmrgclientargs="" 61a73027baSmrgserverargs="" 6241667ceaSmrgvtarg="" 63a73027baSmrg 64a73027baSmrg#ifdef __APPLE__ 65a73027baSmrg 6672e81212Smrgif [ "x$X11_PREFS_DOMAIN" = x ] ; then 67c81d8f5eSmrg export X11_PREFS_DOMAIN=BUNDLE_ID_PREFIX".X11" 6872e81212Smrgfi 6972e81212Smrg 70a73027baSmrgXCOMM Initialize defaults (this will cut down on "safe" error messages) 7129004570Smrgif ! defaults read $X11_PREFS_DOMAIN cache_fonts > /dev/null 2>&1 ; then 7272e81212Smrg defaults write $X11_PREFS_DOMAIN cache_fonts -bool true 73a73027baSmrgfi 74a73027baSmrg 7529004570Smrgif ! defaults read $X11_PREFS_DOMAIN no_auth > /dev/null 2>&1 ; then 7672e81212Smrg defaults write $X11_PREFS_DOMAIN no_auth -bool false 77a73027baSmrgfi 78a73027baSmrg 7929004570Smrgif ! defaults read $X11_PREFS_DOMAIN nolisten_tcp > /dev/null 2>&1 ; then 8072e81212Smrg defaults write $X11_PREFS_DOMAIN nolisten_tcp -bool true 81a73027baSmrgfi 82a73027baSmrg 83d712a854Smrgif ! defaults read $X11_PREFS_DOMAIN enable_iglx > /dev/null 2>&1 ; then 84d712a854Smrg defaults write $X11_PREFS_DOMAIN enable_iglx -bool false 85d712a854Smrgfi 86d712a854Smrg 87a73027baSmrgXCOMM First, start caching fonts 8872e81212Smrgif [ x`defaults read $X11_PREFS_DOMAIN cache_fonts` = x1 ] ; then 8972e81212Smrg if [ -x $bindir/font_cache ] ; then 9072e81212Smrg $bindir/font_cache & 9172e81212Smrg elif [ -x $bindir/font_cache.sh ] ; then 9272e81212Smrg $bindir/font_cache.sh & 9372e81212Smrg elif [ -x $bindir/fc-cache ] ; then 9472e81212Smrg $bindir/fc-cache & 95a73027baSmrg fi 96a73027baSmrgfi 97a73027baSmrg 98d712a854Smrgif [ -x __libexecdir__/privileged_startx ] ; then 99a73027baSmrg # Don't push this into the background becasue it can cause 100a73027baSmrg # a race to create /tmp/.X11-unix 101d712a854Smrg __libexecdir__/privileged_startx 102a73027baSmrgfi 103a73027baSmrg 10472e81212Smrgif [ x`defaults read $X11_PREFS_DOMAIN no_auth` = x0 ] ; then 105a73027baSmrg enable_xauth=1 106a73027baSmrgelse 107a73027baSmrg enable_xauth=0 108a73027baSmrgfi 109a73027baSmrg 11072e81212Smrgif [ x`defaults read $X11_PREFS_DOMAIN nolisten_tcp` = x1 ] ; then 111a73027baSmrg defaultserverargs="$defaultserverargs -nolisten tcp" 112d712a854Smrgelse 113d712a854Smrg defaultserverargs="$defaultserverargs -listen tcp" 114d712a854Smrgfi 115d712a854Smrg 116d712a854Smrgif [ x`defaults read $X11_PREFS_DOMAIN enable_iglx` = x1 ] ; then 117d712a854Smrg defaultserverargs="$defaultserverargs +iglx" 118d712a854Smrgelse 119d712a854Smrg defaultserverargs="$defaultserverargs -iglx" 120a73027baSmrgfi 121a73027baSmrg 12236ffeb23SmrgXCOMM The second check is the real one. The first is to hopefully avoid 12336ffeb23SmrgXCOMM needless syslog spamming. 12436ffeb23Smrgif defaults read $X11_PREFS_DOMAIN 2> /dev/null | grep -q 'dpi' && defaults read $X11_PREFS_DOMAIN dpi > /dev/null 2>&1 ; then 12572e81212Smrg defaultserverargs="$defaultserverargs -dpi `defaults read $X11_PREFS_DOMAIN dpi`" 12672e81212Smrgfi 12772e81212Smrg 1281b180c10Smrg#else 1291b180c10Smrgenable_xauth=1 1301b180c10Smrg#endif 1311b180c10Smrg 1321b180c10SmrgXCOMM Automatically determine an unused $DISPLAY 13329004570Smrgd=0 13429004570Smrgwhile true ; do 135d712a854Smrg [ -e "/tmp/.X$d-lock" -o -S "/tmp/.X11-unix/X$d" ] || break 13629004570Smrg d=$(($d + 1)) 137a73027baSmrgdone 138a73027baSmrgdefaultdisplay=":$d" 13929004570Smrgunset d 140a73027baSmrg 141a73027baSmrgwhoseargs="client" 142a73027baSmrgwhile [ x"$1" != x ]; do 143a73027baSmrg case "$1" in 144a73027baSmrg XCOMM '' required to prevent cpp from treating "/*" as a C comment. 145a73027baSmrg /''*|\./''*) 146a73027baSmrg if [ "$whoseargs" = "client" ]; then 147bf4a254eSmrg if [ x"$client" = x ] && [ x"$clientargs" = x ]; then 148a73027baSmrg client="$1" 149a73027baSmrg else 150a73027baSmrg clientargs="$clientargs $1" 151a73027baSmrg fi 152a73027baSmrg else 153bf4a254eSmrg if [ x"$server" = x ] && [ x"$serverargs" = x ]; then 154a73027baSmrg server="$1" 155a73027baSmrg else 156a73027baSmrg serverargs="$serverargs $1" 157a73027baSmrg fi 158a73027baSmrg fi 159a73027baSmrg ;; 160a73027baSmrg --) 161a73027baSmrg whoseargs="server" 162a73027baSmrg ;; 163a73027baSmrg *) 164a73027baSmrg if [ "$whoseargs" = "client" ]; then 165a73027baSmrg clientargs="$clientargs $1" 166a73027baSmrg else 167a73027baSmrg XCOMM display must be the FIRST server argument 168a73027baSmrg if [ x"$serverargs" = x ] && @@ 169a73027baSmrg expr "$1" : ':[0-9][0-9]*$' > /dev/null 2>&1; then 170a73027baSmrg display="$1" 171a73027baSmrg else 172a73027baSmrg serverargs="$serverargs $1" 173a73027baSmrg fi 174a73027baSmrg fi 175a73027baSmrg ;; 176a73027baSmrg esac 177a73027baSmrg shift 178a73027baSmrgdone 179a73027baSmrg 180a73027baSmrgXCOMM process client arguments 181a73027baSmrgif [ x"$client" = x ]; then 18272e81212Smrg client=$defaultclient 18372e81212Smrg 1841b180c10Smrg XCOMM For compatibility reasons, only use startxrc if there were no client command line arguments 185a73027baSmrg if [ x"$clientargs" = x ]; then 18672e81212Smrg if [ -f "$userclientrc" ]; then 18772e81212Smrg client=$userclientrc 18872e81212Smrg elif [ -f "$sysclientrc" ]; then 18972e81212Smrg client=$sysclientrc 19072e81212Smrg fi 191a73027baSmrg fi 192a73027baSmrgfi 193a73027baSmrg 1941b180c10SmrgXCOMM if no client arguments, use defaults 1951b180c10Smrgif [ x"$clientargs" = x ]; then 1961b180c10Smrg clientargs=$defaultclientargs 1971b180c10Smrgfi 1981b180c10Smrg 199a73027baSmrgXCOMM process server arguments 200a73027baSmrgif [ x"$server" = x ]; then 201a73027baSmrg server=$defaultserver 202a73027baSmrg 20341667ceaSmrg#ifdef __linux__ 20441667ceaSmrg XCOMM When starting the defaultserver start X on the current tty to avoid 20541667ceaSmrg XCOMM the startx session being seen as inactive: 20641667ceaSmrg XCOMM "https://bugzilla.redhat.com/show_bug.cgi?id=806491" 20741667ceaSmrg tty=$(tty) 208d712a854Smrg if expr "$tty" : '/dev/tty[0-9][0-9]*$' > /dev/null; then 20941667ceaSmrg tty_num=$(echo "$tty" | grep -oE '[0-9]+$') 210d712a854Smrg vtarg="vt$tty_num -keeptty" 21141667ceaSmrg fi 21241667ceaSmrg#endif 21341667ceaSmrg 2141b180c10Smrg XCOMM For compatibility reasons, only use xserverrc if there were no server command line arguments 215a73027baSmrg if [ x"$serverargs" = x -a x"$display" = x ]; then 21672e81212Smrg if [ -f "$userserverrc" ]; then 217a73027baSmrg server=$userserverrc 21872e81212Smrg elif [ -f "$sysserverrc" ]; then 219a73027baSmrg server=$sysserverrc 220a73027baSmrg fi 221a73027baSmrg fi 222a73027baSmrgfi 223a73027baSmrg 2241b180c10SmrgXCOMM if no server arguments, use defaults 2251b180c10Smrgif [ x"$serverargs" = x ]; then 2261b180c10Smrg serverargs=$defaultserverargs 2271b180c10Smrgfi 2281b180c10Smrg 22941667ceaSmrgXCOMM if no vt is specified add vtarg (which may be empty) 23041667ceaSmrghave_vtarg="no" 23141667ceaSmrgfor i in $serverargs; do 2325dda8871Swiz if expr "$i" : 'vt[0-9][0-9]*$' > /dev/null; then 23341667ceaSmrg have_vtarg="yes" 23441667ceaSmrg fi 23541667ceaSmrgdone 23641667ceaSmrgif [ "$have_vtarg" = "no" ]; then 23741667ceaSmrg serverargs="$serverargs $vtarg" 23841667ceaSmrgfi 23941667ceaSmrg 2401b180c10SmrgXCOMM if no display, use default 2411b180c10Smrgif [ x"$display" = x ]; then 2421b180c10Smrg display=$defaultdisplay 2431b180c10Smrgfi 2441b180c10Smrg 245a73027baSmrgif [ x"$enable_xauth" = x1 ] ; then 246a73027baSmrg if [ x"$XAUTHORITY" = x ]; then 247a73027baSmrg XAUTHORITY=$HOME/.Xauthority 248a73027baSmrg export XAUTHORITY 249a73027baSmrg fi 250a73027baSmrg 251a73027baSmrg removelist= 252a73027baSmrg 253a73027baSmrg XCOMM set up default Xauth info for this machine 254a73027baSmrg case `uname` in 255a73027baSmrg Linux*) 256a73027baSmrg if [ -z "`hostname --version 2>&1 | grep GNU`" ]; then 257a73027baSmrg hostname=`hostname -f` 258a73027baSmrg else 259a73027baSmrg hostname=`hostname` 260a73027baSmrg fi 261a73027baSmrg ;; 262a73027baSmrg *) 263a73027baSmrg hostname=`hostname` 264a73027baSmrg ;; 265a73027baSmrg esac 266a73027baSmrg 267a73027baSmrg authdisplay=${display:-:0} 268a73027baSmrg#if defined(HAS_COOKIE_MAKER) && defined(MK_COOKIE) 269a73027baSmrg mcookie=`MK_COOKIE` 270a73027baSmrg#else 271a73027baSmrg if [ -r /dev/urandom ]; then 272a73027baSmrg mcookie=`dd if=/dev/urandom bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"` 273a73027baSmrg else 274a73027baSmrg mcookie=`dd if=/dev/random bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"` 275a73027baSmrg fi 276a73027baSmrg#endif 277a73027baSmrg if test x"$mcookie" = x; 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 289bf4a254eSmrg#if defined(__APPLE__) || defined(__CYGWIN__) 29029004570Smrg xserverauthfilequoted=$(echo ${xserverauthfile} | sed "s/'/'\\\\''/g") 29129004570Smrg serverargs=${serverargs}" -auth '"${xserverauthfilequoted}"'" 29272e81212Smrg#else 293a73027baSmrg serverargs=${serverargs}" -auth "${xserverauthfile} 29472e81212Smrg#endif 295a73027baSmrg 296a73027baSmrg XCOMM now add the same credentials to the client authority file 297a73027baSmrg XCOMM if '$displayname' already exists do not overwrite it as another 298d712a854Smrg XCOMM server may need it. Add them to the '$xserverauthfile' instead. 299a73027baSmrg for displayname in $authdisplay $hostname$authdisplay; do 300a73027baSmrg authcookie=`XAUTH list "$displayname" @@ 301a73027baSmrg | sed -n "s/.*$displayname[[:space:]*].*[[:space:]*]//p"` 2>/dev/null; 302a73027baSmrg if [ "z${authcookie}" = "z" ] ; then 303a73027baSmrg XAUTH -q << EOF 304a73027baSmrgadd $displayname . $mcookie 305a73027baSmrgEOF 306a73027baSmrg removelist="$displayname $removelist" 307a73027baSmrg else 308a73027baSmrg dummy=$(($dummy+1)); 30972e81212Smrg XAUTH -q -f "$xserverauthfile" << EOF 310a73027baSmrgadd :$dummy . $authcookie 311a73027baSmrgEOF 312a73027baSmrg fi 313a73027baSmrg done 314a73027baSmrgfi 315a73027baSmrg 316bf4a254eSmrg#if defined(__APPLE__) || defined(__CYGWIN__) 31772e81212Smrgeval XINIT \"$client\" $clientargs -- \"$server\" $display $serverargs 31872e81212Smrg#else 31972e81212SmrgXINIT "$client" $clientargs -- "$server" $display $serverargs 320a73027baSmrg#endif 321bf4a254eSmrgretval=$? 322a73027baSmrg 323a73027baSmrgif [ x"$enable_xauth" = x1 ] ; then 324a73027baSmrg if [ x"$removelist" != x ]; then 325a73027baSmrg XAUTH remove $removelist 326a73027baSmrg fi 327a73027baSmrg if [ x"$xserverauthfile" != x ]; then 32872e81212Smrg rm -f "$xserverauthfile" 329a73027baSmrg fi 330a73027baSmrgfi 331a73027baSmrg 332a73027baSmrg/* 333a73027baSmrg * various machines need special cleaning up 334a73027baSmrg */ 335a73027baSmrg#ifdef __linux__ 336a73027baSmrgif command -v deallocvt > /dev/null 2>&1; then 337a73027baSmrg deallocvt 338a73027baSmrgfi 339a73027baSmrg#endif 340a73027baSmrg 341a73027baSmrg#if defined(sun) 342a73027baSmrgkbd_mode -a 343a73027baSmrg#endif 344bf4a254eSmrg 345bf4a254eSmrgexit $retval 346bf4a254eSmrg 347