startx.cpp revision 41667cea
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" 59a73027baSmrgdefaultdisplay=":0" 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 83a73027baSmrgXCOMM First, start caching fonts 8472e81212Smrgif [ x`defaults read $X11_PREFS_DOMAIN cache_fonts` = x1 ] ; then 8572e81212Smrg if [ -x $bindir/font_cache ] ; then 8672e81212Smrg $bindir/font_cache & 8772e81212Smrg elif [ -x $bindir/font_cache.sh ] ; then 8872e81212Smrg $bindir/font_cache.sh & 8972e81212Smrg elif [ -x $bindir/fc-cache ] ; then 9072e81212Smrg $bindir/fc-cache & 91a73027baSmrg fi 92a73027baSmrgfi 93a73027baSmrg 94a73027baSmrgif [ -x XINITDIR/privileged_startx ] ; then 95a73027baSmrg # Don't push this into the background becasue it can cause 96a73027baSmrg # a race to create /tmp/.X11-unix 97a73027baSmrg XINITDIR/privileged_startx 98a73027baSmrgfi 99a73027baSmrg 10072e81212Smrgif [ x`defaults read $X11_PREFS_DOMAIN no_auth` = x0 ] ; then 101a73027baSmrg enable_xauth=1 102a73027baSmrgelse 103a73027baSmrg enable_xauth=0 104a73027baSmrgfi 105a73027baSmrg 10672e81212Smrgif [ x`defaults read $X11_PREFS_DOMAIN nolisten_tcp` = x1 ] ; then 107a73027baSmrg defaultserverargs="$defaultserverargs -nolisten tcp" 108a73027baSmrgfi 109a73027baSmrg 11036ffeb23SmrgXCOMM The second check is the real one. The first is to hopefully avoid 11136ffeb23SmrgXCOMM needless syslog spamming. 11236ffeb23Smrgif defaults read $X11_PREFS_DOMAIN 2> /dev/null | grep -q 'dpi' && defaults read $X11_PREFS_DOMAIN dpi > /dev/null 2>&1 ; then 11372e81212Smrg defaultserverargs="$defaultserverargs -dpi `defaults read $X11_PREFS_DOMAIN dpi`" 11472e81212Smrgfi 11572e81212Smrg 1161b180c10Smrg#else 1171b180c10Smrgenable_xauth=1 1181b180c10Smrg#endif 1191b180c10Smrg 1201b180c10SmrgXCOMM Automatically determine an unused $DISPLAY 12129004570Smrgd=0 12229004570Smrgwhile true ; do 12329004570Smrg [ -e /tmp/.X$d-lock ] || break 12429004570Smrg d=$(($d + 1)) 125a73027baSmrgdone 126a73027baSmrgdefaultdisplay=":$d" 12729004570Smrgunset d 128a73027baSmrg 129a73027baSmrgwhoseargs="client" 130a73027baSmrgwhile [ x"$1" != x ]; do 131a73027baSmrg case "$1" in 132a73027baSmrg XCOMM '' required to prevent cpp from treating "/*" as a C comment. 133a73027baSmrg /''*|\./''*) 134a73027baSmrg if [ "$whoseargs" = "client" ]; then 135bf4a254eSmrg if [ x"$client" = x ] && [ x"$clientargs" = x ]; then 136a73027baSmrg client="$1" 137a73027baSmrg else 138a73027baSmrg clientargs="$clientargs $1" 139a73027baSmrg fi 140a73027baSmrg else 141bf4a254eSmrg if [ x"$server" = x ] && [ x"$serverargs" = x ]; then 142a73027baSmrg server="$1" 143a73027baSmrg else 144a73027baSmrg serverargs="$serverargs $1" 145a73027baSmrg fi 146a73027baSmrg fi 147a73027baSmrg ;; 148a73027baSmrg --) 149a73027baSmrg whoseargs="server" 150a73027baSmrg ;; 151a73027baSmrg *) 152a73027baSmrg if [ "$whoseargs" = "client" ]; then 153a73027baSmrg clientargs="$clientargs $1" 154a73027baSmrg else 155a73027baSmrg XCOMM display must be the FIRST server argument 156a73027baSmrg if [ x"$serverargs" = x ] && @@ 157a73027baSmrg expr "$1" : ':[0-9][0-9]*$' > /dev/null 2>&1; then 158a73027baSmrg display="$1" 159a73027baSmrg else 160a73027baSmrg serverargs="$serverargs $1" 161a73027baSmrg fi 162a73027baSmrg fi 163a73027baSmrg ;; 164a73027baSmrg esac 165a73027baSmrg shift 166a73027baSmrgdone 167a73027baSmrg 168a73027baSmrgXCOMM process client arguments 169a73027baSmrgif [ x"$client" = x ]; then 17072e81212Smrg client=$defaultclient 17172e81212Smrg 1721b180c10Smrg XCOMM For compatibility reasons, only use startxrc if there were no client command line arguments 173a73027baSmrg if [ x"$clientargs" = x ]; then 17472e81212Smrg if [ -f "$userclientrc" ]; then 17572e81212Smrg client=$userclientrc 17672e81212Smrg elif [ -f "$sysclientrc" ]; then 17772e81212Smrg client=$sysclientrc 17872e81212Smrg fi 179a73027baSmrg fi 180a73027baSmrgfi 181a73027baSmrg 1821b180c10SmrgXCOMM if no client arguments, use defaults 1831b180c10Smrgif [ x"$clientargs" = x ]; then 1841b180c10Smrg clientargs=$defaultclientargs 1851b180c10Smrgfi 1861b180c10Smrg 187a73027baSmrgXCOMM process server arguments 188a73027baSmrgif [ x"$server" = x ]; then 189a73027baSmrg server=$defaultserver 190a73027baSmrg 19141667ceaSmrg#ifdef __linux__ 19241667ceaSmrg XCOMM When starting the defaultserver start X on the current tty to avoid 19341667ceaSmrg XCOMM the startx session being seen as inactive: 19441667ceaSmrg XCOMM "https://bugzilla.redhat.com/show_bug.cgi?id=806491" 19541667ceaSmrg tty=$(tty) 19641667ceaSmrg if expr match "$tty" '^/dev/tty[0-9]\+$' > /dev/null; then 19741667ceaSmrg tty_num=$(echo "$tty" | grep -oE '[0-9]+$') 19841667ceaSmrg vtarg="vt$tty_num" 19941667ceaSmrg fi 20041667ceaSmrg#endif 20141667ceaSmrg 2021b180c10Smrg XCOMM For compatibility reasons, only use xserverrc if there were no server command line arguments 203a73027baSmrg if [ x"$serverargs" = x -a x"$display" = x ]; then 20472e81212Smrg if [ -f "$userserverrc" ]; then 205a73027baSmrg server=$userserverrc 20672e81212Smrg elif [ -f "$sysserverrc" ]; then 207a73027baSmrg server=$sysserverrc 208a73027baSmrg fi 209a73027baSmrg fi 210a73027baSmrgfi 211a73027baSmrg 2121b180c10SmrgXCOMM if no server arguments, use defaults 2131b180c10Smrgif [ x"$serverargs" = x ]; then 2141b180c10Smrg serverargs=$defaultserverargs 2151b180c10Smrgfi 2161b180c10Smrg 21741667ceaSmrgXCOMM if no vt is specified add vtarg (which may be empty) 21841667ceaSmrghave_vtarg="no" 21941667ceaSmrgfor i in $serverargs; do 22041667ceaSmrg if expr match "$i" '^vt[0-9]\+$' > /dev/null; then 22141667ceaSmrg have_vtarg="yes" 22241667ceaSmrg fi 22341667ceaSmrgdone 22441667ceaSmrgif [ "$have_vtarg" = "no" ]; then 22541667ceaSmrg serverargs="$serverargs $vtarg" 22641667ceaSmrgfi 22741667ceaSmrg 2281b180c10SmrgXCOMM if no display, use default 2291b180c10Smrgif [ x"$display" = x ]; then 2301b180c10Smrg display=$defaultdisplay 2311b180c10Smrgfi 2321b180c10Smrg 233a73027baSmrgif [ x"$enable_xauth" = x1 ] ; then 234a73027baSmrg if [ x"$XAUTHORITY" = x ]; then 235a73027baSmrg XAUTHORITY=$HOME/.Xauthority 236a73027baSmrg export XAUTHORITY 237a73027baSmrg fi 238a73027baSmrg 239a73027baSmrg removelist= 240a73027baSmrg 241a73027baSmrg XCOMM set up default Xauth info for this machine 242a73027baSmrg case `uname` in 243a73027baSmrg Linux*) 244a73027baSmrg if [ -z "`hostname --version 2>&1 | grep GNU`" ]; then 245a73027baSmrg hostname=`hostname -f` 246a73027baSmrg else 247a73027baSmrg hostname=`hostname` 248a73027baSmrg fi 249a73027baSmrg ;; 250a73027baSmrg *) 251a73027baSmrg hostname=`hostname` 252a73027baSmrg ;; 253a73027baSmrg esac 254a73027baSmrg 255a73027baSmrg authdisplay=${display:-:0} 256a73027baSmrg#if defined(HAS_COOKIE_MAKER) && defined(MK_COOKIE) 257a73027baSmrg mcookie=`MK_COOKIE` 258a73027baSmrg#else 259a73027baSmrg if [ -r /dev/urandom ]; then 260a73027baSmrg mcookie=`dd if=/dev/urandom bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"` 261a73027baSmrg else 262a73027baSmrg mcookie=`dd if=/dev/random bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"` 263a73027baSmrg fi 264a73027baSmrg#endif 265a73027baSmrg if test x"$mcookie" = x; then 266a73027baSmrg echo "Couldn't create cookie" 267a73027baSmrg exit 1 268a73027baSmrg fi 269a73027baSmrg dummy=0 270a73027baSmrg 271a73027baSmrg XCOMM create a file with auth information for the server. ':0' is a dummy. 272a73027baSmrg xserverauthfile=$HOME/.serverauth.$$ 27372e81212Smrg trap "rm -f '$xserverauthfile'" HUP INT QUIT ILL TRAP KILL BUS TERM 27472e81212Smrg xauth -q -f "$xserverauthfile" << EOF 275a73027baSmrgadd :$dummy . $mcookie 276a73027baSmrgEOF 277bf4a254eSmrg#if defined(__APPLE__) || defined(__CYGWIN__) 27829004570Smrg xserverauthfilequoted=$(echo ${xserverauthfile} | sed "s/'/'\\\\''/g") 27929004570Smrg serverargs=${serverargs}" -auth '"${xserverauthfilequoted}"'" 28072e81212Smrg#else 281a73027baSmrg serverargs=${serverargs}" -auth "${xserverauthfile} 28272e81212Smrg#endif 283a73027baSmrg 284a73027baSmrg XCOMM now add the same credentials to the client authority file 285a73027baSmrg XCOMM if '$displayname' already exists do not overwrite it as another 286a73027baSmrg XCOMM server man need it. Add them to the '$xserverauthfile' instead. 287a73027baSmrg for displayname in $authdisplay $hostname$authdisplay; do 288a73027baSmrg authcookie=`XAUTH list "$displayname" @@ 289a73027baSmrg | sed -n "s/.*$displayname[[:space:]*].*[[:space:]*]//p"` 2>/dev/null; 290a73027baSmrg if [ "z${authcookie}" = "z" ] ; then 291a73027baSmrg XAUTH -q << EOF 292a73027baSmrgadd $displayname . $mcookie 293a73027baSmrgEOF 294a73027baSmrg removelist="$displayname $removelist" 295a73027baSmrg else 296a73027baSmrg dummy=$(($dummy+1)); 29772e81212Smrg XAUTH -q -f "$xserverauthfile" << EOF 298a73027baSmrgadd :$dummy . $authcookie 299a73027baSmrgEOF 300a73027baSmrg fi 301a73027baSmrg done 302a73027baSmrgfi 303a73027baSmrg 304bf4a254eSmrg#if defined(__APPLE__) || defined(__CYGWIN__) 30572e81212Smrgeval XINIT \"$client\" $clientargs -- \"$server\" $display $serverargs 30672e81212Smrg#else 30772e81212SmrgXINIT "$client" $clientargs -- "$server" $display $serverargs 308a73027baSmrg#endif 309bf4a254eSmrgretval=$? 310a73027baSmrg 311a73027baSmrgif [ x"$enable_xauth" = x1 ] ; then 312a73027baSmrg if [ x"$removelist" != x ]; then 313a73027baSmrg XAUTH remove $removelist 314a73027baSmrg fi 315a73027baSmrg if [ x"$xserverauthfile" != x ]; then 31672e81212Smrg rm -f "$xserverauthfile" 317a73027baSmrg fi 318a73027baSmrgfi 319a73027baSmrg 320a73027baSmrg/* 321a73027baSmrg * various machines need special cleaning up 322a73027baSmrg */ 323a73027baSmrg#ifdef __linux__ 324a73027baSmrgif command -v deallocvt > /dev/null 2>&1; then 325a73027baSmrg deallocvt 326a73027baSmrgfi 327a73027baSmrg#endif 328a73027baSmrg 329a73027baSmrg#ifdef macII 330a73027baSmrgXrepair 331a73027baSmrgscreenrestore 332a73027baSmrg#endif 333a73027baSmrg 334a73027baSmrg#if defined(sun) 335a73027baSmrgkbd_mode -a 336a73027baSmrg#endif 337bf4a254eSmrg 338bf4a254eSmrgexit $retval 339bf4a254eSmrg 340