# Copyright 1999-2015 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

EAPI=5

PYTHON_COMPAT=( python2_7 )
VALA_MIN_API_VERSION="0.20"
VALA_USE_DEPEND="vapigen"
# Vapigen is needed for the vala binding
# Valac is needed when building from git for the engine
UPSTREAM_VER=

inherit autotools bash-completion-r1 eutils gnome2-utils multilib python-single-r1 readme.gentoo vala virtualx

DESCRIPTION="Intelligent Input Bus for Linux / Unix OS"
HOMEPAGE="https://github.com/ibus/ibus/wiki"

LICENSE="LGPL-2.1"
SLOT="0"
KEYWORDS="~alpha amd64 arm ~ia64 ppc ppc64 ~sparc x86 ~x86-fbsd"
IUSE="deprecated gconf gtk +gtk3 +introspection nls +python test vala wayland +X"
REQUIRED_USE="
	|| ( gtk gtk3 X )
	deprecated? ( python )
	vala? ( introspection )
	python? (
		${PYTHON_REQUIRED_USE}
		|| ( deprecated ( gtk3 introspection ) ) )" #342903

[[ -n ${UPSTREAM_VER} ]] && \
	UPSTRAM_PATCHSET_URI="https://dev.gentoo.org/~dlan/distfiles/${P}-upstream-patches-${UPSTREAM_VER}.tar.xz"

SRC_URI="https://github.com/ibus/ibus/releases/download/${PV}/${P}.tar.gz
	${UPSTRAM_PATCHSET_URI}"

COMMON_DEPEND="
	>=dev-libs/glib-2.26:2
	gnome-base/librsvg:2
	sys-apps/dbus[X?]
	app-text/iso-codes
	>=gnome-base/dconf-0.13.4
	x11-libs/libnotify
	gconf? ( >=gnome-base/gconf-2.12:2 )
	gtk? ( x11-libs/gtk+:2 )
	gtk3? ( x11-libs/gtk+:3 )
	python? ( ${PYTHON_DEPS} )
	X? (
		x11-libs/libX11
		x11-libs/gtk+:2 )
	introspection? ( >=dev-libs/gobject-introspection-0.6.8 )
	nls? ( virtual/libintl )
	wayland? ( dev-libs/wayland )"
RDEPEND="${COMMON_DEPEND}
	x11-apps/setxkbmap
	python? (
		dev-python/pyxdg
		deprecated? (
			>=dev-python/dbus-python-0.83
			dev-python/pygobject:2
			dev-python/pygtk:2 )
		gtk3? (
			dev-python/pygobject:3
			x11-libs/gdk-pixbuf:2[introspection]
			x11-libs/pango[introspection]
			x11-libs/gtk+:3[introspection] )
	)"
DEPEND="${COMMON_DEPEND}
	>=dev-lang/perl-5.8.1
	dev-util/gtk-doc-am
	dev-util/intltool
	virtual/pkgconfig
	nls? ( >=sys-devel/gettext-0.16.1 )
	vala? ( $(vala_depend) )"

# stress test in bus/ fails
# IBUS-CRITICAL **: bus_test_client_init: assertion `ibus_bus_is_connected (_bus)' failed
RESTRICT="test"

DOCS="AUTHORS ChangeLog NEWS README"

DISABLE_AUTOFORMATTING="yes"
DOC_CONTENTS="To use ibus, you should:
1. Get input engines from sunrise overlay.
Run \"emerge -s ibus-\" in your favorite terminal
for a list of packages we already have.

2. Setup ibus:
$ ibus-setup

3. Set the following in your user startup scripts
such as .xinitrc, .xsession or .xprofile:

export XMODIFIERS=\"@im=ibus\"
export GTK_IM_MODULE=\"ibus\"
export QT_IM_MODULE=\"xim\"
ibus-daemon -d -x
"

pkg_setup() {
	use python && python-single-r1_pkg_setup
}

src_prepare() {
	# Upstream's patchset
	if [[ -n ${UPSTREAM_VER} ]]; then
		EPATCH_SUFFIX="patch" \
		EPATCH_FORCE="yes" \
		EPATCH_OPTS="-p1" \
			epatch "${WORKDIR}"/patches-upstream
	fi

	# We run "dconf update" in pkg_postinst/postrm to avoid sandbox violations
	sed -e 's/dconf update/:/' \
		-i data/dconf/Makefile.{am,in} || die
	use vala && vala_src_prepare

	eautoreconf
}

src_configure() {
	local python_conf
	if use python; then
		python_conf="PYTHON=${PYTHON}
			$(use_enable deprecated python-library)
			$(use_enable gtk3 setup)"
	else
		python_conf="--disable-python-library --disable-setup"
	fi
	econf \
		--enable-dconf \
		$(use_enable introspection) \
		$(use_enable gconf) \
		$(use_enable gtk gtk2) \
		$(use_enable gtk xim) \
		$(use_enable gtk3) \
		$(use_enable gtk3 ui) \
		$(use_enable nls) \
		$(use_enable test tests) \
		$(use_enable X xim) \
		$(use_enable vala) \
		$(use_enable wayland) \
		${python_conf}
}

src_test() {
	unset DBUS_SESSION_BUS_ADDRESS
	Xemake check || die
}

src_install() {
	default

	prune_libtool_files --all

	mv "${ED}"/usr/share/bash-completion/completions/ibus.bash "${T}"
	rm -rf "${ED}"/usr/share/bash-completion || die
	newbashcomp "${T}"/ibus.bash ${PN}
	insinto /etc/X11/xinit/xinput.d
	newins xinput-ibus ibus.conf

	keepdir /usr/share/ibus/{engine,icons} #289547

	use deprecated && python_optimize
	use python && use gtk3 && python_optimize

	readme.gentoo_create_doc
}

pkg_preinst() {
	use gconf && gnome2_gconf_savelist
	gnome2_schemas_savelist
	gnome2_icon_savelist
}

pkg_postinst() {
	use gconf && gnome2_gconf_install
	use gtk && gnome2_query_immodules_gtk2
	use gtk3 && gnome2_query_immodules_gtk3
	gnome2_schemas_update
	gnome2_icon_cache_update
	readme.gentoo_print_elog
}

pkg_postrm() {
	use gtk && gnome2_query_immodules_gtk2
	use gtk3 && gnome2_query_immodules_gtk3
	use gconf && gnome2_schemas_update
	gnome2_icon_cache_update
}
