diff options
author | Olivier Goffart <ogoffart@woboq.com> | 2015-12-05 13:23:26 +0100 |
---|---|---|
committer | Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com> | 2015-12-07 16:56:25 +0000 |
commit | 420b4dbece04f8015cad24a49622c65c540f0a22 (patch) | |
tree | 39a5832ef95a2f24a1275e683b492c5f8d5744ac /src/plugins/platforms/android/androidjniinput.cpp | |
parent | 7908da98f01c24bd95a9e7a7f938de697a6a02b6 (diff) |
Android: Implement QInputMethod::keyboardRectangle
We can use getWindowVisibleDisplayFrame to know the height on the
keyboard, and we can use getLocationOnScreen to find out how much
the view is scrolled. Since onPreDraw is always called when the
view is scrolled or when the keyboard appears or disapear, we can
call the native functions from there.
This is not working for floating keyboards.
[ChangeLog][Android] Implemented QInputMethod::keyboardRectangle
Task-number: QTBUG-40731
Change-Id: I7848eb34fece410b29a06bf0bbb2313112fffa68
Reviewed-by: Samuel Nevala <samuel.nevala@intopalo.com>
Reviewed-by: BogDan Vatra <bogdan@kdab.com>
Diffstat (limited to 'src/plugins/platforms/android/androidjniinput.cpp')
-rw-r--r-- | src/plugins/platforms/android/androidjniinput.cpp | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/src/plugins/platforms/android/androidjniinput.cpp b/src/plugins/platforms/android/androidjniinput.cpp index 8982787ec9..9cc5e95378 100644 --- a/src/plugins/platforms/android/androidjniinput.cpp +++ b/src/plugins/platforms/android/androidjniinput.cpp @@ -51,6 +51,7 @@ namespace QtAndroidInput static bool m_ignoreMouseEvents = false; static bool m_softwareKeyboardVisible = false; + static QRect m_softwareKeyboardRect; static QList<QWindowSystemInterface::TouchPoint> m_touchPoints; @@ -108,6 +109,11 @@ namespace QtAndroidInput return m_softwareKeyboardVisible; } + QRect softwareKeyboardRect() + { + return m_softwareKeyboardRect; + } + static void mouseDown(JNIEnv */*env*/, jobject /*thiz*/, jint /*winId*/, jint x, jint y) { @@ -734,14 +740,35 @@ namespace QtAndroidInput static void keyboardVisibilityChanged(JNIEnv */*env*/, jobject /*thiz*/, jboolean visibility) { m_softwareKeyboardVisible = visibility; + if (!visibility) + m_softwareKeyboardRect = QRect(); + QAndroidInputContext *inputContext = QAndroidInputContext::androidInputContext(); - if (inputContext && qGuiApp) + if (inputContext && qGuiApp) { inputContext->emitInputPanelVisibleChanged(); + if (!visibility) + inputContext->emitKeyboardRectChanged(); + } #ifdef QT_DEBUG_ANDROID_IM_PROTOCOL qDebug() << "@@@ KEYBOARDVISIBILITYCHANGED" << inputContext; #endif } + static void keyboardGeometryChanged(JNIEnv */*env*/, jobject /*thiz*/, jint x, jint y, jint w, jint h) + { + QRect r = QRect(x, y, w, h); + if (r == m_softwareKeyboardRect) + return; + m_softwareKeyboardRect = r; + QAndroidInputContext *inputContext = QAndroidInputContext::androidInputContext(); + if (inputContext && qGuiApp) + inputContext->emitKeyboardRectChanged(); + +#ifdef QT_DEBUG_ANDROID_IM_PROTOCOL + qDebug() << "@@@ KEYBOARDRECTCHANGED" << m_softwareKeyboardRect; +#endif + } + static JNINativeMethod methods[] = { {"touchBegin","(I)V",(void*)touchBegin}, {"touchAdd","(IIIZIIFF)V",(void*)touchAdd}, @@ -753,7 +780,8 @@ namespace QtAndroidInput {"tabletEvent", "(IIJIIIFFF)V", (void *)tabletEvent}, {"keyDown", "(IIIZ)V", (void *)keyDown}, {"keyUp", "(IIIZ)V", (void *)keyUp}, - {"keyboardVisibilityChanged", "(Z)V", (void *)keyboardVisibilityChanged} + {"keyboardVisibilityChanged", "(Z)V", (void *)keyboardVisibilityChanged}, + {"keyboardGeometryChanged", "(IIII)V", (void *)keyboardGeometryChanged} }; bool registerNatives(JNIEnv *env) |