diff options
author | Petri Virkkunen <petri.virkkunen@qt.io> | 2024-01-25 14:11:22 +0200 |
---|---|---|
committer | Petri Virkkunen <petri.virkkunen@qt.io> | 2024-02-15 19:44:35 +0200 |
commit | 2c192c6f5fe08b014bfa90ea0452258e649d3183 (patch) | |
tree | 68401acfd12f02b637536f42ea21b58a92dc9e3d /src/plugins/platforms | |
parent | f4050cc5ea7490ba3b8b2bb0a174559d7e72a27e (diff) |
Android: QtActivityDelegateBase listens to focus events from child views
In order to detect gaining/losing and moving focus between windows,
implement GlobalFocusChangeListener for the root View.
Add a surfaceFocusChanged native function in QAndroidPlatformWindow in
order to follow these focus changes.
Task-number: QTBUG-118139
Pick-to: 6.7
Change-Id: Ia9bf6249c28a420f42793a9829aef31b12757630
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Diffstat (limited to 'src/plugins/platforms')
-rw-r--r-- | src/plugins/platforms/android/qandroidplatformwindow.cpp | 20 | ||||
-rw-r--r-- | src/plugins/platforms/android/qandroidplatformwindow.h | 2 |
2 files changed, 21 insertions, 1 deletions
diff --git a/src/plugins/platforms/android/qandroidplatformwindow.cpp b/src/plugins/platforms/android/qandroidplatformwindow.cpp index 289884020e..e4d7b4c7ec 100644 --- a/src/plugins/platforms/android/qandroidplatformwindow.cpp +++ b/src/plugins/platforms/android/qandroidplatformwindow.cpp @@ -342,10 +342,28 @@ void QAndroidPlatformWindow::setSurface(JNIEnv *env, jobject object, jint window } } +void QAndroidPlatformWindow::windowFocusChanged(JNIEnv *env, jobject object, + jboolean focus, jint windowId) +{ + Q_UNUSED(env) + Q_UNUSED(object) + QWindow* window = QtAndroid::windowFromId(windowId); + Q_ASSERT_X(window, "QAndroidPlatformWindow", "windowFocusChanged event window should exist"); + if (focus) { + QWindowSystemInterface::handleFocusWindowChanged(window); + } else if (!focus && window == qGuiApp->focusWindow()) { + // Clear focus if current window has lost focus + QWindowSystemInterface::handleFocusWindowChanged(nullptr); + } +} + bool QAndroidPlatformWindow::registerNatives(QJniEnvironment &env) { if (!env.registerNativeMethods(QtJniTypes::Traits<QtJniTypes::QtWindow>::className(), - {Q_JNI_NATIVE_SCOPED_METHOD(setSurface, QAndroidPlatformWindow)})) { + { + Q_JNI_NATIVE_SCOPED_METHOD(setSurface, QAndroidPlatformWindow), + Q_JNI_NATIVE_SCOPED_METHOD(windowFocusChanged, QAndroidPlatformWindow) + })) { qCCritical(lcQpaWindow) << "RegisterNatives failed for" << QtJniTypes::Traits<QtJniTypes::QtWindow>::className(); return false; diff --git a/src/plugins/platforms/android/qandroidplatformwindow.h b/src/plugins/platforms/android/qandroidplatformwindow.h index 1896316bf6..3f1e8ac992 100644 --- a/src/plugins/platforms/android/qandroidplatformwindow.h +++ b/src/plugins/platforms/android/qandroidplatformwindow.h @@ -93,6 +93,8 @@ protected: private: static void setSurface(JNIEnv *env, jobject obj, jint windowId, QtJniTypes::Surface surface); Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(setSurface) + static void windowFocusChanged(JNIEnv *env, jobject object, jboolean focus, jint windowId); + Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(windowFocusChanged) }; QT_END_NAMESPACE |