Android: Make winId() return the underlying QtWindow jobject

Previously, winId() returned a simple integer ID, incremented by one
for each window, instead of a handle to the underlying window.

Note, if constructing a QWindow with fromWinId(), the passed jobject
will not be the same one returned by winId(), as the passed jobject,
assumed to be a View, will be wrapped inside a QtWindow to ensure
child windows can be added to it if needed.

Pick-to: 6.7
Change-Id: I9d5d977eeb08d4cc3594f7339660fe94c3a55864
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
This commit is contained in:
Tinja Paavoseppä 2023-10-10 09:40:06 +03:00 committed by Petri Virkkunen
parent 0a5a9c134e
commit 4376467169
2 changed files with 8 additions and 7 deletions

View File

@ -16,8 +16,6 @@ QT_BEGIN_NAMESPACE
Q_LOGGING_CATEGORY(lcQpaWindow, "qt.qpa.window") Q_LOGGING_CATEGORY(lcQpaWindow, "qt.qpa.window")
Q_CONSTINIT static QBasicAtomicInt winIdGenerator = Q_BASIC_ATOMIC_INITIALIZER(0);
QAndroidPlatformWindow::QAndroidPlatformWindow(QWindow *window) QAndroidPlatformWindow::QAndroidPlatformWindow(QWindow *window)
: QPlatformWindow(window), m_nativeQtWindow(nullptr), m_nativeParentQtWindow(nullptr), : QPlatformWindow(window), m_nativeQtWindow(nullptr), m_nativeParentQtWindow(nullptr),
m_androidSurfaceObject(nullptr) m_androidSurfaceObject(nullptr)
@ -27,7 +25,6 @@ QAndroidPlatformWindow::QAndroidPlatformWindow(QWindow *window)
// the surfaceType is overwritten in QAndroidPlatformOpenGLWindow ctor so let's save // the surfaceType is overwritten in QAndroidPlatformOpenGLWindow ctor so let's save
// the fact that it's a raster window for now // the fact that it's a raster window for now
m_isRaster = window->surfaceType() == QSurface::RasterSurface; m_isRaster = window->surfaceType() == QSurface::RasterSurface;
m_windowId = winIdGenerator.fetchAndAddRelaxed(1) + 1;
setWindowState(window->windowStates()); setWindowState(window->windowStates());
// the following is in relation to the virtual geometry // the following is in relation to the virtual geometry
@ -174,6 +171,11 @@ void QAndroidPlatformWindow::setParent(const QPlatformWindow *window)
} }
} }
WId QAndroidPlatformWindow::winId() const
{
return m_nativeQtWindow.isValid() ? reinterpret_cast<WId>(m_nativeQtWindow.object()) : 0L;
}
QAndroidPlatformScreen *QAndroidPlatformWindow::platformScreen() const QAndroidPlatformScreen *QAndroidPlatformWindow::platformScreen() const
{ {
return static_cast<QAndroidPlatformScreen *>(window()->screen()->handle()); return static_cast<QAndroidPlatformScreen *>(window()->screen()->handle());

View File

@ -37,7 +37,8 @@ public:
void setWindowFlags(Qt::WindowFlags flags) override; void setWindowFlags(Qt::WindowFlags flags) override;
Qt::WindowFlags windowFlags() const; Qt::WindowFlags windowFlags() const;
void setParent(const QPlatformWindow *window) override; void setParent(const QPlatformWindow *window) override;
WId winId() const override { return m_windowId; }
WId winId() const override;
bool setMouseGrabEnabled(bool grab) override { Q_UNUSED(grab); return false; } bool setMouseGrabEnabled(bool grab) override { Q_UNUSED(grab); return false; }
bool setKeyboardGrabEnabled(bool grab) override { Q_UNUSED(grab); return false; } bool setKeyboardGrabEnabled(bool grab) override { Q_UNUSED(grab); return false; }
@ -73,14 +74,12 @@ protected:
Qt::WindowStates m_windowState; Qt::WindowStates m_windowState;
bool m_isRaster; bool m_isRaster;
WId m_windowId; int m_nativeViewId = -1;
QtJniTypes::QtWindow m_nativeQtWindow; QtJniTypes::QtWindow m_nativeQtWindow;
QtJniTypes::QtWindow m_nativeParentQtWindow; QtJniTypes::QtWindow m_nativeParentQtWindow;
// The Android Surface, accessed from multiple threads, guarded by m_surfaceMutex // The Android Surface, accessed from multiple threads, guarded by m_surfaceMutex
QtJniTypes::Surface m_androidSurfaceObject; QtJniTypes::Surface m_androidSurfaceObject;
QWaitCondition m_surfaceWaitCondition; QWaitCondition m_surfaceWaitCondition;
int m_nativeViewId = -1;
bool m_surfaceCreated = false; bool m_surfaceCreated = false;
QMutex m_surfaceMutex; QMutex m_surfaceMutex;