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