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 QPointer<QWindow> m_mouseGrabber;
|
||||||
|
|
||||||
|
static int m_lastCursorPos = -1;
|
||||||
|
|
||||||
void updateSelection(int selStart, int selEnd, int candidatesStart, int candidatesEnd)
|
void updateSelection(int selStart, int selEnd, int candidatesStart, int candidatesEnd)
|
||||||
{
|
{
|
||||||
AttachedJNIEnv env;
|
AttachedJNIEnv env;
|
||||||
if (!env.jniEnv)
|
if (!env.jniEnv)
|
||||||
return;
|
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,
|
env.jniEnv->CallStaticVoidMethod(applicationClass(), m_updateSelectionMethodID,
|
||||||
selStart, selEnd, candidatesStart, candidatesEnd);
|
selStart, selEnd, candidatesStart, candidatesEnd);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user