summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>2013-08-15 10:45:51 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-08-19 16:52:21 +0200
commit05ddae12d18a348afd942fd85a8d8773698da3a1 (patch)
treeb8b50871c8b0c014201311ef5b3f00c9b90ac023
parent07502898e982dae54f919582350af8be3b4ad2cc (diff)
Android: Fix orientation change on Android 4.3
In Android 4.3, we will get a new native window pointer for the same surface (the old surface has not been destroyed), whereas before we would get the same pointer, thus hitting the "sameNativeWindow" branch. This revealed some bugs in the surfaceChanged code path when the old surface had not been destroyed. This path is now taken both when there's no old surface (the app has been suspended in the mean time) and when the orientation changes. To handle the second case, we need to make sure: 1. We update the static pointer 2. We update the pointers in the platform windows 3. We don't add a second reference to the static data for windows 4. We schedule an update of the window size Task-number: QTBUG-32878 Change-Id: I47257615f9ba820315fc98d7a804e52223f430bf Reviewed-by: Christian Stromme <christian.stromme@digia.com> Reviewed-by: Frederik Gladhorn <frederik.gladhorn@digia.com>
-rw-r--r--src/plugins/platforms/android/src/androidjnimain.cpp40
-rw-r--r--src/plugins/platforms/android/src/opengl/qandroidopenglplatformwindow.cpp21
-rw-r--r--src/plugins/platforms/android/src/opengl/qandroidopenglplatformwindow.h2
-rw-r--r--src/plugins/platforms/android/src/qandroidplatformintegration.cpp1
4 files changed, 43 insertions, 21 deletions
diff --git a/src/plugins/platforms/android/src/androidjnimain.cpp b/src/plugins/platforms/android/src/androidjnimain.cpp
index 162a8aa977..74183b3107 100644
--- a/src/plugins/platforms/android/src/androidjnimain.cpp
+++ b/src/plugins/platforms/android/src/androidjnimain.cpp
@@ -555,33 +555,37 @@ static void setSurface(JNIEnv *env, jobject /*thiz*/, jobject jSurface)
m_nativeWindow = nativeWindow;
if (m_waitForWindow)
m_waitForWindowSemaphore.release();
- if (m_androidPlatformIntegration && !sameNativeWindow) {
- m_surfaceMutex.unlock();
- m_androidPlatformIntegration->surfaceChanged();
- } else if (m_androidPlatformIntegration && sameNativeWindow) {
- QPlatformScreen *screen = m_androidPlatformIntegration->screen();
+
+ if (m_androidPlatformIntegration) {
QSize size = QtAndroid::nativeWindowSize();
+ QPlatformScreen *screen = m_androidPlatformIntegration->screen();
QRect geometry(QPoint(0, 0), size);
QWindowSystemInterface::handleScreenAvailableGeometryChange(screen->screen(), geometry);
QWindowSystemInterface::handleScreenGeometryChange(screen->screen(), geometry);
- // Resize all top level windows, since they share the same surface
- foreach (QWindow *w, QGuiApplication::topLevelWindows()) {
- QAndroidOpenGLPlatformWindow *window =
- static_cast<QAndroidOpenGLPlatformWindow *>(w->handle());
-
- if (window != 0) {
- window->lock();
- window->scheduleResize(size);
-
- QWindowSystemInterface::handleExposeEvent(window->window(),
- QRegion(window->window()->geometry()));
- window->unlock();
+ if (!sameNativeWindow) {
+ m_surfaceMutex.unlock();
+ m_androidPlatformIntegration->surfaceChanged();
+ } else {
+ // Resize all top level windows, since they share the same surface
+ foreach (QWindow *w, QGuiApplication::topLevelWindows()) {
+ QAndroidOpenGLPlatformWindow *window =
+ static_cast<QAndroidOpenGLPlatformWindow *>(w->handle());
+
+ if (window != 0) {
+ window->lock();
+ window->scheduleResize(size);
+
+ QWindowSystemInterface::handleExposeEvent(window->window(),
+ QRegion(window->window()->geometry()));
+ window->unlock();
+ }
}
+
+ m_surfaceMutex.unlock();
}
- m_surfaceMutex.unlock();
} else {
m_surfaceMutex.unlock();
}
diff --git a/src/plugins/platforms/android/src/opengl/qandroidopenglplatformwindow.cpp b/src/plugins/platforms/android/src/opengl/qandroidopenglplatformwindow.cpp
index 5362906e0e..b1a2231ff5 100644
--- a/src/plugins/platforms/android/src/opengl/qandroidopenglplatformwindow.cpp
+++ b/src/plugins/platforms/android/src/opengl/qandroidopenglplatformwindow.cpp
@@ -85,9 +85,19 @@ void QAndroidOpenGLPlatformWindow::invalidateSurface()
}
}
+void QAndroidOpenGLPlatformWindow::updateStaticNativeWindow()
+{
+ QWriteLocker locker(&m_staticSurfaceLock);
+ m_staticNativeWindow = QtAndroid::nativeWindow(false);
+}
+
void QAndroidOpenGLPlatformWindow::resetSurface()
{
- m_referenceCount.ref();
+ // Only add a reference if we're not already holding one, otherwise we're just updating
+ // the native window pointer
+ if (m_window == 0)
+ m_referenceCount.ref();
+
if (m_staticSurface == 0) {
QWriteLocker locker(&m_staticSurfaceLock);
QEglFSWindow::resetSurface();
@@ -95,12 +105,17 @@ void QAndroidOpenGLPlatformWindow::resetSurface()
m_staticNativeWindow = m_window;
} else {
QReadLocker locker(&m_staticSurfaceLock);
- Q_ASSERT(m_staticSurface != m_surface);
m_window = m_staticNativeWindow;
m_surface = m_staticSurface;
}
- QWindowSystemInterface::handleExposeEvent(window(), QRegion(geometry())); // Expose event
+ {
+ lock();
+ scheduleResize(QtAndroid::nativeWindowSize());
+ QWindowSystemInterface::handleExposeEvent(window(), QRegion(geometry())); // Expose event
+ unlock();
+ }
+
QWindowSystemInterface::flushWindowSystemEvents();
}
diff --git a/src/plugins/platforms/android/src/opengl/qandroidopenglplatformwindow.h b/src/plugins/platforms/android/src/opengl/qandroidopenglplatformwindow.h
index 36a110e1a8..9a25957ccd 100644
--- a/src/plugins/platforms/android/src/opengl/qandroidopenglplatformwindow.h
+++ b/src/plugins/platforms/android/src/opengl/qandroidopenglplatformwindow.h
@@ -71,6 +71,8 @@ public:
void destroy();
+ static void updateStaticNativeWindow();
+
private:
QSize m_scheduledResize;
QMutex m_lock;
diff --git a/src/plugins/platforms/android/src/qandroidplatformintegration.cpp b/src/plugins/platforms/android/src/qandroidplatformintegration.cpp
index 91ad2b368f..636a2b3853 100644
--- a/src/plugins/platforms/android/src/qandroidplatformintegration.cpp
+++ b/src/plugins/platforms/android/src/qandroidplatformintegration.cpp
@@ -162,6 +162,7 @@ void QAndroidPlatformIntegration::invalidateNativeSurface()
void QAndroidPlatformIntegration::surfaceChanged()
{
+ QAndroidOpenGLPlatformWindow::updateStaticNativeWindow();
foreach (QWindow *w, QGuiApplication::topLevelWindows()) {
QAndroidOpenGLPlatformWindow *window =
static_cast<QAndroidOpenGLPlatformWindow *>(w->handle());