startx.cpp revision 36ffeb23
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
17a73027baSmrg#if defined(__SCO__) || defined(__UNIXWARE__) || defined(__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
36a73027baSmrg#ifdef __APPLE__
37a73027baSmrgoldbindir=/usr/X11R6/bin
38a73027baSmrg#else
39a73027baSmrgoldbindir=/usr/bin/X11
40a73027baSmrg#endif
41a73027baSmrg
42a73027baSmrgif [ -d "$oldbindir" ] ; then
43a73027baSmrg    case $PATH in
44a73027baSmrg        *:$oldbindir | *:$oldbindir:* | $oldbindir:*) ;;
45a73027baSmrg        *) PATH=$PATH:$oldbindir ;;
46a73027baSmrg    esac
47a73027baSmrgfi
48a73027baSmrg
49a73027baSmrgXCOMM Bourne shell does not automatically export modified environment variables
50a73027baSmrgXCOMM so export the new PATH just in case the user changes the shell
51a73027baSmrgexport PATH
52a73027baSmrg#endif
53a73027baSmrg
54a73027baSmrg#if defined(__SCO__) || defined(__UNIXWARE__)
55a73027baSmrgXCOMM Set up the XMERGE env var so that dos merge is happy under X
56a73027baSmrg
57a73027baSmrgif [ -f /usr/lib/merge/xmergeset.sh ]; then
58a73027baSmrg	. /usr/lib/merge/xmergeset.sh
59a73027baSmrgelif [ -f /usr/lib/merge/console.disp ]; then
60a73027baSmrg	XMERGE=`cat /usr/lib/merge/console.disp`
61a73027baSmrg	export XMERGE
62a73027baSmrgfi
63a73027baSmrg
64a73027baSmrguserclientrc=$HOME/.startxrc
65a73027baSmrgsysclientrc=LIBDIR/sys.startxrc
66a73027baSmrgscouserclientrc=$HOME/.xinitrc
67a73027baSmrgscosysclientrc=XINITDIR/xinitrc
68a73027baSmrg#else
69a73027baSmrguserclientrc=$HOME/.xinitrc
70a73027baSmrgsysclientrc=XINITDIR/xinitrc
71a73027baSmrg#endif
72a73027baSmrg
73a73027baSmrguserserverrc=$HOME/.xserverrc
74a73027baSmrgsysserverrc=XINITDIR/xserverrc
75a73027baSmrgdefaultclient=XTERM
76a73027baSmrgdefaultserver=XSERVER
77a73027baSmrgdefaultclientargs=""
78040e9fe7Smartindefaultserverargs="-noretro"
79a73027baSmrgdefaultdisplay=":0"
80a73027baSmrgclientargs=""
81a73027baSmrgserverargs=""
82a73027baSmrg
83a73027baSmrg#ifdef __APPLE__
84a73027baSmrg
8572e81212Smrgif [ "x$X11_PREFS_DOMAIN" = x ] ; then
86c81d8f5eSmrg    export X11_PREFS_DOMAIN=BUNDLE_ID_PREFIX".X11"
8772e81212Smrgfi
8872e81212Smrg
89a73027baSmrgXCOMM Initialize defaults (this will cut down on "safe" error messages)
9029004570Smrgif ! defaults read $X11_PREFS_DOMAIN cache_fonts > /dev/null 2>&1 ; then
9172e81212Smrg    defaults write $X11_PREFS_DOMAIN cache_fonts -bool true
92a73027baSmrgfi
93a73027baSmrg
9429004570Smrgif ! defaults read $X11_PREFS_DOMAIN no_auth > /dev/null 2>&1 ; then
9572e81212Smrg    defaults write $X11_PREFS_DOMAIN no_auth -bool false
96a73027baSmrgfi
97a73027baSmrg
9829004570Smrgif ! defaults read $X11_PREFS_DOMAIN nolisten_tcp > /dev/null 2>&1 ; then
9972e81212Smrg    defaults write $X11_PREFS_DOMAIN nolisten_tcp -bool true
100a73027baSmrgfi
101a73027baSmrg
102a73027baSmrgXCOMM First, start caching fonts
10372e81212Smrgif [ x`defaults read $X11_PREFS_DOMAIN cache_fonts` = x1 ] ; then
10472e81212Smrg    if [ -x $bindir/font_cache ] ; then
10572e81212Smrg        $bindir/font_cache &
10672e81212Smrg    elif [ -x $bindir/font_cache.sh ] ; then
10772e81212Smrg        $bindir/font_cache.sh &
10872e81212Smrg    elif [ -x $bindir/fc-cache ] ; then
10972e81212Smrg        $bindir/fc-cache &
110a73027baSmrg    fi
111a73027baSmrgfi
112a73027baSmrg
113a73027baSmrgif [ -x XINITDIR/privileged_startx ] ; then
114a73027baSmrg	# Don't push this into the background becasue it can cause
115a73027baSmrg	# a race to create /tmp/.X11-unix
116a73027baSmrg	XINITDIR/privileged_startx
117a73027baSmrgfi
118a73027baSmrg
11972e81212Smrgif [ x`defaults read $X11_PREFS_DOMAIN no_auth` = x0 ] ; then
120a73027baSmrg    enable_xauth=1
121a73027baSmrgelse
122a73027baSmrg    enable_xauth=0
123a73027baSmrgfi
124a73027baSmrg
12572e81212Smrgif [ x`defaults read $X11_PREFS_DOMAIN nolisten_tcp` = x1 ] ; then
126a73027baSmrg    defaultserverargs="$defaultserverargs -nolisten tcp"
127a73027baSmrgfi
128a73027baSmrg
12936ffeb23SmrgXCOMM The second check is the real one.  The first is to hopefully avoid
13036ffeb23SmrgXCOMM needless syslog spamming.
13136ffeb23Smrgif defaults read $X11_PREFS_DOMAIN 2> /dev/null | grep -q 'dpi' && defaults read $X11_PREFS_DOMAIN dpi > /dev/null 2>&1 ; then
13272e81212Smrg    defaultserverargs="$defaultserverargs -dpi `defaults read $X11_PREFS_DOMAIN dpi`"
13372e81212Smrgfi
13472e81212Smrg
1351b180c10Smrg#else
1361b180c10Smrgenable_xauth=1
1371b180c10Smrg#endif
1381b180c10Smrg
1391b180c10SmrgXCOMM Automatically determine an unused $DISPLAY
14029004570Smrgd=0
14129004570Smrgwhile true ; do
14229004570Smrg    [ -e /tmp/.X$d-lock ] || break
14329004570Smrg    d=$(($d + 1))
144a73027baSmrgdone
145a73027baSmrgdefaultdisplay=":$d"
14629004570Smrgunset d
147a73027baSmrg
148a73027baSmrg#if defined(__SCO__) || defined(__UNIXWARE__)
149a73027baSmrg
150a73027baSmrgXCOMM SCO -t option: do not start an X server
151a73027baSmrgcase $1 in
152a73027baSmrg  -t)   if [ -n "$DISPLAY" ]; then
153a73027baSmrg                REMOTE_SERVER=TRUE
154a73027baSmrg                shift
155a73027baSmrg        else
156a73027baSmrg                echo "DISPLAY environment variable not set"
157a73027baSmrg                exit 1
158a73027baSmrg        fi
159a73027baSmrg        ;;
160a73027baSmrgesac
161a73027baSmrg#endif
162a73027baSmrg
163a73027baSmrgwhoseargs="client"
164a73027baSmrgwhile [ x"$1" != x ]; do
165a73027baSmrg    case "$1" in
166a73027baSmrg    XCOMM '' required to prevent cpp from treating "/*" as a C comment.
167a73027baSmrg    /''*|\./''*)
168a73027baSmrg	if [ "$whoseargs" = "client" ]; then
169bf4a254eSmrg	    if [ x"$client" = x ] && [ x"$clientargs" = x ]; then
170a73027baSmrg		client="$1"
171a73027baSmrg	    else
172a73027baSmrg		clientargs="$clientargs $1"
173a73027baSmrg	    fi
174a73027baSmrg	else
175bf4a254eSmrg	    if [ x"$server" = x ] && [ x"$serverargs" = x ]; then
176a73027baSmrg		server="$1"
177a73027baSmrg	    else
178a73027baSmrg		serverargs="$serverargs $1"
179a73027baSmrg	    fi
180a73027baSmrg	fi
181a73027baSmrg	;;
182a73027baSmrg    --)
183a73027baSmrg	whoseargs="server"
184a73027baSmrg	;;
185a73027baSmrg    *)
186a73027baSmrg	if [ "$whoseargs" = "client" ]; then
187a73027baSmrg	    clientargs="$clientargs $1"
188a73027baSmrg	else
189a73027baSmrg	    XCOMM display must be the FIRST server argument
190a73027baSmrg	    if [ x"$serverargs" = x ] && @@
191a73027baSmrg		 expr "$1" : ':[0-9][0-9]*$' > /dev/null 2>&1; then
192a73027baSmrg		display="$1"
193a73027baSmrg	    else
194a73027baSmrg		serverargs="$serverargs $1"
195a73027baSmrg	    fi
196a73027baSmrg	fi
197a73027baSmrg	;;
198a73027baSmrg    esac
199a73027baSmrg    shift
200a73027baSmrgdone
201a73027baSmrg
202a73027baSmrgXCOMM process client arguments
203a73027baSmrgif [ x"$client" = x ]; then
20472e81212Smrg    client=$defaultclient
20572e81212Smrg
2061b180c10Smrg    XCOMM For compatibility reasons, only use startxrc if there were no client command line arguments
207a73027baSmrg    if [ x"$clientargs" = x ]; then
20872e81212Smrg        if [ -f "$userclientrc" ]; then
20972e81212Smrg            client=$userclientrc
21072e81212Smrg        elif [ -f "$sysclientrc" ]; then
21172e81212Smrg            client=$sysclientrc
21272e81212Smrg#if defined(__SCO__) || defined(__UNIXWARE__)
21372e81212Smrg        elif [ -f "$scouserclientrc" ]; then
21472e81212Smrg            client=$scouserclientrc
21572e81212Smrg        elif [ -f "$scosysclientrc" ]; then
21672e81212Smrg            client=$scosysclientrc
21772e81212Smrg#endif
21872e81212Smrg        fi
219a73027baSmrg    fi
220a73027baSmrgfi
221a73027baSmrg
2221b180c10SmrgXCOMM if no client arguments, use defaults
2231b180c10Smrgif [ x"$clientargs" = x ]; then
2241b180c10Smrg    clientargs=$defaultclientargs
2251b180c10Smrgfi
2261b180c10Smrg
227a73027baSmrgXCOMM process server arguments
228a73027baSmrgif [ x"$server" = x ]; then
229a73027baSmrg    server=$defaultserver
230a73027baSmrg
2311b180c10Smrg    XCOMM For compatibility reasons, only use xserverrc if there were no server command line arguments
232a73027baSmrg    if [ x"$serverargs" = x -a x"$display" = x ]; then
23372e81212Smrg	if [ -f "$userserverrc" ]; then
234a73027baSmrg	    server=$userserverrc
23572e81212Smrg	elif [ -f "$sysserverrc" ]; then
236a73027baSmrg	    server=$sysserverrc
237a73027baSmrg	fi
238a73027baSmrg    fi
239a73027baSmrgfi
240a73027baSmrg
2411b180c10SmrgXCOMM if no server arguments, use defaults
2421b180c10Smrgif [ x"$serverargs" = x ]; then
2431b180c10Smrg    serverargs=$defaultserverargs
2441b180c10Smrgfi
2451b180c10Smrg
2461b180c10SmrgXCOMM if no display, use default
2471b180c10Smrgif [ x"$display" = x ]; then
2481b180c10Smrg    display=$defaultdisplay
2491b180c10Smrgfi
2501b180c10Smrg
251a73027baSmrgif [ x"$enable_xauth" = x1 ] ; then
252a73027baSmrg    if [ x"$XAUTHORITY" = x ]; then
253a73027baSmrg        XAUTHORITY=$HOME/.Xauthority
254a73027baSmrg        export XAUTHORITY
255a73027baSmrg    fi
256a73027baSmrg
257a73027baSmrg    removelist=
258a73027baSmrg
259a73027baSmrg    XCOMM set up default Xauth info for this machine
260a73027baSmrg    case `uname` in
261a73027baSmrg    Linux*)
262a73027baSmrg        if [ -z "`hostname --version 2>&1 | grep GNU`" ]; then
263a73027baSmrg            hostname=`hostname -f`
264a73027baSmrg        else
265a73027baSmrg            hostname=`hostname`
266a73027baSmrg        fi
267a73027baSmrg        ;;
268a73027baSmrg    *)
269a73027baSmrg        hostname=`hostname`
270a73027baSmrg        ;;
271a73027baSmrg    esac
272a73027baSmrg
273a73027baSmrg    authdisplay=${display:-:0}
274a73027baSmrg#if defined(HAS_COOKIE_MAKER) && defined(MK_COOKIE)
275a73027baSmrg    mcookie=`MK_COOKIE`
276a73027baSmrg#else
277a73027baSmrg    if [ -r /dev/urandom ]; then
278a73027baSmrg        mcookie=`dd if=/dev/urandom bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"`
279a73027baSmrg    else
280a73027baSmrg        mcookie=`dd if=/dev/random bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"`
281a73027baSmrg    fi
282a73027baSmrg#endif
283a73027baSmrg    if test x"$mcookie" = x; then
284a73027baSmrg        echo "Couldn't create cookie"
285a73027baSmrg        exit 1
286a73027baSmrg    fi
287a73027baSmrg    dummy=0
288a73027baSmrg
289a73027baSmrg    XCOMM create a file with auth information for the server. ':0' is a dummy.
290a73027baSmrg    xserverauthfile=$HOME/.serverauth.$$
29172e81212Smrg    trap "rm -f '$xserverauthfile'" HUP INT QUIT ILL TRAP KILL BUS TERM
29272e81212Smrg    xauth -q -f "$xserverauthfile" << EOF
293a73027baSmrgadd :$dummy . $mcookie
294a73027baSmrgEOF
295bf4a254eSmrg#if defined(__APPLE__) || defined(__CYGWIN__)
29629004570Smrg    xserverauthfilequoted=$(echo ${xserverauthfile} | sed "s/'/'\\\\''/g")
29729004570Smrg    serverargs=${serverargs}" -auth '"${xserverauthfilequoted}"'"
29872e81212Smrg#else
299a73027baSmrg    serverargs=${serverargs}" -auth "${xserverauthfile}
30072e81212Smrg#endif
301a73027baSmrg
302a73027baSmrg    XCOMM now add the same credentials to the client authority file
303a73027baSmrg    XCOMM if '$displayname' already exists do not overwrite it as another
304a73027baSmrg    XCOMM server man need it. Add them to the '$xserverauthfile' instead.
305a73027baSmrg    for displayname in $authdisplay $hostname$authdisplay; do
306a73027baSmrg        authcookie=`XAUTH list "$displayname" @@
307a73027baSmrg        | sed -n "s/.*$displayname[[:space:]*].*[[:space:]*]//p"` 2>/dev/null;
308a73027baSmrg        if [ "z${authcookie}" = "z" ] ; then
309a73027baSmrg            XAUTH -q << EOF
310a73027baSmrgadd $displayname . $mcookie
311a73027baSmrgEOF
312a73027baSmrg        removelist="$displayname $removelist"
313a73027baSmrg        else
314a73027baSmrg            dummy=$(($dummy+1));
31572e81212Smrg            XAUTH -q -f "$xserverauthfile" << EOF
316a73027baSmrgadd :$dummy . $authcookie
317a73027baSmrgEOF
318a73027baSmrg        fi
319a73027baSmrg    done
320a73027baSmrgfi
321a73027baSmrg
322a73027baSmrg#if defined(__SCO__) || defined(__UNIXWARE__)
323a73027baSmrgif [ "$REMOTE_SERVER" = "TRUE" ]; then
324a73027baSmrg        exec SHELL_CMD ${client}
325a73027baSmrgelse
32672e81212Smrg        XINIT "$client" $clientargs -- "$server" $display $serverargs
327a73027baSmrgfi
328a73027baSmrg#else
32972e81212Smrg
330bf4a254eSmrg#if defined(__APPLE__) || defined(__CYGWIN__)
33172e81212Smrgeval XINIT \"$client\" $clientargs -- \"$server\" $display $serverargs
33272e81212Smrg#else
33372e81212SmrgXINIT "$client" $clientargs -- "$server" $display $serverargs
33472e81212Smrg#endif
33572e81212Smrg
336a73027baSmrg#endif
337bf4a254eSmrgretval=$?
338a73027baSmrg
339a73027baSmrgif [ x"$enable_xauth" = x1 ] ; then
340a73027baSmrg    if [ x"$removelist" != x ]; then
341a73027baSmrg        XAUTH remove $removelist
342a73027baSmrg    fi
343a73027baSmrg    if [ x"$xserverauthfile" != x ]; then
34472e81212Smrg        rm -f "$xserverauthfile"
345a73027baSmrg    fi
346a73027baSmrgfi
347a73027baSmrg
348a73027baSmrg/*
349a73027baSmrg * various machines need special cleaning up
350a73027baSmrg */
351a73027baSmrg#ifdef __linux__
352a73027baSmrgif command -v deallocvt > /dev/null 2>&1; then
353a73027baSmrg    deallocvt
354a73027baSmrgfi
355a73027baSmrg#endif
356a73027baSmrg
357a73027baSmrg#ifdef macII
358a73027baSmrgXrepair
359a73027baSmrgscreenrestore
360a73027baSmrg#endif
361a73027baSmrg
362a73027baSmrg#if defined(sun)
363a73027baSmrgkbd_mode -a
364a73027baSmrg#endif
365bf4a254eSmrg
366bf4a254eSmrgexit $retval
367bf4a254eSmrg
368