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