--- /dev/null
+# Copyright 1999-2016 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI="5"
+
+inherit cmake-utils
+
+if [[ "${PV}" == "9999" ]]; then
+ inherit git-r3
+
+ EGIT_REPO_URI="https://github.com/fcitx/fcitx-qt5"
+fi
+
+DESCRIPTION="Fcitx input method module for Qt 5"
+HOMEPAGE="https://fcitx-im.org/ https://github.com/fcitx/fcitx-qt5"
+if [[ "${PV}" == "9999" ]]; then
+ SRC_URI=""
+else
+ SRC_URI="https://download.fcitx-im.org/${PN}/${P}.tar.xz"
+fi
+
+LICENSE="GPL-2+"
+SLOT="0"
+KEYWORDS="~amd64 ~x86"
+IUSE=""
+
+# Private headers of dev-qt/qtgui:5 used.
+RDEPEND=">=app-i18n/fcitx-4.2.8
+ dev-qt/qtcore:5
+ dev-qt/qtdbus:5
+ dev-qt/qtgui:5=
+ dev-qt/qtwidgets:5
+ virtual/libintl
+ x11-libs/libxkbcommon"
+DEPEND="${RDEPEND}
+ kde-frameworks/extra-cmake-modules:5
+ virtual/pkgconfig"
+
+PATCHES=(
+ "${FILESDIR}/${P}-ucs4.patch"
+)
+
+DOCS=()
--- /dev/null
+https://github.com/fcitx/fcitx-qt5/commit/31ecc9f2f9c8eb77082044944bbb6740d35ae7c3
+https://github.com/fcitx/fcitx-qt5/commit/8fc110e6125d85d3c50112bc20a6ed36395b2b21
+
+--- platforminputcontext/qfcitxplatforminputcontext.cpp
++++ platforminputcontext/qfcitxplatforminputcontext.cpp
+@@ -254,6 +254,12 @@
+ anchor = var2.toInt();
+ else
+ anchor = cursor;
++
++ // adjust it to real character size
++ QVector<uint> tempUCS4 = text.leftRef(cursor).toUcs4();
++ cursor = tempUCS4.size();
++ tempUCS4 = text.leftRef(anchor).toUcs4();
++ anchor = tempUCS4.size();
+ if (data.surroundingText != text) {
+ data.surroundingText = text;
+ proxy->SetSurroundingText(text, cursor, anchor);
+@@ -388,6 +394,7 @@
+ delete data.proxy;
+ }
+ data.proxy = new FcitxQtInputContextProxy(m_connection->serviceName(), path, *m_connection->connection(), this);
++ data.proxy->setProperty("icData", qVariantFromValue(static_cast<void*>(&data)));
+ connect(data.proxy, SIGNAL(CommitString(QString)), this, SLOT(commitString(QString)));
+ connect(data.proxy, SIGNAL(ForwardKey(uint, uint, int)), this, SLOT(forwardKey(uint, uint, int)));
+ connect(data.proxy, SIGNAL(UpdateFormattedPreedit(FcitxQtFormattedPreeditList,int)), this, SLOT(updateFormattedPreedit(FcitxQtFormattedPreeditList,int)));
+@@ -480,15 +487,56 @@
+ update(Qt::ImCursorRectangle);
+ }
+
+-void QFcitxPlatformInputContext::deleteSurroundingText(int offset, uint nchar)
++void QFcitxPlatformInputContext::deleteSurroundingText(int offset, uint _nchar)
+ {
+ QObject *input = qApp->focusObject();
+ if (!input)
+ return;
+
+ QInputMethodEvent event;
+- event.setCommitString("", offset, nchar);
+- QCoreApplication::sendEvent(input, &event);
++
++ FcitxQtInputContextProxy *proxy = qobject_cast<FcitxQtInputContextProxy*>(sender());
++ if (!proxy) {
++ return;
++ }
++
++ FcitxQtICData *data = static_cast<FcitxQtICData*>(proxy->property("icData").value<void *>());
++ QVector<uint> ucsText = data->surroundingText.toUcs4();
++
++ int cursor = data->surroundingCursor;
++ // make nchar signed so we are safer
++ int nchar = _nchar;
++ // Qt's reconvert semantics is different from gtk's. It doesn't count the current
++ // selection. Discard selection from nchar.
++ if (data->surroundingAnchor < data->surroundingCursor) {
++ nchar -= data->surroundingCursor - data->surroundingAnchor;
++ offset += data->surroundingCursor - data->surroundingAnchor;
++ cursor = data->surroundingAnchor;
++ } else if (data->surroundingAnchor > data->surroundingCursor) {
++ nchar -= data->surroundingAnchor - data->surroundingCursor;
++ cursor = data->surroundingCursor;
++ }
++
++ // validates
++ if (nchar >= 0 && cursor + offset >= 0 && cursor + offset + nchar < ucsText.size()) {
++ // order matters
++ QVector<uint> replacedChars = ucsText.mid(cursor + offset, nchar);
++ nchar = QString::fromUcs4(replacedChars.data(), replacedChars.size()).size();
++
++ int start, len;
++ if (offset >= 0) {
++ start = cursor;
++ len = offset;
++ } else {
++ start = cursor;
++ len = -offset;
++ }
++
++ QVector<uint> prefixedChars = ucsText.mid(start, len);
++ offset = QString::fromUcs4(prefixedChars.data(), prefixedChars.size()).size() * (offset >= 0 ? 1 : -1);
++ event.setCommitString("", offset, nchar);
++ QCoreApplication::sendEvent(input, &event);
++ }
+ }
+
+ void QFcitxPlatformInputContext::forwardKey(uint keyval, uint state, int type)