# Copyright 2023-2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

CRATES=""

inherit cargo desktop fcaps linux-info systemd xdg-utils

DESCRIPTION="Cross-platform Text Expander written in Rust"
HOMEPAGE="https://espanso.org"
SRC_URI="https://github.com/espanso/${PN}/archive/refs/tags/v${PV}.tar.gz -> ${P}.tar.gz"
DEPS_URI="https://github.com/freijon/${PN}/releases/download/v${PV}/${P}-crates.tar.xz"
SRC_URI+=" ${DEPS_URI}"

LICENSE="GPL-3"
# Dependent crate licenses
LICENSE+=" Apache-2.0 BSD-2 BSD CC0-1.0 ISC MIT MPL-2.0 ZLIB"
SLOT="0"
KEYWORDS="~amd64"
IUSE="wayland"

DEPEND="
	acct-group/input
	dev-libs/openssl
	sys-apps/dbus
	x11-libs/wxGTK
	wayland? (
		x11-libs/libxkbcommon[wayland]
	)
	!wayland? (
		x11-libs/libX11
		x11-libs/libxcb
		x11-libs/libXtst
		x11-libs/libxkbcommon[X]
	)
"
RDEPEND="${DEPEND}"

QA_FLAGS_IGNORED="usr/bin/${PN}"

pkg_setup() {
	CONFIG_CHECK="~INPUT_UINPUT"
	ERROR_INPUT_UINPUT="Espanso with Wayland needs the UINPUT"
	ERROR_INPUT_UINPUT+=" input device driver to detect user inputs. Without it,"
	ERROR_INPUT_UINPUT+=" Espanso will not work as intended"

	# Now do the actual checks setup above, but only when using wayland
	use wayland && linux-info_pkg_setup
	rust_pkg_setup
}

src_configure() {
	local myfeatures=(
		modulo
		native-tls
		$(usev wayland)
	)
	cargo_src_configure --verbose --no-default-features
}

src_compile() {
	cargo_src_compile -p "${PN}"
}

src_install() {
	cargo_src_install --path "${PN}"

	newicon -s 128 "espanso/src/res/linux/icon.png" "${PN}.png"
	domenu "espanso/src/res/linux/${PN}.desktop"

	# install the systemd-service (user level)
	sed -i "s|{{{espanso_path}}}|/usr/bin/espanso|g" "espanso/src/res/linux/systemd.service" || die
	systemd_newuserunit "espanso/src/res/linux/systemd.service" "${PN}.service"
}

pkg_postinst() {
	# See https://espanso.org/docs/install/linux/#adding-the-required-capabilities
	use wayland && fcaps cap_dac_override "usr/bin/${PN}"

	xdg_icon_cache_update
	xdg_desktop_database_update
}

pkg_postrm() {
	xdg_icon_cache_update
	xdg_desktop_database_update
}