diff options
author | Andy Shaw <andy.shaw@qt.io> | 2019-04-24 09:45:57 +0200 |
---|---|---|
committer | Andy Shaw <andy.shaw@qt.io> | 2019-05-03 06:58:02 +0000 |
commit | 8f24dbaf0703cf792c263d7d26400892c527a712 (patch) | |
tree | f4e6a84c49078468c9263ae523f8e0924082c393 | |
parent | 6c0ced4b7a77b089b434ab5eb9f430717f26d687 (diff) |
Android: Fix deleting of new lines when using backspace
With some keyboards (ASOP, SwiftKey) it was not deleting any new lines
when using backspace. So this ensures that it is correctly deleting at
these points. Tested with the Samsung, Gboard and SwiftKey keyboards.
Fixes: QTBUG-74824
Fixes: QTBUG-57798
Change-Id: Id2e4f96c18c3fec0e7f444b55dd3db2653625fd0
Done-with: Vova Mshanetskiy <vovams163@gmail.com>
Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
-rw-r--r-- | src/plugins/platforms/android/qandroidinputcontext.cpp | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/src/plugins/platforms/android/qandroidinputcontext.cpp b/src/plugins/platforms/android/qandroidinputcontext.cpp index c31e43e0bb..00ab3409d3 100644 --- a/src/plugins/platforms/android/qandroidinputcontext.cpp +++ b/src/plugins/platforms/android/qandroidinputcontext.cpp @@ -978,15 +978,25 @@ jboolean QAndroidInputContext::deleteSurroundingText(jint leftLength, jint right m_composingText.clear(); m_composingTextStart = -1; - QString text = query->value(Qt::ImSurroundingText).toString(); - if (text.isEmpty()) - return JNI_TRUE; - if (leftLength < 0) { rightLength += -leftLength; leftLength = 0; } + QVariant textBeforeCursor = query->value(Qt::ImTextBeforeCursor); + QVariant textAfterCursor = query->value(Qt::ImTextAfterCursor); + if (textBeforeCursor.isValid() && textAfterCursor.isValid()) { + leftLength = qMin(leftLength, textBeforeCursor.toString().length()); + rightLength = qMin(rightLength, textAfterCursor.toString().length()); + } else { + int cursorPos = query->value(Qt::ImCursorPosition).toInt(); + leftLength = qMin(leftLength, cursorPos); + rightLength = qMin(rightLength, query->value(Qt::ImSurroundingText).toString().length() - cursorPos); + } + + if (leftLength == 0 && rightLength == 0) + return JNI_TRUE; + QInputMethodEvent event; event.setCommitString(QString(), -leftLength, leftLength+rightLength); sendInputMethodEvent(&event); @@ -1075,6 +1085,14 @@ const QAndroidInputContext::ExtractedText &QAndroidInputContext::getExtractedTex int cpos = localPos + composeLength; //actual cursor pos relative to the current block int localOffset = 0; // start of extracted text relative to the current block + if (blockPos > 0) { + QString prevBlockEnding = query->value(Qt::ImTextBeforeCursor).toString(); + prevBlockEnding.chop(localPos); + if (prevBlockEnding.endsWith(QLatin1Char('\n'))) { + localOffset = -qMin(20, prevBlockEnding.length()); + blockText = prevBlockEnding.right(-localOffset) + blockText; + } + } // It is documented that we should try to return hintMaxChars // characters, but that's not what the standard Android controls do, and |