diff options
author | Maurice Kalinowski <[email protected]> | 2016-01-08 12:50:32 +0100 |
---|---|---|
committer | Maurice Kalinowski <[email protected]> | 2016-01-11 10:06:36 +0000 |
commit | becbffe291c1105eb422e8dc66c67c5b6443b96c (patch) | |
tree | 0a1a7fc7839057ad5d4f824bb4f6a1b1be53b883 | |
parent | c4ecab7127807eddd820b5c747a805cf5b0fd06d (diff) |
winphone: Properly close the application
When shutting down an application on Windows Phone the SceneGraph tries
to create an offscreen surface to render into. If there is no offscreen
surface available, it creates a new native window and tries to hide it.
As the native event loop is about to shut down, creation fails and
exceptions are raised. Instead we create a vanilla
QPlatformOffscreenSurface. The SceneGraph recognizes it as such and can
handle a proper cleanup on its own.
Furthermore removing the suspend/resume handler in the destructor of
QWinRTIntegration fails for Windows Phone as the application object
itself does not accept this anymore. Hence skip this part for this
platform.
Task-number: QTBUG-49310
Change-Id: I02acdd5a635ef0b9d6ef8199376537b8f0f1a8fb
Reviewed-by: Oliver Wolff <[email protected]>
-rw-r--r-- | src/plugins/platforms/winrt/qwinrteglcontext.cpp | 4 | ||||
-rw-r--r-- | src/plugins/platforms/winrt/qwinrtintegration.cpp | 17 | ||||
-rw-r--r-- | src/plugins/platforms/winrt/qwinrtintegration.h | 1 |
3 files changed, 22 insertions, 0 deletions
diff --git a/src/plugins/platforms/winrt/qwinrteglcontext.cpp b/src/plugins/platforms/winrt/qwinrteglcontext.cpp index ebd15d71846..bc77df566e4 100644 --- a/src/plugins/platforms/winrt/qwinrteglcontext.cpp +++ b/src/plugins/platforms/winrt/qwinrteglcontext.cpp @@ -46,6 +46,7 @@ #define EGL_EGLEXT_PROTOTYPES #include <EGL/eglext.h> +#include <QOffscreenSurface> #include <QOpenGLContext> #include <QtPlatformSupport/private/qeglconvenience_p.h> @@ -147,6 +148,9 @@ bool QWinRTEGLContext::makeCurrent(QPlatformSurface *windowSurface) Q_D(QWinRTEGLContext); Q_ASSERT(windowSurface->surface()->supportsOpenGL()); + if (windowSurface->surface()->surfaceClass() == QSurface::Offscreen) + return false; + QWinRTWindow *window = static_cast<QWinRTWindow *>(windowSurface); if (window->eglSurface() == EGL_NO_SURFACE) window->createEglSurface(g->eglDisplay, d->eglConfig); diff --git a/src/plugins/platforms/winrt/qwinrtintegration.cpp b/src/plugins/platforms/winrt/qwinrtintegration.cpp index 93757d293c9..71e92f33ca5 100644 --- a/src/plugins/platforms/winrt/qwinrtintegration.cpp +++ b/src/plugins/platforms/winrt/qwinrtintegration.cpp @@ -49,6 +49,8 @@ #include <QtGui/QOpenGLContext> #include <qfunctions_winrt.h> +#include <qpa/qplatformoffscreensurface.h> + #include <functional> #include <wrl.h> #include <windows.ui.xaml.h> @@ -180,10 +182,15 @@ QWinRTIntegration::~QWinRTIntegration() Q_ASSERT_SUCCEEDED(hr); } #endif + // Do not execute this on Windows Phone as the application is already + // shutting down and trying to unregister suspending/resume handler will + // cause exceptions and assert in debug mode +#ifndef Q_OS_WINPHONE for (QHash<CoreApplicationCallbackRemover, EventRegistrationToken>::const_iterator i = d->applicationTokens.begin(); i != d->applicationTokens.end(); ++i) { hr = (d->application.Get()->*i.key())(i.value()); Q_ASSERT_SUCCEEDED(hr); } +#endif destroyScreen(d->mainScreen); Windows::Foundation::Uninitialize(); } @@ -349,4 +356,14 @@ HRESULT QWinRTIntegration::onResume(IInspectable *, IInspectable *) return S_OK; } +QPlatformOffscreenSurface *QWinRTIntegration::createPlatformOffscreenSurface(QOffscreenSurface *surface) const +{ + // This is only used for shutdown of applications. + // In case we do not return an empty surface the scenegraph will try + // to create a new native window during application exit causing crashes + // or assertions. + return new QPlatformOffscreenSurface(surface); +} + + QT_END_NAMESPACE diff --git a/src/plugins/platforms/winrt/qwinrtintegration.h b/src/plugins/platforms/winrt/qwinrtintegration.h index 5456f6922f4..31a3ce7c1c4 100644 --- a/src/plugins/platforms/winrt/qwinrtintegration.h +++ b/src/plugins/platforms/winrt/qwinrtintegration.h @@ -98,6 +98,7 @@ public: QStringList themeNames() const Q_DECL_OVERRIDE; QPlatformTheme *createPlatformTheme(const QString &name) const Q_DECL_OVERRIDE; + QPlatformOffscreenSurface *createPlatformOffscreenSurface(QOffscreenSurface *surface) const Q_DECL_OVERRIDE; private: #ifdef Q_OS_WINPHONE HRESULT onBackButtonPressed(IInspectable *, ABI::Windows::Phone::UI::Input::IBackPressedEventArgs *args); |