#!/bin/bash
# setime                  by Jun Nishii <jun@vinelinux.org>
#                    Time-stamp: <2000-12-19 10:56:10 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|vje|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
     vje:     set VJE-Delta as default input method and start vje
     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|vje|none|status}

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

VjeNotAliveMsg_ja(){
cat <<EOF
    VJE ФäƤޤ!
    VJE Фưƺĩ路Ƥ!
    λޤ...
EOF
}

VjeNotAliveMsg_C(){
cat <<EOF
    VJE server is NOT running!
    Start VJE 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
		;;
	vje*|VJE*)
		STATUS=vje
		;;
	No_IM)
		STATUS=No_IM
		;;
	*)
		STATUS=unknown
		return -1
		;;
esac
return 0
}

ShowIMEStatus() {

CANNARPM=Canna
WNNRPM=FreeWnn
WNN6RPM=wnn6
ATOKXRPM=atokx
VJERPM=vje-delta

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

isVjeAlive(){
if [ ! -f /var/lock/subsys/vjed ]; then
    eval VjeNotAliveMsg_$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

   if [ -f ${HOME}/.Xdefaults ]; then
      xrdb -merge ${HOME}/.Xdefaults
    fi
    if [ -f "/usr/lib/im/locale/ja/atokserver/shift_space" ]; then
        echo "*conversionOnKeys: Zenkaku_Hankaku <Shift>space" | /usr/X11R6/bin/xrdb -m
    else
        echo "*conversionOnKeys: Zenkaku_Hankaku <Ctrl>space" | /usr/X11R6/bin/xrdb -m
    fi
    /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
}

setVje(){
isVjeAlive || return -1
vje &
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
	    ;;
	vje)
	    eval SettingIMMsg_$LOCALE vje
	    EMACS_IME=vje
	    XIM_PROG=vje
	    setVje
	    ;;
	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 VjeNotAliveMsg_ja VjeNotAliveMsg_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 isVjeAlive setVje
unset -f Wnn6Exists FreeWnnExists checkKinput2Mod startKinput2 setCanna killXwnmo
unset -f setWnn6 setFreeWnn setIME setNone unsetImeFuncs
}
