startx.cpp revision ac57ed83
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
15ac57ed83Smrgxinitdir=XINITDIR
16ac57ed83Smrgxterm=XTERM
17ac57ed83Smrgxserver=XSERVER
18ac57ed83Smrgxinit=XINIT
19ac57ed83Smrgbundle_id_prefix=BUNDLE_ID_PREFIX
20ac57ed83Smrgxauth=XAUTH
21ac57ed83Smrgbindir=__bindir__
22ac57ed83Smrglibexecdir=__libexecdir__
23ac57ed83Smrgmk_cookie=MK_COOKIE
24ac57ed83Smrghas_cookie_maker=HAS_COOKIE_MAKER
25ac57ed83Smrg
26a73027baSmrgunset SESSION_MANAGER
27a73027baSmrg
28ac57ed83Smrgif [ "$(uname -s)" = "Darwin" ] ; then
29a73027baSmrg
30ac57ed83Smrg    XCOMM Check for /usr/bin/X11 and BINDIR in the path, if not add them.
31ac57ed83Smrg    XCOMM This allows startx to be placed in a place like /usr/bin or /usr/local/bin
32ac57ed83Smrg    XCOMM and people may use X without changing their PATH.
33ac57ed83Smrg    XCOMM Note that we put our own bin directory at the front of the path, and
34ac57ed83Smrg    XCOMM the standard system path at the back, since if you are using the Xorg
35ac57ed83Smrg    XCOMM server there's a pretty good chance you want to bias the Xorg clients
36ac57ed83Smrg    XCOMM over the old system's clients.
37a73027baSmrg
38ac57ed83Smrg    case $PATH in
39ac57ed83Smrg        *:$bindir | *:$bindir:* | $bindir:*) ;;
40ac57ed83Smrg        *) PATH=$bindir:$PATH ;;
41ac57ed83Smrg    esac
42a73027baSmrg
43ac57ed83Smrg    XCOMM Now the "old" compiled path
44ac57ed83Smrg    oldbindir=/usr/X11R6/bin
45a73027baSmrg
46ac57ed83Smrg    if [ -d "$oldbindir" ] ; then
47ac57ed83Smrg        case $PATH in
48ac57ed83Smrg            *:$oldbindir | *:$oldbindir:* | $oldbindir:*) ;;
49ac57ed83Smrg            *) PATH=$PATH:$oldbindir ;;
50ac57ed83Smrg        esac
51ac57ed83Smrg    fi
52a73027baSmrg
53ac57ed83Smrg    XCOMM Bourne shell does not automatically export modified environment variables
54ac57ed83Smrg    XCOMM so export the new PATH just in case the user changes the shell
55ac57ed83Smrg    export PATH
56a73027baSmrgfi
57a73027baSmrg
58a73027baSmrguserclientrc=$HOME/.xinitrc
597aed6334Smrg[ -f "${XINITRC}" ] && userclientrc="${XINITRC}"
60a73027baSmrgsysclientrc=XINITDIR/xinitrc
61a73027baSmrg
62a73027baSmrguserserverrc=$HOME/.xserverrc
63ac57ed83Smrg[ -f "${XSERVERRC}" ] && userserverrc="${XSERVERRC}"
64ac57ed83Smrgsysserverrc=$xinitdir/xserverrc
65ac57ed83Smrgdefaultclient=$xterm
66ac57ed83Smrgdefaultserver=$xserver
67a73027baSmrgdefaultclientargs=""
68040e9fe7Smartindefaultserverargs="-noretro"
69d712a854Smrgdefaultdisplay=""
70a73027baSmrgclientargs=""
71a73027baSmrgserverargs=""
7241667ceaSmrgvtarg=""
73a73027baSmrg
74a73027baSmrg
75ac57ed83Smrgif [ "$(uname -s)" = "Darwin" ] ; then
7672e81212Smrg
77ac57ed83Smrg    if [ "$X11_PREFS_DOMAIN" = "" ] ; then
78ac57ed83Smrg        export X11_PREFS_DOMAIN=$bundle_id_prefix".X11"
79ac57ed83Smrg    fi
80a73027baSmrg
81ac57ed83Smrg    XCOMM Initialize defaults (this will cut down on "safe" error messages)
82ac57ed83Smrg    if ! defaults read $X11_PREFS_DOMAIN cache_fonts > /dev/null 2>&1 ; then
83ac57ed83Smrg        defaults write $X11_PREFS_DOMAIN cache_fonts -bool true
84ac57ed83Smrg    fi
85a73027baSmrg
86ac57ed83Smrg    if ! defaults read $X11_PREFS_DOMAIN no_auth > /dev/null 2>&1 ; then
87ac57ed83Smrg        defaults write $X11_PREFS_DOMAIN no_auth -bool false
88ac57ed83Smrg    fi
89a73027baSmrg
90ac57ed83Smrg    if ! defaults read $X11_PREFS_DOMAIN nolisten_tcp > /dev/null 2>&1 ; then
91ac57ed83Smrg        defaults write $X11_PREFS_DOMAIN nolisten_tcp -bool true
92ac57ed83Smrg    fi
93d712a854Smrg
94ac57ed83Smrg    if ! defaults read $X11_PREFS_DOMAIN enable_iglx > /dev/null 2>&1 ; then
95ac57ed83Smrg        defaults write $X11_PREFS_DOMAIN enable_iglx -bool false
96a73027baSmrg    fi
97a73027baSmrg
98ac57ed83Smrg    XCOMM First, start caching fonts
99ac57ed83Smrg    if [ "$(defaults read $X11_PREFS_DOMAIN cache_fonts)" = 1 ] ; then
100ac57ed83Smrg        if [ -x $bindir/font_cache ] ; then
101ac57ed83Smrg            $bindir/font_cache
102ac57ed83Smrg        elif [ -x $bindir/font_cache.sh ] ; then
103ac57ed83Smrg            $bindir/font_cache.sh
104ac57ed83Smrg        elif [ -x $bindir/fc-cache ] ; then
105ac57ed83Smrg            $bindir/fc-cache
106ac57ed83Smrg        fi
107ac57ed83Smrg    fi
108ac57ed83Smrg
109ac57ed83Smrg    if [ -x $libexecdir/privileged_startx ] ; then
1107aed6334Smrg	XCOMM Don't push this into the background because it can cause
1117aed6334Smrg	XCOMM a race to create /tmp/.X11-unix
112ac57ed83Smrg	$libexecdir/privileged_startx
113ac57ed83Smrg    fi
114a73027baSmrg
115ac57ed83Smrg    if [ "$(defaults read $X11_PREFS_DOMAIN no_auth)" = 0 ] ; then
116ac57ed83Smrg        enable_xauth=1
117ac57ed83Smrg    else
118ac57ed83Smrg        enable_xauth=0
119ac57ed83Smrg    fi
120a73027baSmrg
121ac57ed83Smrg    if [ "$(defaults read $X11_PREFS_DOMAIN nolisten_tcp)" = 1 ] ; then
122ac57ed83Smrg        defaultserverargs="$defaultserverargs -nolisten tcp"
123ac57ed83Smrg    else
124ac57ed83Smrg        defaultserverargs="$defaultserverargs -listen tcp"
125ac57ed83Smrg    fi
126d712a854Smrg
127ac57ed83Smrg    if [ "$(defaults read $X11_PREFS_DOMAIN enable_iglx)" = 1 ] ; then
128ac57ed83Smrg        defaultserverargs="$defaultserverargs +iglx +extension GLX"
129ac57ed83Smrg    else
130ac57ed83Smrg        defaultserverargs="$defaultserverargs -iglx"
131ac57ed83Smrg    fi
132a73027baSmrg
133ac57ed83Smrg    XCOMM The second check is the real one.  The first is to hopefully avoid
134ac57ed83Smrg    XCOMM needless syslog spamming.
135ac57ed83Smrg    if defaults read $X11_PREFS_DOMAIN 2> /dev/null | grep -q 'dpi' && defaults read $X11_PREFS_DOMAIN dpi > /dev/null 2>&1 ; then
136ac57ed83Smrg        defaultserverargs="$defaultserverargs -dpi $(defaults read $X11_PREFS_DOMAIN dpi)"
137ac57ed83Smrg    fi
13872e81212Smrg
139ac57ed83Smrgelse
140ac57ed83Smrg    enable_xauth=1
141ac57ed83Smrgfi
1421b180c10Smrg
1431b180c10SmrgXCOMM Automatically determine an unused $DISPLAY
14429004570Smrgd=0
14529004570Smrgwhile true ; do
146d712a854Smrg    [ -e "/tmp/.X$d-lock" -o -S "/tmp/.X11-unix/X$d" ] || break
14729004570Smrg    d=$(($d + 1))
148a73027baSmrgdone
149a73027baSmrgdefaultdisplay=":$d"
15029004570Smrgunset d
151a73027baSmrg
152a73027baSmrgwhoseargs="client"
153ac57ed83Smrgwhile [ "$1" != "" ]; do
154a73027baSmrg    case "$1" in
155a73027baSmrg    XCOMM '' required to prevent cpp from treating "/*" as a C comment.
156a73027baSmrg    /''*|\./''*)
157a73027baSmrg	if [ "$whoseargs" = "client" ]; then
158ac57ed83Smrg	    if [ "$client" = "" ] && [ "$clientargs" = "" ]; then
159a73027baSmrg		client="$1"
160a73027baSmrg	    else
161a73027baSmrg		clientargs="$clientargs $1"
162a73027baSmrg	    fi
163a73027baSmrg	else
164ac57ed83Smrg	    if [ "$server" = "" ] && [ "$serverargs" = "" ]; then
165a73027baSmrg		server="$1"
166a73027baSmrg	    else
167a73027baSmrg		serverargs="$serverargs $1"
168a73027baSmrg	    fi
169a73027baSmrg	fi
170a73027baSmrg	;;
171a73027baSmrg    --)
172a73027baSmrg	whoseargs="server"
173a73027baSmrg	;;
174a73027baSmrg    *)
175a73027baSmrg	if [ "$whoseargs" = "client" ]; then
176a73027baSmrg	    clientargs="$clientargs $1"
177a73027baSmrg	else
178a73027baSmrg	    XCOMM display must be the FIRST server argument
179ac57ed83Smrg	    if [ "$serverargs" = "" ] && @@
180a73027baSmrg		 expr "$1" : ':[0-9][0-9]*$' > /dev/null 2>&1; then
181a73027baSmrg		display="$1"
182a73027baSmrg	    else
183a73027baSmrg		serverargs="$serverargs $1"
184a73027baSmrg	    fi
185a73027baSmrg	fi
186a73027baSmrg	;;
187a73027baSmrg    esac
188a73027baSmrg    shift
189a73027baSmrgdone
190a73027baSmrg
191a73027baSmrgXCOMM process client arguments
192ac57ed83Smrgif [ "$client" = "" ]; then
19372e81212Smrg    client=$defaultclient
19472e81212Smrg
1951b180c10Smrg    XCOMM For compatibility reasons, only use startxrc if there were no client command line arguments
196ac57ed83Smrg    if [ "$clientargs" = "" ]; then
19772e81212Smrg        if [ -f "$userclientrc" ]; then
19872e81212Smrg            client=$userclientrc
19972e81212Smrg        elif [ -f "$sysclientrc" ]; then
20072e81212Smrg            client=$sysclientrc
20172e81212Smrg        fi
202a73027baSmrg    fi
203a73027baSmrgfi
204a73027baSmrg
2051b180c10SmrgXCOMM if no client arguments, use defaults
206ac57ed83Smrgif [ "$clientargs" = "" ]; then
2071b180c10Smrg    clientargs=$defaultclientargs
2081b180c10Smrgfi
2091b180c10Smrg
210a73027baSmrgXCOMM process server arguments
211ac57ed83Smrgif [ "$server" = "" ]; then
212a73027baSmrg    server=$defaultserver
213a73027baSmrg
214ac57ed83Smrgif [ "$(uname -s)" = "Linux" ] ; then
21541667ceaSmrg    XCOMM When starting the defaultserver start X on the current tty to avoid
21641667ceaSmrg    XCOMM the startx session being seen as inactive:
21741667ceaSmrg    XCOMM "https://bugzilla.redhat.com/show_bug.cgi?id=806491"
21841667ceaSmrg    tty=$(tty)
219d712a854Smrg    if expr "$tty" : '/dev/tty[0-9][0-9]*$' > /dev/null; then
2207aed6334Smrg        tty_num=${tty#/dev/tty}
221d712a854Smrg        vtarg="vt$tty_num -keeptty"
22241667ceaSmrg    fi
223ac57ed83Smrgfi
22441667ceaSmrg
2251b180c10Smrg    XCOMM For compatibility reasons, only use xserverrc if there were no server command line arguments
226ac57ed83Smrg    if [ "$serverargs" = "" ] && [ "$display" = "" ]; then
22772e81212Smrg	if [ -f "$userserverrc" ]; then
228a73027baSmrg	    server=$userserverrc
22972e81212Smrg	elif [ -f "$sysserverrc" ]; then
230a73027baSmrg	    server=$sysserverrc
231a73027baSmrg	fi
232a73027baSmrg    fi
233a73027baSmrgfi
234a73027baSmrg
2351b180c10SmrgXCOMM if no server arguments, use defaults
236ac57ed83Smrgif [ "$serverargs" = "" ]; then
2371b180c10Smrg    serverargs=$defaultserverargs
2381b180c10Smrgfi
2391b180c10Smrg
24041667ceaSmrgXCOMM if no vt is specified add vtarg (which may be empty)
24141667ceaSmrghave_vtarg="no"
24241667ceaSmrgfor i in $serverargs; do
2435dda8871Swiz    if expr "$i" : 'vt[0-9][0-9]*$' > /dev/null; then
24441667ceaSmrg        have_vtarg="yes"
24541667ceaSmrg    fi
24641667ceaSmrgdone
24741667ceaSmrgif [ "$have_vtarg" = "no" ]; then
24841667ceaSmrg    serverargs="$serverargs $vtarg"
24941667ceaSmrgfi
25041667ceaSmrg
2511b180c10SmrgXCOMM if no display, use default
252ac57ed83Smrgif [ "$display" = "" ]; then
2531b180c10Smrg    display=$defaultdisplay
2541b180c10Smrgfi
2551b180c10Smrg
256ac57ed83Smrgif [ "$enable_xauth" = 1 ] ; then
257ac57ed83Smrg    if [ "$XAUTHORITY" = "" ]; then
258a73027baSmrg        XAUTHORITY=$HOME/.Xauthority
259a73027baSmrg        export XAUTHORITY
260a73027baSmrg    fi
261a73027baSmrg
262a73027baSmrg    removelist=
263a73027baSmrg
264a73027baSmrg    XCOMM set up default Xauth info for this machine
265ac57ed83Smrg    hostname="$(uname -n)"
266a73027baSmrg
267a73027baSmrg    authdisplay=${display:-:0}
268ac57ed83Smrg    if [ -n "$has_cookie_maker" ] && [ -n "$mk_cookie" ] ; then
269ac57ed83Smrg        mcookie=$($mk_cookie)
270a73027baSmrg    else
271ac57ed83Smrg        if [ -r /dev/urandom ]; then
272ac57ed83Smrg            mcookie=$(dd if=dev/urandom bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\")
273ac57ed83Smrg        else
274ac57ed83Smrg            mcookie=$(dd if=/dev/random bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\")
275ac57ed83Smrg        fi
276a73027baSmrg    fi
277ac57ed83Smrg    if [ "$mcookie" = "" ]; 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
289ac57ed83Smrg
290ac57ed83Smrg    case "$(uname -s)" in
291ac57ed83Smrg    CYGWIN*|Darwin)
292ac57ed83Smrg        xserverauthfilequoted=$(echo ${xserverauthfile} | sed "s/'/'\\\\''/g")
293ac57ed83Smrg        serverargs=${serverargs}" -auth '"${xserverauthfilequoted}"'"
294ac57ed83Smrg        ;;
295ac57ed83Smrg    *)
296ac57ed83Smrg        serverargs=${serverargs}" -auth "${xserverauthfile}
297ac57ed83Smrg        ;;
298ac57ed83Smrg    esac
299a73027baSmrg
300a73027baSmrg    XCOMM now add the same credentials to the client authority file
301a73027baSmrg    XCOMM if '$displayname' already exists do not overwrite it as another
302d712a854Smrg    XCOMM server may need it. Add them to the '$xserverauthfile' instead.
303a73027baSmrg    for displayname in $authdisplay $hostname$authdisplay; do
304ac57ed83Smrg        authcookie=$(xauth list "$displayname" @@
305ac57ed83Smrg        | sed -n 's/.*'"$displayname"'[[:space:]*].*[[:space:]*]//p' 2>/dev/null);
306a73027baSmrg        if [ "z${authcookie}" = "z" ] ; then
307ac57ed83Smrg            $xauth -q << EOF
308a73027baSmrgadd $displayname . $mcookie
309a73027baSmrgEOF
310a73027baSmrg        removelist="$displayname $removelist"
311a73027baSmrg        else
312a73027baSmrg            dummy=$(($dummy+1));
313ac57ed83Smrg            $xauth -q -f "$xserverauthfile" << EOF
314a73027baSmrgadd :$dummy . $authcookie
315a73027baSmrgEOF
316a73027baSmrg        fi
317a73027baSmrg    done
318a73027baSmrgfi
319a73027baSmrg
320ac57ed83Smrgcase "$(uname -s)" in
321ac57ed83SmrgCYGWIN_NT*|Darwin)
322ac57ed83Smrg    eval $xinit \"$client\" $clientargs -- \"$server\" $display $serverargs
323ac57ed83Smrg    ;;
324ac57ed83Smrg*)
325ac57ed83Smrg    $xinit "$client" $clientargs -- "$server" $display $serverargs
326ac57ed83Smrg    ;;
327ac57ed83Smrgesac
328bf4a254eSmrgretval=$?
329a73027baSmrg
330ac57ed83Smrgif [ "$enable_xauth" = 1 ] ; then
331ac57ed83Smrg    if [ "$removelist" != "" ]; then
332ac57ed83Smrg        $xauth remove $removelist
333a73027baSmrg    fi
334ac57ed83Smrg    if [ "$xserverauthfile" != "" ]; then
33572e81212Smrg        rm -f "$xserverauthfile"
336a73027baSmrg    fi
337a73027baSmrgfi
338a73027baSmrg
339ac57ed83SmrgXCOMM various machines need special cleaning up
340ac57ed83Smrgif [ "$(uname -s)" = "Linux" ]; then
341ac57ed83Smrg    if command -v deallocvt > /dev/null 2>&1; then
342ac57ed83Smrg        deallocvt
343ac57ed83Smrg    fi
344a73027baSmrgfi
345a73027baSmrg
346ac57ed83Smrgif [ "$(uname -s)" = "SunOS" ]; then
347ac57ed83Smrg    kbd_mode -a
348ac57ed83Smrgfi
349bf4a254eSmrg
350bf4a254eSmrgexit $retval
351