File: //usr/libexec/imsettings-functions
# -*- shell-script -*-
# imsettings-functions
# Copyright (C) 2013 Akira TAGOH
#
# Authors:
# Akira TAGOH <[email protected]>
#
# 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*)
echo "kde"
;;
lxsession*)
echo "LXDE"
;;
mate*)
echo "mate"
;;
xfce*)
echo "xfce"
;;
*)
echo "unknown"
;;
esac
}
function get_desktop() {
if [ -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 '[A-Z]' '[a-z]')" in
cinnamon)
if check_imsettings_capability 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; 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 '[A-Z]' '[a-z]')" 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 is_desktop_supported() {
/usr/libexec/imsettings-target-checker.sh >/dev/null
[ $? -eq 0 ]
}
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 ""
}