#!/bin/bash -p
# setime                  by Jun Nishii <jun@vinelinux.org>
#                    Time-stamp: <2000-03-12 03:42:12 vine>

. /usr/share/vine/functions

##########  Messages #############################

ShowUsage.C() {
cat <<EOF
  Usage:  setime [-k] {canna|wnn|wnn6|wnn6xwnmo|FreeWnn|status}

     canna:   set Canna as default input method and start kinput2
     wnn:     set Wnn as default input method and start kinput2
	       (wnn6 and FreeWnn is automatically selected)
     wnn6:    set Wnn6 as default input method and start kinput2
     wnn6xwnmo:    set Wnn6 as default input method and start xwnmo
     FreeWnn: set FreeWnn as default input method and start kinput2
     default: start default kinput2
     status:  get information about current environment for Kanji input methods

     Options
	    -k: do not restart kinput2
EOF
}

ShowUsage.ja() {
cat <<EOF
  ˡ:  setime [-k]{canna|wnn|wnn6|wnn6xwnmo|FreeWnn|status}

     canna:    ǥեȤδѴƥȤkinput2 ưޤ
     wnn:     Wnn ǥեȤδѴƥȤkinput2 ưޤ
	       (Wnn6  FreeWnn ϼư򤵤ޤ)
     wnn6:    Wnn6 ǥեȤδѴƥȤkinput2 ưޤ
     wnn6xwnmo:    Wnn6 ǥեȤδѴƥȤxwnmo ưޤ
     FreeWnn: FreeWnn6 ǥեȤδѴƥȤkinput2 ưޤ
     default: ǥեȤδѴƥѤơkinput2 ưޤ
     status:  ߤΥƥˤ롢ˡ˴ؤɽޤ

     ץ
	    -k: kinput2 κƵư򤷤ʤ
EOF
}

IMEMsg.ja(){
cat <<EOF
Ķѿ ~/.vine/system/ime ⤷ /etc/sysconfig/ime ꤵƤޤ.
EOF
}

IMEMsg.C(){
cat <<EOF
The Environment Variables are set in ~/.vine/system/ime or /etc/sysconfig/ime.
EOF
}

CurIMEMsg.ja(){
echo "[ߤδϥƥ]"
}

CurIMEMsg.C(){
echo "[Current IME]"
}

PackageStatMsg.ja(){
echo "[ѥåΥ󥹥ȡ]"
}

PackageStatMsg.C(){
echo "[Package status]"
}

EnvVarMsg.ja(){
echo "[Ķѿ]"
}

EnvVarMsg.C(){
echo "[Environment Variables]"
}

SettingIMMsg.ja(){
echo "$1 Ԥޤ"
}

SettingIMMsg.C(){
    echo "setting up $1..."
}

CannaNotAliveMsg.ja(){
cat <<EOF
    ʴѴФäƤޤ!
    ʥФưƺĩ路Ƥ!
    λޤ...
EOF
}

CannaNotAliveMsg.C(){
cat <<EOF
    Canna server is NOT running!
    Start canna server and try again!
    Aborted...
EOF
}

WnnNotAliveMsg.ja(){
cat <<EOF
    Wnn ФäƤޤ!
    Wnn Фưƺĩ路Ƥ!
    λޤ...
EOF
}

WnnNotAliveMsg.C(){
cat <<EOF
    Wnn server is NOT running!
    Start Wnn server and try again!
    Aborted...
EOF
}

NoIMMsg.ja(){
cat <<EOF
    $1 Ĥޤ...
    λޤ.
EOF
}

NoIMMsg.C(){
cat <<EOF
    not found $1...
    exit set up.
EOF
}

ExitMsg.ja(){
echo "꤬λޤ."
echo "ϡ뤫ͭˤʤޤ"
isXRunning && (echo "ƤΥͭˤˤϡX window Ƶưɬפޤ.")
}

ExitMsg.C(){
echo "finished..."
isXRunning && (echo "I recommend you to restart X to validate this setting in all your shells.")
}

xwnmoWarning.ja(){
    echo "[Warning!] xwnmo ǥեȤΥץåȥ᥽åɤˤ,"
    echo "[Warning!] X window ե꡼礬ޤե꡼"
    echo "[Warning!] Ȥˤ Ctrl-Alt-BackSpace  X window "
    echo "[Warning!] λǤޤ"
    echo "[Warning!] xwnmo ȤȤˤϡ X window εư"
    echo "[Warning!] xwnmo εưԤȥ֥뤬ʤ褦Ǥ"
}

xwnmoWarning.C(){
    echo "[Warning!] Setting xwnmo as default xim is harmful."
    echo "[Warning!] I recommend to use kinput2 for default input methos."
}

########## end of Messages #############################3

setLocale(){
case $LANG in 
    ja*)LOCALE=ja ;;
    *) LOCALE=C ;;
esac
#isXRunning || LOCALE=C
if [ ${TERM} = "linux" ]; then
    LOCALE=C
fi
}

CheckOption() {
if [ $# != 1 ] ; then
    eval ShowUsage.$LOCALE ${0##*/}
    return -1
fi
return 0
}

CheckXIMStatus() {
case "$XIM_PROG" in
	canna* | Canna*)
		STATUS=canna
		;;
	wnn*|FreeWnn*|freewnn*)	
		STATUS=wnn
		;;
	*)
		STATUS=unknown
		return -1
		;;
esac
return 0
}

ShowIMEStatus() {

CANNARPM=Canna
WNNRPM=FreeWnn
WNN6RPM=wnn6

eval IMEMsg.$LOCALE
cat<<EOF
-----------------------------------------
`eval CurIMEMsg.${LOCALE}`
${STATUS}
-----------------------------------------
`eval PackageStatMsg.${LOCALE}`
[Canna] `LANG=${LOCALE} LC_ALL=${LOCALE} rpm -q ${CANNARPM}`
[Wnn]   `LANG=${LOCALE} LC_ALL=${LOCALE} rpm -q ${WNNRPM} 2>&1`
[Wnn6]  `LANG=${LOCALE} LC_ALL=${LOCALE} rpm -q ${WNN6RPM} 2>&1`
-----------------------------------------
`eval EnvVarMsg.${LOCALE}`
EMACS_IME=${EMACS_IME}
XIM_PROG=${XIM_PROG}
CANNA_SERVER=${CANNA_SERVER}
JSERVER=${JSERVER}
WNN6_FRONT_END=${WNN6_FRONT_END}
WNN6_SERVER=${WNN6_SERVER}
-----------------------------------------
EOF
}

isCannaAlive(){
if [ ! -n "`cannastat 2>/dev/null`" ]; then
    eval CannaNotAliveMsg.$LOCALE
    return -1
fi
return 0
}

isWnnAlive(){
if [ -n "`wnnstat 2>/dev/null| grep wnnstat`" ]; then
    eval WnnNotAliveMsg.$LOCALE
    return -1
fi
return 0
}

Wnn6Exists(){

#if [ -n "`rpm -q wnn6 2>/dev/null`" ]; then
if [ -f /etc/wnn6/ja_JP/wnnenvrc -o -f /usr/local/lib/wnn6/ja_JP/wnnenvrc ] \
&& [ -x /usr/sbin/jserver -o -x /usr/local/bin/jserver \
                          -o -x /usr/local/bin/Wnn6/jserver ]; then
    return 0
else
    return -1
fi
}

FreeWnnExists(){
#if [ -n "`rpm -q $WNNRPM 2>/dev/null`" ]; then
if [ -f /etc/FreeWnn/ja/wnnenvrc -a -x /usr/bin/jserver ] ; then
    return 0
else
    return -1
fi
}

checkKinput2Mod(){
    isXRunning || return -1
    return ${Kinput2mod:-0}
}

startKinput2(){
    kinput2ctl $1
    XMODIFIERS="@im=kinput2"
    TK_KCPROTO=kinput2
}

setCanna(){
isCannaAlive || return -1
checkKinput2Mod && startKinput2 canna && killXwnmo 
return 0
}

killXwnmo(){
    if [ ! -z `pidofmyproc xwnmo` ]; then
        if [ -x /usr/local/bin/Wnn6/killxwnmo ] ; then
            /usr/local/bin/Wnn6/killxwnmo
        else
            killxwnmo
        fi
    fi
}

setWnn6(){
isWnnAlive || return -1
echo "WNN6_FRONT_END: " $WNN6_FRONT_END
case "$WNN6_FRONT_END" in
    xwnmo)
	isXRunning || eval xwnmoWarning.$LOCALE
	checkKinput2Mod && kinput2ctl stop

	if [ -x /usr/local/bin/Wnn6/xwnmo ] ; then
		XWNMO_PROG=/usr/local/bin/Wnn6/xwnmo
	else
		XWNMO_PROG=xwnmo
	fi
	isXRunning && (checkStart $XWNMO_PROG -D ${WNN6_SERVER:=localhost} &)
	XMODIFIERS="@im=_XWNMO"
#	XMODIFIERS="@im=kinput2" # needed for emacs
	TK_KCPROTO=xim
	;;
    *)
	WNN6_FRONT_END=kinput2
	checkKinput2Mod && startKinput2 wnn && killXwnmo 
	;;
esac
return 0
}

setFreeWnn(){
isWnnAlive || return -1
checkKinput2Mod && startKinput2 wnn
return 0
}

setIME(){

SYSIME=/etc/sysconfig/ime
USERIMEDIR=$HOME/.vine/system/
USERIME=${USERIMEDIR}/ime

source ${SYSIME} 
[ -f ${USERIME} ] && source ${USERIME}

echo ${XIM_PROG}
if [ "$1" = "default" ]; then
    TARGET=${XIM_PROG:-canna}
    FE=${WNN6_FRONT_END}
else
    TARGET=$1
fi

case "$TARGET" in
	canna)
		eval SettingIMMsg.$LOCALE canna
		EMACS_IME=canna
		XIM_PROG=canna
		setCanna ;;
	wnn6)
	    if Wnn6Exists ; then
		eval SettingIMMsg.$LOCALE wnn6
		WNNTAG=wnn6
		EMACS_IME=wnn
		XIM_PROG=wnn6
		WNN6_FRONT_END=${FE:=kinput2}
	    else
		eval NoIMMsg.$LOCALE wnn6
		return -1
	    fi
	    setWnn6 ;;
	FreeWnn)
	    if FreeWnnExists ; then
		eval SettingIMMsg.$LOCALE FreeWnn
		WNNTAG=FreeWnn
		EMACS_IME=wnn
		XIM_PROG=FreeWnn
	    else
		eval NoIMMsg.$LOCALE FreeWnn
		return -1
	    fi
	    setFreeWnn ;;
	wnn)
	    EMACS_IME=wnn
	    XIM_PROG=wnn
	    WNN6_FRONT_END=kinput2
	    if Wnn6Exists ; then
		eval SettingIMMsg.$LOCALE wnn6
		WNNTAG=wnn6
	    elif FreeWnnExists ; then
		eval SettingIMMsg.$LOCALE FreeWnn
		WNNTAG=FreeWnn
	    else
		eval NoIMMsg.$LOCALE wnn
		return -1
	    fi
	    case "$WNNTAG" in
		wnn6) setWnn6 ;;
		FreeWnn) setFreeWnn ;;
	    esac
	    ;;
esac

[ -d ${USERIMEDIR} ] || mkdir -p ${USERIMEDIR}

cat <<EOF >${USERIME}
EMACS_IME=${EMACS_IME}
XIM_PROG=${XIM_PROG}
JSERVER=${JSERVER:=localhost}
WNN6_FRONT_END=${FE:=kinput2}
WNN6_SERVER=${WNN6_SERVER:=localhost}
CANNA_SERVER=${CANNA_SERVER:=localhost}
EOF
return 0
}

setime(){

setLocale

for arg in $* ; do
    case $arg in
	-k) Kinput2mod=-1; shift ;;
	-h) eval ShowUsage.$LOCALE ${0##*/} ; return 0 ;;
    esac
done

CheckOption $* || return -1
CheckXIMStatus

FE=kinput2
for arg in $* ; do
	case $arg in
	status)
		ShowIMEStatus
		return 0
		;;
	canna|Canna|CANNA)
		IM=canna
		;;
	wnn|Wnn|WNN)
		IM=wnn
		;;
	Wnn6|wnn6)
		IM=wnn6
		;;
	Wnn6xwnmo|wnn6xwnmo)
		FE=xwnmo
		IM=wnn6
		;;
	FreeWnn|freewnn|wnn4|Wnn4)
		IM=FreeWnn
		;;
	default)
		IM=default
		;;
	*) eval ShowUsage.$LOCALE ${0##*/} ; return 0
		;;
	esac
done

setIME $IM || return -1

export XMODIFIERS TK_KCPROTO
export EMACS_IME XIM_PROG JSERVER WNN6_FRONT_END WNN6_SERVER CANNA_SERVER

eval ExitMsg.$LOCALE
return 0
}
