diff -urN xinit-1.0.4.orig/startx.cpp xinit-1.0.4/startx.cpp --- xinit-1.0.4.orig/startx.cpp 2007-07-13 21:54:34.000000000 -0700 +++ xinit-1.0.4/startx.cpp 2007-07-13 21:55:49.000000000 -0700 @@ -64,8 +64,6 @@ userserverrc=$HOME/.xserverrc sysserverrc=XINITDIR/xserverrc -defaultclient=XTERM -defaultserver=XSERVER defaultclientargs="" defaultserverargs="" clientargs="" @@ -107,60 +105,41 @@ whoseargs="client" while [ x"$1" != x ]; do case "$1" in - XCOMM '' required to prevent cpp from treating "/*" as a C comment. - /''*|\./''*) - if [ "$whoseargs" = "client" ]; then - if [ x"$clientargs" = x ]; then - client="$1" - else - clientargs="$clientargs $1" - fi - else - if [ x"$serverargs" = x ]; then - server="$1" - else - serverargs="$serverargs $1" - fi - fi - ;; - --) - whoseargs="server" - ;; - *) - if [ "$whoseargs" = "client" ]; then - clientargs="$clientargs $1" - else - XCOMM display must be the FIRST server argument - if [ x"$serverargs" = x ] && @@ - expr "$1" : ':[0-9][0-9]*$' > /dev/null 2>&1; then - display="$1" - else - serverargs="$serverargs $1" - fi - fi - ;; + /''*|\.*) if [ "$whoseargs" = "client" ]; then + if [ "x$clientargs" = x ]; then + clientargs="$1" + else + clientargs="$clientargs $1" + fi + else + if [ "x$serverargs" = x ]; then + serverargs="$1" + else + serverargs="$serverargs $1" + fi + fi ;; + --) whoseargs="server" ;; + *) if [ "$whoseargs" = "client" ]; then + if [ "x$clientargs" = x ]; then + clientargs="$defaultclientargs $1" + else + clientargs="$clientargs $1" + fi + else + case "$1" in + :[0-9]*) display="$1"; serverargs="$serverargs $1";; + *) serverargs="$serverargs $1" ;; + esac + fi ;; esac shift done -XCOMM process client arguments -if [ x"$client" = x ]; then - XCOMM if no client arguments either, use rc file instead - if [ x"$clientargs" = x ]; then - client="$defaultclientargs" - else - client=$defaultclient - fi +if [ x"$clientargs" = x ]; then + clientargs="$defaultclientargs" fi - -XCOMM process server arguments -if [ x"$server" = x ]; then - XCOMM if no server arguments or display either, use rc file instead - if [ x"$serverargs" = x -a x"$display" = x ]; then - server="$defaultserverargs" - else - server=$defaultserver - fi +if [ x"$serverargs" = x ]; then + serverargs="$defaultserverargs" fi if [ x"$XAUTHORITY" = x ]; then @@ -217,15 +196,8 @@ #endif -#if defined(__SCO__) || defined(__UNIXWARE__) -if [ "$REMOTE_SERVER" = "TRUE" ]; then - exec SHELL_CMD ${client} -else - XINIT $client $clientargs -- $server $display $serverargs -fi -#else -XINIT $client $clientargs -- $server $display $serverargs -#endif +cleanup() { + [ -n "$PID" ] && kill $PID > /dev/null 2>&1 if [ x"$removelist" != x ]; then XAUTH remove $removelist @@ -251,3 +223,15 @@ #if defined(sun) kbd_mode -a #endif +} + + +trap cleanup 0 + +xinit $clientargs -- $serverargs -deferglyphs 16 & + +PID=$! + +wait $PID + +unset PID diff -urN xinit-1.0.4.orig/xinit.c xinit-1.0.4/xinit.c --- xinit-1.0.4.orig/xinit.c 2007-07-13 21:54:34.000000000 -0700 +++ xinit-1.0.4/xinit.c 2007-07-13 21:59:14.000000000 -0700 @@ -423,6 +423,7 @@ sigaction(SIGINT, &sa, NULL); sigaction(SIGHUP, &sa, NULL); sigaction(SIGPIPE, &sa, NULL); + sigaction(SIGTERM, &sa, NULL); signal(SIGALRM, sigAlarm); signal(SIGUSR1, sigUsr1);