#!/bin/sh
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License, Version 1.0 only
# (the "License").  You may not use this file except in compliance
# with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
#

LING=${LC_CTYPE:-"$LC_ALL"}
LING=${LING:-"$LANG"}
LING=${LING:-"C"}

XIM_SCRIPT_DIR=/etc/X11/xinit/imf.d
XIM_USR_CONF=$HOME/.imf
IM_SCRIPT=''
IMFSELECTOR='/usr/bin/imf-selector'

tolines(){
    for imfile in $@
    do
        im_name=`sh $imfile -name`
        /bin/echo "$im_name|$imfile"
    done
}

list_ims(){

    # list available IM on system
    if [ ! -d $XIM_SCRIPT_DIR ]; then
        return
    fi
    s="$1"
    if [ X"$s" != X ]; then
        im_file=`LC_ALL=C /bin/ls $XIM_SCRIPT_DIR \
        | /bin/grep "[0-9][0-9]*\.$s\$"`
        if [ X$im_file != X ]; then
            im_name=`sh $XIM_SCRIPT_DIR/$im_file -name`
            /bin/echo "$im_name|$XIM_SCRIPT_DIR/$im_file"
        fi
        return
    fi

    LC_ALL=C /bin/ls -F $XIM_SCRIPT_DIR/[0-9][0-9]* \
    | /bin/egrep -v '@$|/$' | /bin/cut -d'*' -f 1

}

get_prior_im(){
    # Check specified default engine in for language
    # if this selection is done once and ignored, skip.
    if [ -f $XIM_USR_CONF ]; then 
        return
    fi

    list_ims | while read imfile
    do 
        prior_im=`sh $imfile -prior $LING` 
        if [ X"$prior_im" != X ]; then  
            echo "$prior_im"
            return
        fi
    done
}

get_default_im(){

    # As default, enable for only specified Asian locales
    case $LING in 
        ja* | zh* | ko* | th* | *_IN* )
        tolines `list_ims | /usr/bin/head -1`; break;;
        *) echo "None"
    esac
}

get_current_im(){

    # check IM scripts orderly.
    if [ -f $XIM_USR_CONF ]; then

        # 1. configuration in $HOME by tool
        im_name=`/bin/sh $XIM_USR_CONF -name`
        if [ X"$im_name" = X ]; then
            im_data="None"

            . "$XIM_USR_CONF" 
            if [ X"$IGNORE" = 'X1' ]; then
                im_data=""
            fi
        else
            im_data="$im_name|$XIM_USR_CONF"
        fi

    elif [ X$GTK_IM_MODULE != X ]; then

        # 2-1. user's GTK_IM_MODULE variable
        suffix=$GTK_IM_MODULE
        im_data=`list_ims $suffix`

    elif [ X$XMODIFIERS != X ]; then

        # 2-2. user's XMODIFIERS variable
        suffix=`/bin/echo $XMODIFIERS | cut -d '=' -f 2`
        im_data=`list_ims $suffix`

    fi
    if [ X"$im_data" != X ]; then
        /bin/echo "$im_data"
        return
    fi

    # 3. system default if nothing specified
    get_default_im
}

set_im(){

    # copy given script file to user config file.
    im_script="$1"

    if ! touch $XIM_USR_CONF > /dev/null 2>&1; then
        echo "Can not access config file: $XIM_USR_CONF" 1>&2
        return 1
    fi

    msg1="# This file is created by Input Method selector tool.\n"
    msg2="# Please don't edit this file manually."
    if [ X"$im_script" = X ]; then 
        /bin/echo "${msg1}${msg2}" > $XIM_USR_CONF
    elif [ X"$im_script" = XIGNORE ]; then 
        /bin/echo "${msg1}${msg2}" > $XIM_USR_CONF
        /bin/echo "IGNORE=1" >> $XIM_USR_CONF
    else
        /bin/cp $im_script $XIM_USR_CONF
    fi
    return $?
}

start_im(){

    # start IM
    if [ X$IM_SCRIPT != X -a -f $IM_SCRIPT ]; then
        . $IM_SCRIPT

        if [ -x $XIM_PRG -a X$XIM_ASDAEMON != X ]; then
            $XIM_PRG $XIM_OPT &
            DTSTARTIMS=False; export DTSTARTIMS
        elif [ -x $XIM_PRG ]; then
            $XIM_PRG $XIM_OPT
            DTSTARTIMS=False; export DTSTARTIMS
        fi
    fi
}

# Main
case $1 in
    '-list')    tolines `list_ims`; exit $?;;
    '-default') get_default_im;       exit $?;;
    '-get')     get_current_im;       exit $?;;
    '-set')     set_im $2;            exit $?;;
esac

PRIOR_IM=`get_prior_im`
if [ X"$PRIOR_IM" != X ]; then
    (sleep 10 && $IMFSELECTOR -p "$PRIOR_IM") &
fi
IM_SCRIPT=`get_current_im | cut -d '|' -f 2`
start_im