diff options
author | Sergio Martins <sergio.martins.qnx@kdab.com> | 2013-01-30 13:58:12 +0000 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-01-31 18:24:16 +0100 |
commit | 29a78d48d0d3c162fad11b050cb50c951d4a484c (patch) | |
tree | 46ae0a1171f46eb41f73db15cbb2c01eb208234c | |
parent | 3dc47622a469ded1c99397fdedc2053b73d57189 (diff) |
QNX: Don't crash if we unplug the primary display.
The QPA plugin assumes in several places that we have at least
one QScreen.
Even if patching the plugin to support 0 screens, Qt itself crashes
when dereferencing a null paint device while synching the backing
store.
Change-Id: I2ac504a447aff811d6c07ab857340a3433557cdc
Reviewed-by: Kevin Krammer <kevin.krammer@kdab.com>
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r-- | src/plugins/platforms/qnx/qqnxscreeneventhandler.cpp | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/plugins/platforms/qnx/qqnxscreeneventhandler.cpp b/src/plugins/platforms/qnx/qqnxscreeneventhandler.cpp index 8b41465add..4412bb34bd 100644 --- a/src/plugins/platforms/qnx/qqnxscreeneventhandler.cpp +++ b/src/plugins/platforms/qnx/qqnxscreeneventhandler.cpp @@ -42,6 +42,7 @@ #include "qqnxscreeneventhandler.h" #include "qqnxintegration.h" #include "qqnxkeytranslator.h" +#include "qqnxscreen.h" #include <QDebug> #include <QGuiApplication> @@ -487,9 +488,18 @@ void QQnxScreenEventHandler::handleDisplayEvent(screen_event_t event) m_qnxIntegration->createDisplay(nativeDisplay, false /* not primary, we assume */); } } else if (!isAttached) { - // libscreen display is deactivated, let's remove the QQnxScreen / QScreen - qScreenEventDebug() << "removing display"; - m_qnxIntegration->removeDisplay(screen); + // We never remove the primary display, the qpa plugin doesn't support that and it crashes. + // To support it, this would be needed: + // - Adjust all qnx qpa code which uses screens + // - Make QWidgetBackingStore not dereference a null paint device + // - Create platform resources ( QQnxWindow ) for all QWindow because they would be deleted + // when you delete the screen + + if (!screen->isPrimaryScreen()) { + // libscreen display is deactivated, let's remove the QQnxScreen / QScreen + qScreenEventDebug() << "removing display"; + m_qnxIntegration->removeDisplay(screen); + } } } |