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:
parent
4577026397
commit
b8c93d4592
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user