diff options
author | Tinja Paavoseppä <tinja.paavoseppa@qt.io> | 2023-11-06 13:02:10 +0200 |
---|---|---|
committer | Tinja Paavoseppä <tinja.paavoseppa@qt.io> | 2023-12-07 10:56:43 +0200 |
commit | 2020ce5fd2478389c56f34742fdeee9cd24ca8a5 (patch) | |
tree | 6ea05c32d80ca916b3d13883883e6309f5709527 /src/plugins/platforms/android/qandroidplatformwindow.cpp | |
parent | 76b58be4b8495f488607639f012de227dc047102 (diff) |
Android: Give raster windows their own surface, and flush via RHI
Refactored platform windows on Android so that all window
types, including raster windows, have their own surface to
draw on.
Raster windows now flush the backing-store via RHI/OpenGL.
As a drive by, update to newer JNI syntax where appropriate.
Task-number: QTBUG-116187
Change-Id: I3b764b7126abf53556750b0ccbb7d27efe007bc1
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'src/plugins/platforms/android/qandroidplatformwindow.cpp')
-rw-r--r-- | src/plugins/platforms/android/qandroidplatformwindow.cpp | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/src/plugins/platforms/android/qandroidplatformwindow.cpp b/src/plugins/platforms/android/qandroidplatformwindow.cpp index 61d326228c..23b83834d4 100644 --- a/src/plugins/platforms/android/qandroidplatformwindow.cpp +++ b/src/plugins/platforms/android/qandroidplatformwindow.cpp @@ -17,10 +17,13 @@ QT_BEGIN_NAMESPACE Q_CONSTINIT static QBasicAtomicInt winIdGenerator = Q_BASIC_ATOMIC_INITIALIZER(0); QAndroidPlatformWindow::QAndroidPlatformWindow(QWindow *window) - : QPlatformWindow(window) + : QPlatformWindow(window), m_androidSurfaceObject(nullptr) { m_windowFlags = Qt::Widget; m_windowState = Qt::WindowNoState; + // the surfaceType is overwritten in QAndroidPlatformOpenGLWindow ctor so let's save + // the fact that it's a raster window for now + m_isRaster = window->surfaceType() == QSurface::RasterSurface; m_windowId = winIdGenerator.fetchAndAddRelaxed(1) + 1; setWindowState(window->windowStates()); @@ -171,4 +174,44 @@ void QAndroidPlatformWindow::applicationStateChanged(Qt::ApplicationState) QWindowSystemInterface::flushWindowSystemEvents(); } +void QAndroidPlatformWindow::createSurface() +{ + const bool windowStaysOnTop = bool(window()->flags() & Qt::WindowStaysOnTopHint); + m_nativeSurfaceId = QtAndroid::createSurface(this, geometry(), windowStaysOnTop, 32); +} + +void QAndroidPlatformWindow::destroySurface() +{ + if (m_nativeSurfaceId != -1) { + QtAndroid::destroySurface(m_nativeSurfaceId); + m_nativeSurfaceId = -1; + } +} + +void QAndroidPlatformWindow::setSurfaceGeometry(const QRect &rect) +{ + if (m_nativeSurfaceId != -1) + QtAndroid::setSurfaceGeometry(m_nativeSurfaceId, rect); +} + +void QAndroidPlatformWindow::sendExpose() +{ + QRect availableGeometry = screen()->availableGeometry(); + if (!geometry().isNull() && !availableGeometry.isNull()) { + QWindowSystemInterface::handleExposeEvent(window(), + QRegion(QRect(QPoint(), geometry().size()))); + } +} + +void QAndroidPlatformWindow::onSurfaceChanged(QtJniTypes::Surface surface) +{ + lockSurface(); + m_androidSurfaceObject = surface; + if (m_androidSurfaceObject.isValid()) + m_surfaceWaitCondition.wakeOne(); + unlockSurface(); + if (m_androidSurfaceObject.isValid()) + sendExpose(); +} + QT_END_NAMESPACE |