#! /bin/bash
# Display Manager Selecter
#          Developed by Kawamura <kawamura@ic.sci.yamaguchi-u.ac.jp>
#          Time-stamp: <2000-12-19 10:57:14 vine>

DM_TYPE=/etc/sysconfig/dmtype

. /usr/share/vine/functions

#################### Messages
function RootMsg_C (){
    echo "Only root user can execute this command."
}

function RootMsg_ja (){
    echo "ルートユーザのみが実行できます。"
}

function ChangeMsg_C(){
    echo "Display manager has changed to $1."
    if [ ${TERM} != "linux" ]; then
        echo "You need to restart the X Window System."
        echo -n "Restart now? [y/n] "
    fi

}

function ChangeMsg_ja(){
    echo "ディスプレイマネージャを $1に変更しました。"
    echo "X Window Systemを再起動する必要があります。"
    echo -n "再起動しますか? [y/n] "
}

function UnChangeMsg_C(){
    echo "Display manager has NOT changed."
}

function UnChangeMsg_ja(){
    echo "ディスプレイマネージャは変更されませんでした。"
}

#################### Functions

function setLocale(){
case $LANG in
    ja*) LOCALE=ja ;;
    *)   LOCALE=C ;;
esac
[ ${TERM} = "linux" ] && LOCALE=C
}

function CheckDM() {
    local DM_path=`type -p $1`
    [ ${#DM_path} -gt 0 ] && return 0
    return 1
}

function Select(){
    local choice
    select choice
    do
        if [ "X$choice" = "Xexit" ]; then
            UnChangeMsg_$LOCALE
            exit
        fi
        setDM $choice
        break
    done
}

function Usage_C(){
cat <<EOF
Usage: ${0##*/} <display_manager>
<display_manager>...
EOF
    DM_list="exit"
    if CheckDM wdm; then
        echo "   wdm : WINGs Display Manager"
        DM_list="$DM_list wdm"
    fi
    if CheckDM xdm; then
        echo "   xdm : X Display Manager"
        DM_list="$DM_list xdm"
    fi
    if CheckDM kdm; then
        echo "   kdm : KDE Display Manager"
    DM_list="$DM_list kdm"
    fi
    if CheckDM gdm; then
        echo "   gdm : GNOME Display Manager"
    DM_list="$DM_list gdm"
    fi

    PS3="Select number> "
    echo
    echo "Select a display manager."
    Select $DM_list
}

function Usage_ja(){
    local DM_list
cat <<EOF
使い方: ${0##*/} <ディスプレイマネージャ名>
<ディスプレイマネージャ名>...
EOF
    DM_list="exit"
    if CheckDM wdm; then
        echo "   wdm : WINGs ディスプレイマネージャ"
        DM_list="$DM_list wdm"
    fi
    if CheckDM xdm; then
        echo "   xdm : X ディスプレイマネージャ"
        DM_list="$DM_list xdm"
    fi
    if CheckDM kdm; then
        echo "   kdm : KDE ディスプレイマネージャ"
        DM_list="$DM_list kdm"
    fi
    if CheckDM gdm; then
        echo "   gdm : GNOME ディスプレイマネージャ"
        DM_list="$DM_list gdm"
    fi

    PS3="番号を入力> "
    echo
    echo "ディスプレイマネージャを選択してください。"
    Select $DM_list
}

function killDM(){
    for dm in wdm.bin xdm kdm gdm
    do
        # Save basename.
        base=`basename $dm`

        # Find pid.
        pid=`pidofproc $base`

        # Kill it.
        if [ "$pid" != "" ] ; then
            echo -n "Running $base "
            kill -TERM $pid
            usleep 100000
            if ps h $pid >/dev/null 2>&1 ; then
                 sleep 3
                 kill -KILL $pid
            fi
        fi

        # Remove pid file if any.
        if [ -f /var/run/$base.pid ]; then
            rm -f /var/run/$base.pid
        fi
    done
}

function restartDM(){
    read yn
    if [ $yn = "y" -o $yn = "Y" ]; then
        killDM
        /etc/X11/prefdm
    fi
}

function setDM() {
    if CheckDM $1; then
        if [ -w $DM_TYPE ]; then
            ### Previous DM
            PreDM=`cat $DM_TYPE`
            [ $PreDM = "wdm" ] && PreDM="wdm.bin"

            ### Set New DM
            echo $1 > $DM_TYPE
            ChangeMsg_$LOCALE `cat $DM_TYPE`

            ### Restart
            [ ${TERM} = "linux" ] || restartDM
        else
            UnChangeMsg_$LOCALE
        fi
    else
        Usage_$LOCALE $1
    fi
}


#################### Main
setLocale

if [ $UID -gt 0 ]; then
    RootMsg_$LOCALE
    exit
fi

touch $DM_TYPE

case $1 in
    wdm | xdm | kdm | gdm )
        setDM $1
    ;;
    *)
        Usage_$LOCALE
    ;;
esac

exit
