diff options
author | Friedemann Kleint <Friedemann.Kleint@digia.com> | 2014-03-10 10:53:49 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-03-13 13:39:54 +0100 |
commit | b8afc009afcca84a3fd3d5617dfe96c729c531aa (patch) | |
tree | 10bdbfb63b3aee36da0344cd8f05184b06b47f37 /src/quick/scenegraph/qsgrenderloop.cpp | |
parent | d6e932b3682c7f8cd610d7554a52c9856d7e67c1 (diff) |
Consolidate context creation failure handling in Quick.
Add QQuickWidget::sceneGraphError() equivalent to
QQuickWindow::sceneGraphError(), move message formatting code
to QQuickWindowPrivate.
Change-Id: I18cd4d7e0f6ee1011c29375218dc6a044b0d2cf2
Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
Diffstat (limited to 'src/quick/scenegraph/qsgrenderloop.cpp')
-rw-r--r-- | src/quick/scenegraph/qsgrenderloop.cpp | 43 |
1 files changed, 33 insertions, 10 deletions
diff --git a/src/quick/scenegraph/qsgrenderloop.cpp b/src/quick/scenegraph/qsgrenderloop.cpp index 644a674749..6647ec83d0 100644 --- a/src/quick/scenegraph/qsgrenderloop.cpp +++ b/src/quick/scenegraph/qsgrenderloop.cpp @@ -46,6 +46,7 @@ #include <QtCore/QCoreApplication> #include <QtCore/QTime> #include <QtCore/QScopedPointer> +#include <QtCore/QLibraryInfo> #include <QtCore/private/qabstractanimation_p.h> #include <QtGui/QOpenGLContext> @@ -59,6 +60,10 @@ #include <QtQuick/private/qsgcontext_p.h> #include <private/qquickprofiler_p.h> +#ifdef Q_OS_WIN +# include <QtCore/qt_windows.h> +#endif + QT_BEGIN_NAMESPACE DEFINE_BOOL_CONFIG_OPTION(qsg_render_timing, QSG_RENDER_TIMING) @@ -208,6 +213,32 @@ void QSGRenderLoop::setInstance(QSGRenderLoop *instance) s_renderLoopInstance->reset(instance); } +void QSGRenderLoop::handleContextCreationFailure(QQuickWindow *window, + bool isEs) +{ + QString translatedMessage; + QString untranslatedMessage; + QQuickWindowPrivate::contextCreationFailureMessage(window->requestedFormat(), + &translatedMessage, + &untranslatedMessage, + isEs); + // If there is a slot connected to the error signal, emit it and leave it to + // the application to do something with the message. If nothing is connected, + // show a message on our own and terminate. + const bool signalEmitted = + QQuickWindowPrivate::get(window)->emitError(QQuickWindow::ContextNotAvailable, + translatedMessage); +#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) && !defined(Q_OS_WINRT) + if (!signalEmitted && !QLibraryInfo::isDebugBuild() && !GetConsoleWindow()) { + MessageBox(0, (LPCTSTR) translatedMessage.utf16(), + (LPCTSTR)(QCoreApplication::applicationName().utf16()), + MB_OK | MB_ICONERROR); + } +#endif // Q_OS_WIN && !Q_OS_WINCE && !Q_OS_WINRT + if (!signalEmitted) + qFatal("%s", qPrintable(untranslatedMessage)); +} + QSGGuiThreadRenderLoop::QSGGuiThreadRenderLoop() : gl(0) , eventPending(false) @@ -283,18 +314,10 @@ void QSGGuiThreadRenderLoop::renderWindow(QQuickWindow *window) if (QSGContext::sharedOpenGLContext()) gl->setShareContext(QSGContext::sharedOpenGLContext()); if (!gl->create()) { + const bool isEs = gl->isES(); delete gl; gl = 0; - QString formatStr; - QDebug(&formatStr) << window->requestedFormat(); - QString contextType = QLatin1String("OpenGL"); - const char *msg = QT_TRANSLATE_NOOP("QSGGuiThreadRenderLoop", "Failed to create %1 context for format %2"); - QString translatedMsg = tr(msg).arg(contextType).arg(formatStr); - QString nonTranslatedMsg = QString(QLatin1String(msg)).arg(contextType).arg(formatStr); - bool signalEmitted = QQuickWindowPrivate::get(window)->emitError(QQuickWindow::ContextNotAvailable, - translatedMsg); - if (!signalEmitted) - qFatal("%s", qPrintable(nonTranslatedMsg)); + handleContextCreationFailure(window, isEs); } else { cd->fireOpenGLContextCreated(gl); current = gl->makeCurrent(window); |