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