#!/bin/bash
# setime                  by Jun Nishii <jun@vinelinux.org>
#                    Time-stamp: <2000-10-15 20:53:26 vine>
#
#     atok entry is by Takeshi Isobe <isobe@ps.namco.co.jp>

. /usr/share/vine/functions

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

ShowUsage.C() {
cat <<EOF
  Usage:  setime [-k] {canna|wnn|wnn6|wnn6xwnmo|FreeWnn|atokx|none|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
     atokx:   set Atok X as default input method
     default: start default kinput2
     none:    do not use input method and stop 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|atokx|none|status}

     canna:    ǥեȤδѴƥȤkinput2 ưޤ
     wnn:     Wnn ǥեȤδѴƥȤkinput2 ưޤ
	       (Wnn6  FreeWnn ϼư򤵤ޤ)
     wnn6:    Wnn6 ǥեȤδѴƥȤkinput2 ưޤ
     wnn6xwnmo:Wnn6 ǥեȤδѴƥȤxwnmo ưޤ
     FreeWnn: FreeWnn6 ǥեȤδѴƥȤkinput2 ưޤ
     atokx:   Atok X ǥեȤδѴƥȤޤ
     default: ǥեȤδѴƥѤơkinput2 ưޤ
     none:    ѴƥѤʤ
     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
}

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

AtokxNotAliveMsg.C(){
cat <<EOF
    Atokx server is NOT running!
    Start Atokx 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
		;;
	atokx* | Atokx*)
		STATUS=atokx
		;;
	No_IM)
		STATUS=No_IM
		;;
	*)
		STATUS=unknown
		return -1
		;;
esac
return 0
}

ShowIMEStatus() {

CANNARPM=Canna
WNNRPM=FreeWnn
WNN6RPM=wnn6
ATOKXRPM=atokx

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`
[Atokx] `LANG=${LOCALE} LC_ALL=${LOCALE} rpm -q ${ATOKXRPM} 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
}

isAtokxAlive(){
if [ -z "`ps ax | grep atokmngdaemon 2>/dev/null`" ]; then
    eval AtokxNotAliveMsg.$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
}

AtokxExists(){
if [ -f "/usr/lib/locale/ja/atokserver/atokmngdaemon" ] ; then
    return 0
else
    return -1
fi
}

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

startKinput2(){
    (cd /; 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
}

setAtokx(){
isAtokxAlive || return -1
export XMODIFIERS="@im=htt"
export TK_KCPROTO=htt
export HTT_DISABLE_STATUS_WINDOW=t
export HTT_GENERATES_KANAKEY=t
export HTT_USES_LINUX_XKEYSYM=t

if [ -z "`ps xc | grep httx`" -a -n "$DISPLAY" ]; then

    /usr/lib/im/httx -if atok12 -lc_basiclocale ja_JP -xim htt_xbe &

    times=0     

    while :    
    do
     if [ -n "`ps xc | grep LookupAux`" ]; then
         sleep 1
         break
     fi
     sleep 1
     times=$[$times+1]
     if [ $times -ge "30" ]; then
         break
     fi
    done

fi

return 0
}

setNone(){
    kinput2ctl stop
    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
	    ;;
	atokx)
	    if AtokxExists ; then
		eval SettingIMMsg.$LOCALE atokx
		EMACS_IME=atokx
		XIM_PROG=atokx
	    else
		eval NoIMMsg.$LOCALE atokx
		return -1
	    fi
	    setAtokx
	    ;;
	none|No_IM)
	    eval SettingIMMsg.$LOCALE No_IM
	    EMACS_IME=No_IM
	    XIM_PROG=No_IM
	    setNone
	    ;;
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
}

unsetImeFuncs(){
unset -f ShowUsage.C ShowUsage.ja IMEMsg.C IMEMsg.ja
unset -f CurIMEMsg.ja CurIMEMsg.C PackageStatMsg.ja PackageStatMsg.C
unset -f EnvVarMsg.ja EnvVarMsg.C SettingIMMsg.ja SettingIMMsg.C
unset -f CannaNotAliveMsg.ja CannaNotAliveMsg.C WnnNotAliveMsg.ja WnnNotAliveMsg.C
unset -f AtokxNotAliveMsg.ja AtokxNotAliveMsg.C 
unset -f NoIMMsg.ja NoIMMsg.C ExitMsg.ja ExitMsg.C xwnmoWarning.ja xwnmoWarning.C
unset -f setLocale CheckOption CheckXIMStatus ShowIMEStatus isCannaAlive isWnnAlive
unset -f isAtokxAlive AtokxExists setAtokx
unset -f Wnn6Exists FreeWnnExists checkKinput2Mod startKinput2 setCanna killXwnmo
unset -f setWnn6 setFreeWnn setIME setNone unsetImeFuncs
}
