#!/bin/bash
# setime                  by Jun Nishii <jun@vinelinux.org>
#                    Time-stamp: <2008-03-08 18:44:29 munepi>
#
#     atok entry is by Takeshi Isobe <isobe@ps.namco.co.jp>

. /usr/share/vine/functions

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

ShowUsage_C() {
cat <<EOF
  Usage:  setime [-k] {scim|wnn8le|wnn8scim|wnn7xwnmo|wnn6xwnmo|atokx|atokx2|atokx3|vje|uim|ibus|none|status}

     scim:      set SCIM as default input method and start scim
                 (scim-bridge-{gtk,qt} and scim is automarically selected)
     wnn8le:    set Wnn8 as default input method and start wnn8le
     wnn8scim:  set Wnn8 as default input method and start scim
     wnn7xwnmo: set Wnn7 as default input method and start xwnmo
     wnn6xwnmo: set Wnn6 as default input method and start xwnmo
     atokx:     set Atok X as default input method
     atokx2:    set "ATOK for Linux" as default input method
     atokx3:    set "ATOK X3 for Linux" as default input method
     vje:       set VJE-Delta as default input method and start vje
     skk:       set SKK as default input method and start skkinput
     uim:       set UIM as default input method and start uim-xim
     ibus:      set IBus as default input method and start ibus-daemon
     default:   start default scim
     none:      do not use input method
     status:    get information about current environment for Kanji input methods

     Options
	    -k: do not restart kinput2
EOF
}

ShowUsage_ja() {
cat <<EOF
  使用法:  setime [-k]{scim|wnn8le|wnn8scim|wnn7xwnmo|wnn6xwnmo|atokx|atokx2|atokx3|vje|uim|ibus|none|status}

     scim:      SCIM をデフォルトの漢字変換システムとし、scim を起動します
                 (scim-bridge-{gtk,qt} と scim は自動選択されます)
     wnn8le:    Wnn8 をデフォルトの漢字変換システムとし、wnn8le を起動します
     wnn8scim:  Wnn8 をデフォルトの漢字変換システムとし、scim を起動します
     wnn7xwnmo: Wnn7 をデフォルトの漢字変換システムとし、xwnmo を起動します
     wnn6xwnmo: Wnn6 をデフォルトの漢字変換システムとし、xwnmo を起動します
     atokx:     Atok X をデフォルトの漢字変換システムとします
     atokx2:    "ATOK for Linux" をデフォルトの漢字変換システムとします
     atokx3:    "ATOK X3 for Linux" をデフォルトの漢字変換システムとします
     vje:       VJE-Deltaをデフォルトの漢字変換システムとし、vje を起動します
     skk:       SKKをデフォルトの漢字変換システムとし、skkinput を起動します
     uim:       UIM をデフォルトの漢字変換システムとし、uim-xim を起動します
     ibus:      IBus をデフォルトの漢字変換システムとし、ibus-daemon を起動します
     default:   デフォルトの漢字変換システムを用いて、scim を起動します
     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
}

AtokX2NotAliveMsg_ja(){
cat <<EOF
    Atok X2 サーバが走ってません!
    Atok X2 サーバを起動して再挑戦してください!
    終了します...
EOF
}

AtokX2NotAliveMsg_C(){
cat <<EOF
    Atok X2 server is NOT running!
    Start Atok X2 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 "Configuration finished."
echo "A new configuration is effective on new shells."
isXRunning && (echo "To effect this configuration to all applications, You should restart X Window System.")
}

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."
}

Wnn8scimCreateDic_ja(){
    echo "辞書を生成しますので，しばらくお待ち下さい......"
}

Wnn8scimCreateDic_C(){
    echo "Now generating your dictionaries. Please wait for a little......"
}

########## 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
		;;
	atokx3* | Atokx3*)
		STATUS=atokx3
		;;
	atokx2* | Atokx2*)
		STATUS=atokx2
		;;
	atokx* | Atokx*)
		STATUS=atokx
		;;
	vje*|VJE*)
		STATUS=vje
		;;
	skk*|SKK*)
		STATUS=skk
		;;
	uim*|UIM*|anthy*)
		STATUS=uim
		;;
	scim*|SCIM*)
		STATUS=scim
		;;
	ibus*|IBUS*)
		STATUS=ibus
		;;
	No_IM)
		STATUS=No_IM
		;;
	*)
		STATUS=unknown
		return -1
		;;
esac
return 0
}

ShowIMEStatus() {

CANNARPM=Canna
WNNRPM=FreeWnn
WNN8RPM_S=wnn8-server
WNN8RPM_C=wnn8-le
WNN7RPM_S=wnn7-server
WNN7RPM_C=wnn7-xclients
WNN6RPM=wnn6
ATOKXRPM=atokx
ATOKX2RPM=atokx
ATOKX3RPM=atokx
VJERPM=vje-delta
ANTHYRPM=anthy
UIMXIMRPM=uim-xim
UIMRPM=uim
SCIMRPM=scim
SCIMBRIDGERPM=scim-bridge
SCIMANTHYRPM=scim-anthy
SCIMWNNRPM=scim-wnn
IBUSRPM=ibus

eval IMEMsg_$LOCALE
cat<<EOF
-----------------------------------------
`eval CurIMEMsg_${LOCALE}`
${STATUS}
-----------------------------------------
`eval PackageStatMsg_${LOCALE}`
[SCIM]  `LANG=${LOCALE} LC_ALL=${LOCALE} rpm -q ${SCIMRPM} 2>&1`
[SCIM-Bridge]  `LANG=${LOCALE} LC_ALL=${LOCALE} rpm -q ${SCIMBRIDGERPM} 2>&1`
[SCIM-Anthy]  `LANG=${LOCALE} LC_ALL=${LOCALE} rpm -q ${SCIMANTHYRPM} 2>&1`
[SCIM-Wnn]  `LANG=${LOCALE} LC_ALL=${LOCALE} rpm -q ${SCIMWNNRPM} 2>&1`
[Anthy]  `LANG=${LOCALE} LC_ALL=${LOCALE} rpm -q ${ANTHYRPM} 2>&1`
[UIM]  `LANG=${LOCALE} LC_ALL=${LOCALE} rpm -q ${UIMRPM} 2>&1`
[IBUS] `LANG=${LOCALE} LC_ALL=${LOCALE} rpm -q ${IBUSRPM} 2>&1`
[Canna] `LANG=${LOCALE} LC_ALL=${LOCALE} rpm -q ${CANNARPM}`
[Wnn]   `LANG=${LOCALE} LC_ALL=${LOCALE} rpm -q ${WNNRPM} 2>&1`
[Wnn8 server] `LANG=${LOCALE} LC_ALL=${LOCALE} rpm -q ${WNN8RPM_S} 2>&1`
[Wnn8 client] `LANG=${LOCALE} LC_ALL=${LOCALE} rpm -q ${WNN8RPM_C} 2>&1`
[Wnn7 server] `LANG=${LOCALE} LC_ALL=${LOCALE} rpm -q ${WNN7RPM_S} 2>&1`
[Wnn7 client] `LANG=${LOCALE} LC_ALL=${LOCALE} rpm -q ${WNN7RPM_C} 2>&1`
[Wnn6]  `LANG=${LOCALE} LC_ALL=${LOCALE} rpm -q ${WNN6RPM} 2>&1`
[Atokx] `LANG=${LOCALE} LC_ALL=${LOCALE} rpm -q ${ATOKXRPM} 2>&1`
[AtokX2] `LANG=${LOCALE} LC_ALL=${LOCALE} rpm -q ${ATOKX2RPM} 2>&1`
[AtokX3] `LANG=${LOCALE} LC_ALL=${LOCALE} rpm -q ${ATOKX3RPM} 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}
WNN8_FRONT_END=${WNN8_FRONT_END}
WNN7_FRONT_END=${WNN7_FRONT_END}
WNN8_SERVER=${WNN8_SERVER}
WNN7_SERVER=${WNN7_SERVER}
WNN6_FRONT_END=${WNN6_FRONT_END}
WNN6_SERVER=${WNN6_SERVER}
GTK_IM_MODULE=${GTK_IM_MODULE}
QT_IM_MODULE=${QT_IM_MODULE}
-----------------------------------------
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 ! (/sbin/pidof -s atokmngdaemon >& /dev/null); then
    eval AtokxNotAliveMsg_$LOCALE
    return -1
fi
return 0
}

isAtokX2Alive(){
if ! (/sbin/pidof -s atokx2mngdaemon >& /dev/null); then
    eval AtokX2NotAliveMsg_$LOCALE
    return -1
fi
return 0
}

isVjeAlive(){
if ! (/sbin/pidof -s vjed >& /dev/null) ; then
    eval VjeNotAliveMsg_$LOCALE
    return -1
fi
return 0
}

Wnn8Exists(){

if [ -f /usr/lib/wnn8/ja_JP/wnnenvrc ] \
&& [ -x /usr/sbin/jserver ]; then
    return 0
else
    return -1
fi
}

Wnn7Exists(){

if [ -f /usr/lib/wnn7/ja_JP/wnnenvrc ] \
&& [ -x /usr/sbin/jserver ]; then
    return 0
else
    return -1
fi
}

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
}

AtokX3Exists(){
if [ -f "/opt/atokx3/lib/client/atokx3auxd" ] ; then
    return 0
else
    return -1
fi
}

AtokX2Exists(){
if [ -f "/opt/atokx2/sbin/atokx2mngdaemon" ] ; 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"
    GTK_IM_MODULE=xim
    QT_IM_MODULE=xim
    TK_KCPROTO=kinput2
}

startUimXim(){
    if [ -z "`pidofmyproc uim-xim`" ] ; then
      uim-xim >& /dev/null &
    fi
    TK_KCPROTO=xim
}

startScim(){
    if [ -z "`pidofmyproc scim-launcher`" ] ; then
      scim -d >& /dev/null
    fi
    TK_KCPROTO=xim
}

startIbus(){
    if [ -z "`pidofmyproc ibus-daemon`" ] ; then
      ibus-daemon >& /dev/null &
    fi
    TK_KCPROTO=xim
}

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

setSKK(){
    XMODIFIERS="@im=skkinput"
    TK_KCPROTO=kinput2
    checkKinput2Mod && kinput2ctl stop
    checkStart skkinput
    return 0
}

setUIM(){
    startUimXim
    XMODIFIERS="@im=uim"
    GTK_IM_MODULE=uim
    QT_IM_MODULE=uim
    rpm -q --quiet uim-qt-immodule || QT_IM_MODULE=xim
    checkKinput2Mod && kinput2ctl stop
    checkStart uim-xim
    return 0
}

setSCIM() {
    XMODIFIERS="@im=SCIM"
    GTK_IM_MODULE=scim
    QT_IM_MODULE=xim
    rpm -q --quiet scim-bridge-gtk && GTK_IM_MODULE=scim-bridge
    rpm -q --quiet scim-qtimm && QT_IM_MODULE=scim
    rpm -q --quiet scim-bridge-qt && QT_IM_MODULE=scim-bridge
    rpm -q --quiet scim-bridge-qt4 && QT_IM_MODULE=scim-bridge
    export XMODIFIERS GTK_IM_MODULE QT_IM_MODULE
    startScim
    checkKinput2Mod && kinput2ctl stop
    return 0
}

setIBUS() {
    XMODIFIERS="@im=ibus"
    GTK_IM_MODULE=ibus
    QT_IM_MODULE=ibus
    export XMODIFIERS GTK_IM_MODULE QT_IM_MODULE
    startIbus
    checkKinput2Mod && kinput2ctl stop
    return 0
}

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

killWnn8le(){
	killall WnnPaletteAux >/dev/null 2>&1
	killall httx >/dev/null 2>&1
	killall WnnMsgDspAux >/dev/null 2>&1
}

setWnn8(){
isWnnAlive || return -1
echo "WNN8_FRONT_END: " $WNN8_FRONT_END
case "$WNN8_FRONT_END" in
    le)
        checkKinput2Mod && kinput2ctl stop
	isXRunning && \
   	(if [ -f ${HOME}/.Xdefaults ]; then
      		xrdb -merge ${HOME}/.Xdefaults
   	elif [ -f ${HOME}/.Xresources ]; then
      		xrdb -merge ${HOME}/.Xresources
    	fi) \
	&& \
	export XMODIFIERS=@im=htt; export HTT_DISABLE_STATUS_WINDOW=t; \
	/usr/lib/im/httx -if Wnn8LE -lc_basiclocale ja_JP -xim htt_xbe &
        XMODIFIERS="@im=htt"
	HTT_DISABLE_STATUS_WINDOW=t
	GTK_IM_MODULE=xim
	QT_IM_MODULE=xim
        TK_KCPROTO=htt
	;;
    scim)
	# ## check scim-wnn package
	# if ! [ -f "/usr/share/scim/icons/scim-wnn.png" ]; then
	# fi

	## kill other frontends
        checkKinput2Mod && kinput2ctl stop && killXwnmo && killWnn8le

	## start SCIM
	setSCIM

	## generate basic user dictionaries for the first time
	## Note: need wnn8-le
	if test ! -d /var/lib/wnn8/dic/usr/`whoami`/; then
	    Wnn8scimCreateDic_$LOCALE
	    /usr/lib/im/httx -if Wnn8LE -lc_basiclocale ja_JP -xim htt_xbe &
	    while test ! -d /var/lib/wnn8/dic/usr/`whoami`/;
	    do 
		sleep 3
	    done
	    killWnn8le
	fi
	;;
    *)
	WNN8_FRONT_END=kinput2
	checkKinput2Mod && startKinput2 wnn8 && killXwnmo
	;;
esac
return 0
}

setWnn7(){
isWnnAlive || return -1
echo "WNN7_FRONT_END: " $WNN7_FRONT_END
case "$WNN7_FRONT_END" in
    xwnmo)
        checkKinput2Mod && kinput2ctl stop
	XWNMO_PROG=/usr/X11R6/bin/xwnmo
	XWNMO_RPM=`rpm -q wnn7-xclients`
	case "$XWNMO_RPM" in
	    wnn7-xclients-1.01-*)
		# 1.00 doesn't have --gtk_expose_patch option
		# 1.01 needs --gtk_expose_patch option for Vine's gtk+
		# after 1.02 doesn't need --gtk_expose_patch option
		XWNMO_OPT=--gtk_expose_patch
		;;
	    wnn7-xclients-1.03-*)
		# 1.03 needs -map option for nautilus on Gnome2
		# after 1.03(1.04 or 1.1?), unknown this requirements.
		XWNMO_OPT=-map
		;;
	esac
	XWNMO_GEOM=1x1-0-48
	isXRunning && (checkStart $XWNMO_PROG $XWNMO_OPT -D ${WNN7_SERVER:=localhost} -g $XWNMO_GEOM) && sleep 2
        XMODIFIERS="@im=_XWNMO"
	GTK_IM_MODULE=xim
	QT_IM_MODULE=xim
        TK_KCPROTO=xim
	;;
    *)
	WNN7_FRONT_END=kinput2
	checkKinput2Mod && startKinput2 wnn7 && killXwnmo
	;;
esac
return 0
}

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
	GTK_IM_MODULE=xim
	QT_IM_MODULE=xim
	TK_KCPROTO=xim
	;;
    *)
	WNN6_FRONT_END=kinput2
	checkKinput2Mod && startKinput2 wnn6 && killXwnmo
	;;
esac
return 0
}

setFreeWnn(){
isWnnAlive || return -1
checkKinput2Mod && startKinput2 FreeWnn
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: Kanji Zenkaku_Hankaku <Shift>space" | /usr/X11R6/bin/xrdb -m
    else
        echo "*conversionOnKeys: Kanji Zenkaku_Hankaku <Ctrl>space" | /usr/X11R6/bin/xrdb -m
    fi
    LD_PRELOAD=/usr/X11R6/lib/libXi.so.6 /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
     usleep 100000
     times=$[$times+1]
     if [ $times -ge "30" ]; then
         break
     fi
    done

fi

return 0
}

setAtokX2(){
isAtokX2Alive || 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
export GTK_IM_MODULE=iiim
export QT_IM_MODULE=xim

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

   if [ -f ${HOME}/.Xdefaults ]; then
      xrdb -merge ${HOME}/.Xdefaults
    fi
    /usr/lib/im/httx -if atokx2 -xim htt_xbe &

fi

return 0
}

setAtokX3(){
export XMODIFIERS="@im=iiimx"
export HTT_DISABLE_STATUS_WINDOW=t
export HTT_GENERATES_KANAKEY=t
export HTT_USES_LINUX_XKEYSYM=t
export HTT_IGNORES_LOCK_MASK=t
export JS_FEEDBACK_CONVERT=t
export GTK_IM_MODULE=iiim
export QT_IM_MODULE=xim

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

   if [ -f ${HOME}/.Xdefaults ]; then
      xrdb -merge ${HOME}/.Xdefaults
    fi
    /usr/bin/iiimx -iiimd

fi

return 0
}

setVje(){
isVjeAlive || return -1
    XMODIFIERS="@im=vje"
    GTK_IM_MODULE=xim
    QAT_IM_MODULE=xim
    echo "Emacs*useXim: true" | /usr/X11R6/bin/xrdb -m
    echo "Emacs*useXIM: true" | /usr/X11R6/bin/xrdb -m
    times=0
    ( while :
      do
        if [ $(ps xc | grep nautilus | wc -l) -ge "2" ]; then
	  sleep 2
	  break
	fi
        sleep 1
	times=$[$times+1]
	if [ $times -ge "10" ]; then
	  break
	fi
      done && PATH=$PATH:/usr/sbin 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:-scim}
    FE=${WNN6_FRONT_END}
else
    TARGET=$1
fi

case "$TARGET" in
	canna)
		eval SettingIMMsg_$LOCALE canna
		EMACS_IME=canna
		XIM_PROG=canna
		setCanna ;;
	wnn8)
		eval SettingIMMsg_$LOCALE wnn8
		WNNTAG=wnn8
		EMACS_IME=wnn8
		XIM_PROG=wnn8
		WNN8_FRONT_END=${FE:=le}
	    setWnn8 ;;
	wnn7)
		eval SettingIMMsg_$LOCALE wnn7
		WNNTAG=wnn7
		EMACS_IME=wnn7
		XIM_PROG=wnn7
		WNN7_FRONT_END=${FE:=xwnmo}
	    setWnn7 ;;
	wnn6)
		eval SettingIMMsg_$LOCALE wnn6
		WNNTAG=wnn6
		EMACS_IME=wnn6
		XIM_PROG=wnn6
		WNN6_FRONT_END=${FE:=kinput2}
	    setWnn6 ;;
	FreeWnn)
		eval SettingIMMsg_$LOCALE FreeWnn
		WNNTAG=FreeWnn
		EMACS_IME=wnn
		XIM_PROG=FreeWnn
	    setFreeWnn ;;
	wnn)
	    XIM_PROG=wnn
	    WNN6_FRONT_END=kinput2
            WNN7_FRONT_END=xwnmo
            WNN8_FRONT_END=le
            if Wnn8Exists ; then
                eval SettingIMMsg_$LOCALE wnn8
                WNNTAG=wnn8
		EMACS_IME=wnn8
            elif Wnn7Exists ; then
                eval SettingIMMsg_$LOCALE wnn7
                WNNTAG=wnn7
		EMACS_IME=wnn7
            elif Wnn6Exists ; then
		eval SettingIMMsg_$LOCALE wnn6
		WNNTAG=wnn6
		EMACS_IME=wnn6
	    elif FreeWnnExists ; then
		eval SettingIMMsg_$LOCALE FreeWnn
		WNNTAG=FreeWnn
		EMACS_IME=wnn
	    else
		eval NoIMMsg_$LOCALE wnn
		return -1
	    fi
	    case "$WNNTAG" in
		wnn8) setWnn8 ;;
		wnn7) setWnn7 ;;
		wnn6) setWnn6 ;;
		FreeWnn) setFreeWnn ;;
	    esac
	    ;;
	atokx)
		eval SettingIMMsg_$LOCALE atokx
		EMACS_IME=atokx
		XIM_PROG=atokx
	    setAtokx
	    ;;
	atokx2)
		eval SettingIMMsg_$LOCALE atokx2
		EMACS_IME=atokx2
		XIM_PROG=atokx2
	    setAtokX2
	    ;;
	atokx3)
		eval SettingIMMsg_$LOCALE atokx3
		EMACS_IME=atokx3
		XIM_PROG=atokx3
	    setAtokX3
	    ;;
	vje)
	    eval SettingIMMsg_$LOCALE vje
	    EMACS_IME=vje
	    XIM_PROG=vje
	    setVje
	    ;;
	uim)
	    eval SettingIMMsg_$LOCALE uim
	    EMACS_IME=uim
	    XIM_PROG=uim
	    setUIM
	    ;;
	scim)
	    eval SettingIMMsg_$LOCALE scim
	    EMACS_IME=scim
	    XIM_PROG=scim
	    setSCIM
	    ;;
	ibus)
	    eval SettingIMMsg_$LOCALE ibus
	    EMACS_IME=anthy
	    XIM_PROG=ibus
	    setIBUS
	    ;;
	skk)
	    eval SettingIMMsg_$LOCALE skk
	    EMACS_IME=skk
	    XIM_PROG=skk
	    setSKK
	    ;;
	none|No_IM)
	    eval SettingIMMsg_$LOCALE No_IM
	    EMACS_IME=No_IM
	    XIM_PROG=No_IM
	    setNone
	    ;;
esac

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

CANNA_SERVER=${CANNA_SERVER:=unix}

cat <<EOF >${USERIME}
EMACS_IME=${EMACS_IME}
XIM_PROG=${XIM_PROG}
JSERVER=${JSERVER:=localhost}
WNN8_FRONT_END=${FE:=le}
WNN7_FRONT_END=${FE:=xwnmo}
WNN6_FRONT_END=${FE:=kinput2}
WNN8_SERVER=${WNN8_SERVER:=localhost}
WNN7_SERVER=${WNN7_SERVER:=localhost}
WNN6_SERVER=${WNN6_SERVER:=localhost}
CANNA_SERVER=${CANNA_SERVER/localhost/unix}
GTK_IM_MODULE=${GTK_IM_MODULE}
QT_IM_MODULE=${QT_IM_MODULE}
XMODIFIERS=${XMODIFIERS}
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 AtokX2NotAliveMsg_ja AtokX2NotAliveMsg_C
unset -f VjeNotAliveMsg_ja VjeNotAliveMsg_C
unset -f NoIMMsg_ja NoIMMsg_C ExitMsg_ja ExitMsg_C xwnmoWarning_ja xwnmoWarning_C
unset -f Wnn8scimCreateDic_C Wnn8scimCreateDic_ja
unset -f setLocale CheckOption CheckXIMStatus ShowIMEStatus isCannaAlive isWnnAlive
unset -f isAtokxAlive AtokxExists setAtokx
unset -f isAtokX2Alive AtokX2Exists setAtokX2
unset -f AtokX3Exists setAtokX3
unset -f isVjeAlive setVje
unset -f Wnn8Exists Wnn7Exists Wnn6Exists FreeWnnExists checkKinput2Mod startKinput2 setCanna killXwnmo
unset -f setWnn8 setWnn7 setWnn6 setFreeWnn setIME setNone unsetImeFuncs
unset -f setSKK
unset -f setUIM startUimXim
unset -f setSCIM startScim
unset -f setIBUS startIbus
}
