# -*- shell-script -*-
# imsettings-functions
# Copyright (C) 2013-2016 Akira TAGOH
#
# Authors:
#   Akira TAGOH  <tagoh@redhat.com>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the
# Free Software Foundation, Inc., 51 Franklin Street, Fifth
# Floor, Boston, MA  02110-1301  USA

LOGDIR="${XDG_CACHE_HOME:-$HOME/.cache}/imsettings"
LOGFILE="$LOGDIR/log"

function log_init() {
    if [ ! -n "$DRY_RUN" ]; then
	if [ -f $HOME/.imsettings.log ]; then
	    mv $HOME/.imsettings.log $LOGFILE.bak
	fi
	[ -f $LOGFILE ] && mv $LOGFILE $LOGFILE.bak
	touch $LOGFILE
    fi
}

function log() {
    echo "$@" >> $LOGFILE
}

function is_dbus_enabled() {
    /usr/libexec/imsettings-check --check-dbus
    [ $? -eq 0 ]
}

function is_imsettings_enabled() {
    [ -z "$DISABLE_IMSETTINGS" ] && is_dbus_enabled
}

function check_imsettings_capability() {
    mod=$1
    /usr/libexec/imsettings-check --check-modules >/dev/null
    ret=$?
    if [ $ret -eq 0 ]; then
	/usr/libexec/imsettings-check --check-modulesettings -d | grep $mod >/dev/null
	ret=$?
    fi
    return $ret
}

function lookup_desktop() {
    ret=$(cat $1)
    case $ret in
	cinnamon*)
	    echo "cinnamon"
	    ;;
	gnome*)
	    echo "gnome"
	    ;;
	kde*|plasma)
	    echo "kde"
	    ;;
	lxsession*)
	    echo "LXDE"
	    ;;
	mate*)
	    echo "mate"
	    ;;
	xfce*)
	    echo "xfce"
	    ;;
	*)
	    echo "unknown"
	    ;;
    esac
}

function get_desktop() {
    if [ -n "$XDG_CURRENT_DESKTOP" ]; then
	GUESS_DESKTOP="\$XDG_CURRENT_DESKTOP"
	echo "$XDG_CURRENT_DESKTOP"
    elif [ -n "$IMSETTINGS_DESKTOP" ]; then
	GUESS_DESKTOP="\$IMSETTINGS_DESKTOP"
	echo "$IMSETTINGS_DESKTOP"
    elif [ -n "$GDMSESSION" ]; then
	GUESS_DESKTOP="\$GDMSESSION"
	echo "$GDMSESSION"
    elif [ -n "$DESKTOP_SESSION" ]; then
	GUESS_DESKTOP="\$DESKTOP_SESSION"
	if [ "$DESKTOP_SESSION" == "default" ]; then
	    if [ -x "$HOME/.xsession" ]; then
		GUESS_DESKTOP="$HOME/.xsession"
	    elif [ -x "$HOME/.Xclients" ]; then
		GUESS_DESKTOP="$HOME/.Xclients"
	    elif [ -f "/etc/sysconfig/desktop" ]; then
		GUESS_DESKTOP=" /etc/sysconfig/desktop"
		. /etc/sysconfig/desktop
		echo $DESKTOP
	    else
		echo "unknown"
	    fi
	else
	    echo "$DESKTOP_SESSION"
	fi
	[ "`echo \"$GUESS_DESKTOP\"|sed -e 's/\(.\).*/\1/'`" == "/" ] && lookup_desktop $GUESS_DESKTOP
    else
	echo "unknown"
    fi
}

function is_gtk_supported() {
    [ -n "$IMSETTINGS_DISABLE_DESKTOP_CHECK" ] && return 0
    case "$(get_desktop|tr '[:upper:]' '[:lower:]')" in
	cinnamon*)
	    if check_imsettings_capability cinnamon-gsettings; then
		return 0
	    fi
	    ;;
	*gnome|gnome*|openbox)
	    if check_imsettings_capability gconf || check_imsettings_capability gsettings; then
		return 0
	    fi
	    ;;
	lxde)
	    if check_imsettings_capability lxde; then
		return 0
	    fi
	    ;;
	mate)
	    if check_imsettings_capability mateconf || check_imsettings_capability mate-gsettings; then
		return 0
	    fi
	    ;;
	xfce*)
	    if check_imsettings_capability xfce; then
		return 0
	    fi
	    ;;
	*)
	    ;;
    esac

    return 1
}

function is_qt_supported() {
    [ -n "$IMSETTINGS_DISABLE_DESKTOP_CHECK" ] && return 0
    case "$(get_desktop|tr '[:upper:]' '[:lower:]')" in
	*)
	    if check_imsettings_capability qt; then
		return 0
	    fi
	    ;;
    esac

    return 1
}

function is_xim_supported() {
# XXX: Disable XIM support so far
#    [ -n "$IMSETTINGS_DISABLE_DESKTOP_CHECK" ] && return 0
#    if check_imsettings_capability xim; then
#	return 0
#    fi

    return 1
}

function setup_gtk_immodule() {
    if is_imsettings_enabled && is_gtk_supported; then
	# Ensure GTK_IM_MODULE is empty. otherwise GTK+ doesn't pick up immodule through XSETTINGS
	unset GTK_IM_MODULE
	export GTK_IM_MODULE
    else
	[ -n "$GTK_IM_MODULE" ] && export GTK_IM_MODULE
    fi
}

function setup_qt_immodule() {
    if is_imsettings_enabled && is_qt_supported; then
	# FIXME: Qt doesn't support XSETTINGS for immodule yet.
	#        We still need to go with the older way.
	[ -n "$QT_IM_MODULE" ] && export QT_IM_MODULE
    else
	[ -n "$QT_IM_MODULE" ] && export QT_IM_MODULE
    fi
}

function setup_xim() {
    if is_imsettings_enabled && is_xim_supported; then
	# setup XMODIFIERS
	XMODIFIERS="@im=imsettings"
	export XMODIFIERS
    else
	[ -z "$XMODIFIERS" -a -n "$XIM" ] && XMODIFIERS="@im=$XIM"
	[ -n "$XMODIFIERS" ] && export XMODIFIERS
    fi
}

function run_imsettings() {
    print_info
    if [ -n "$DRY_RUN" ]; then
	log "*** DRY RUN MODE: running IM through imsettings"
    else
	if [ -n "$IMSETTINGS_INTEGRATE_DESKTOP" -a "x$IMSETTINGS_INTEGRATE_DESKTOP" = "xno" ]; then
	    which imsettings-switch > /dev/null 2>&1 && LANG="$tmplang" imsettings-switch -n "$IMSETTINGS_MODULE" || :
	    # NOTE: We don't bring up imsettings-xim nor imsettings-applet here to support XIM.
	    #       imsettings-applet will starts through XDG autostart mechanism.
	    #       If the desktop doesn't support that, this function shouldn't be invoked.
	    #       but run_xim() instead.
	fi
    fi
}

function run_xim() {
    print_info
    if [ -n "$DRY_RUN" ]; then
	log "*** DRY RUN MODE: running IM without imsettings"
    else
	DISABLE_IMSETTINGS=true
	export DISABLE_IMSETTINGS

	# execute XIM_PROGRAM
	[ -n "$XIM_PROGRAM" ] && which "$XIM_PROGRAM" > /dev/null 2>&1 && LANG="$tmplang" "$XIM_PROGRAM" $XIM_ARGS > $LOGFILE 2>&1 &
    fi
}

function print_result() {
    $1
    if [ $? -eq 0 ]; then
	log yes
    else
	log no
    fi
}

function print_info() {
    log "imsettings information"
    log "=========================="
    log "XINPUTRC: $READ_XINPUTRC"
    if [ "x$READ_XINPUTRC" != "xN/A" ]; then
	log "`stat $READ_XINPUTRC|sed -e 's/\(.*\)/\t\1/g'`"
    fi
    log -n "Is DBus enabled: "
    print_result is_dbus_enabled
    log -n "Is imsettings enabled: "
    print_result is_imsettings_enabled
    log -n "Is GTK+ supported: "
    print_result is_gtk_supported
    log -n "Is Qt supported: "
    print_result is_qt_supported
    log "DESKTOP: $(get_desktop)"
    get_desktop > /dev/null
    log "GUESS_DESKTOP: $GUESS_DESKTOP"
    log "DISABLE_IMSETTINGS: $DISABLE_IMSETTINGS"
    log "IMSETTINGS_DISABLE_DESKTOP_CHECK: $IMSETTINGS_DISABLE_DESKTOP_CHECK"
    log "DBUS_SESSION_BUS_ADDRESS: $DBUS_SESSION_BUS_ADDRESS"
    log "GTK_IM_MODULE: $GTK_IM_MODULE"
    log "QT_IM_MODULE: $QT_IM_MODULE"
    log "XMODIFIERS: $XMODIFIERS"
    log "IMSETTINGS_MODULE: $IMSETTINGS_MODULE"
    log "IMSETTINGS_INTEGRATE_DESKTOP: $IMSETTINGS_INTEGRATE_DESKTOP"
    log ""
}
