Android: work around input method cursor position bug

Since the Qt input method queries only give us information
on the position within the block, moving to the same position
in a different block will be interpreted as not moving.

The quick fix is to send a fake position before the real one in
this case.

Task-number: QTBUG-34845
Change-Id: I5d62bdffc283e41d0384c60a0b69c01811caa629
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
Reviewed-by: BogDan Vatra <bogdan@kde.org>
This commit is contained in:
Paul Olav Tvete 2013-11-14 15:39:28 +01:00 committed by The Qt Project
parent 4577026397
commit b8c93d4592

View File

@ -67,12 +67,32 @@ namespace QtAndroidInput
static QPointer<QWindow> m_mouseGrabber;
static int m_lastCursorPos = -1;
void updateSelection(int selStart, int selEnd, int candidatesStart, int candidatesEnd)
{
AttachedJNIEnv env;
if (!env.jniEnv)
return;
#ifdef QT_DEBUG_ANDROID_IM_PROTOCOL
qDebug() << ">>> UPDATESELECTION" << selStart << selEnd << candidatesStart << candidatesEnd;
#endif
if (candidatesStart == -1 && candidatesEnd == -1 && selStart == selEnd) {
// Qt only gives us position inside the block, so if we move to the
// same position in another block, the Android keyboard will believe
// we have not changed position, and be terribly confused.
if (selStart == m_lastCursorPos) {
#ifdef QT_DEBUG_ANDROID_IM_PROTOCOL
qDebug() << ">>> FAKEUPDATESELECTION" << selStart+1;
#endif
env.jniEnv->CallStaticVoidMethod(applicationClass(), m_updateSelectionMethodID,
selStart+1, selEnd+1, candidatesStart, candidatesEnd);
}
m_lastCursorPos = selStart;
} else {
m_lastCursorPos = -1;
}
env.jniEnv->CallStaticVoidMethod(applicationClass(), m_updateSelectionMethodID,
selStart, selEnd, candidatesStart, candidatesEnd);
}