From c45da998adacaa975db92141aa828ea0b9d0fe04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Thu, 4 Jul 2024 11:59:38 +0200 Subject: [PATCH] Android: Initialize window in QPlatformWindow::initialize() override MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit During the QAndroidPlatformWindow constructor we can't safely call virtual functions of QPlatformWindow and expect them to resolve to subclasses, e.g. QAndroidPlatformForeignWindow. Importantly, this means we can't check isForeignWindow() during construction. QPlatformWindow has a dedicated initialization function for this use-case, so use that instead. The existing order of between QAndroidPlatformForeignWindow and QAndroidPlatformWindow has been kept as is. Change-Id: I2a08326fae6a3b079cd153c50a13794310ac3d74 Reviewed-by: Tinja Paavoseppä (cherry picked from commit 7150c79d0ee10d6aca330e6a0862b0fbfec071fc) Reviewed-by: Qt Cherry-pick Bot --- .../android/qandroidplatformforeignwindow.cpp | 11 +++++++++-- .../platforms/android/qandroidplatformforeignwindow.h | 1 + .../platforms/android/qandroidplatformwindow.cpp | 7 +++++++ .../platforms/android/qandroidplatformwindow.h | 2 ++ 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/plugins/platforms/android/qandroidplatformforeignwindow.cpp b/src/plugins/platforms/android/qandroidplatformforeignwindow.cpp index e84a481a2b1..af09c34d0ba 100644 --- a/src/plugins/platforms/android/qandroidplatformforeignwindow.cpp +++ b/src/plugins/platforms/android/qandroidplatformforeignwindow.cpp @@ -11,9 +11,16 @@ QT_BEGIN_NAMESPACE QAndroidPlatformForeignWindow::QAndroidPlatformForeignWindow(QWindow *window, WId nativeHandle) - : QAndroidPlatformWindow(window), m_view(nullptr), m_nativeViewInserted(false) + : QAndroidPlatformWindow(window) + , m_view(reinterpret_cast(nativeHandle)) + , m_nativeViewInserted(false) { - m_view = reinterpret_cast(nativeHandle); +} + +void QAndroidPlatformForeignWindow::initialize() +{ + QAndroidPlatformWindow::initialize(); + if (isEmbeddingContainer()) { m_nativeViewId = m_view.callMethod("getId"); return; diff --git a/src/plugins/platforms/android/qandroidplatformforeignwindow.h b/src/plugins/platforms/android/qandroidplatformforeignwindow.h index 503524ccedf..6238731a4a1 100644 --- a/src/plugins/platforms/android/qandroidplatformforeignwindow.h +++ b/src/plugins/platforms/android/qandroidplatformforeignwindow.h @@ -16,6 +16,7 @@ class QAndroidPlatformForeignWindow : public QAndroidPlatformWindow { public: explicit QAndroidPlatformForeignWindow(QWindow *window, WId nativeHandle); + void initialize() override; ~QAndroidPlatformForeignWindow(); void setGeometry(const QRect &rect) override; void setVisible(bool visible) override; diff --git a/src/plugins/platforms/android/qandroidplatformwindow.cpp b/src/plugins/platforms/android/qandroidplatformwindow.cpp index 2482160573e..f5bb5117c30 100644 --- a/src/plugins/platforms/android/qandroidplatformwindow.cpp +++ b/src/plugins/platforms/android/qandroidplatformwindow.cpp @@ -25,6 +25,13 @@ QAndroidPlatformWindow::QAndroidPlatformWindow(QWindow *window) m_surfaceContainerType(SurfaceContainer::TextureView), m_nativeParentQtWindow(nullptr), m_androidSurfaceObject(nullptr) { + // Please add any initialization in the function below +} + +void QAndroidPlatformWindow::initialize() +{ + QWindow *window = QPlatformWindow::window(); + m_windowFlags = Qt::Widget; m_windowState = Qt::WindowNoState; // the surfaceType is overwritten in QAndroidPlatformOpenGLWindow ctor so let's save diff --git a/src/plugins/platforms/android/qandroidplatformwindow.h b/src/plugins/platforms/android/qandroidplatformwindow.h index 3f1e8ac992c..3c94dec3ea2 100644 --- a/src/plugins/platforms/android/qandroidplatformwindow.h +++ b/src/plugins/platforms/android/qandroidplatformwindow.h @@ -32,6 +32,8 @@ public: }; explicit QAndroidPlatformWindow(QWindow *window); + void initialize() override; + ~QAndroidPlatformWindow(); void lower() override; void raise() override;