Fix QApplication autotest crash when running on multiple screens

Screens need to be destroyed in reverse order to ensure the primary
screen stays valid when other screens are destroyed.

Task-number: QTBUG-24300
Change-Id: I9d9d710aa67ec045baa8bf292833ffe7d9eea935
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Reviewed-by: Morten Johan Sørvig <morten.sorvig@nokia.com>
This commit is contained in:
Miikka Heikkinen 2012-03-01 13:19:24 +02:00 committed by Qt by Nokia
parent 53229ec8f7
commit 62a654cc90
5 changed files with 15 additions and 5 deletions

View File

@ -97,6 +97,7 @@ private:
QScopedPointer<QPlatformAccessibility> mAccessibility;
QScopedPointer<QPlatformTheme> mPlatformTheme;
QList<QCocoaScreen *> mScreens;
};
QT_END_NAMESPACE

View File

@ -134,6 +134,7 @@ QCocoaIntegration::QCocoaIntegration()
NSArray *screens = [NSScreen screens];
for (uint i = 0; i < [screens count]; i++) {
QCocoaScreen *screen = new QCocoaScreen(i);
mScreens.append(screen);
screenAdded(screen);
}
@ -142,6 +143,11 @@ QCocoaIntegration::QCocoaIntegration()
QCocoaIntegration::~QCocoaIntegration()
{
[[NSApplication sharedApplication] setDelegate: 0];
// Delete screens in reverse order to avoid crash in case of multiple screens
while (!mScreens.isEmpty()) {
delete mScreens.takeLast();
}
}
bool QCocoaIntegration::hasCapability(QPlatformIntegration::Capability cap) const

View File

@ -115,7 +115,11 @@ public:
QWindowsScreenManager();
inline void clearScreens() { qDeleteAll(m_screens); m_screens.clear(); }
inline void clearScreens() {
// Delete screens in reverse order to avoid crash in case of multiple screens
while (!m_screens.isEmpty())
delete m_screens.takeLast();
}
void handleScreenChanges();
bool handleDisplayChange(WPARAM wParam, LPARAM lParam);

View File

@ -191,7 +191,9 @@ QXcbConnection::~QXcbConnection()
{
delete m_clipboard;
qDeleteAll(m_screens);
// Delete screens in reverse order to avoid crash in case of multiple screens
while (!m_screens.isEmpty())
delete m_screens.takeLast();
#ifdef XCB_USE_XINPUT2_MAEMO
finalizeXInput2();

View File

@ -605,9 +605,6 @@ public slots:
void tst_QApplication::quitOnLastWindowClosed()
{
#ifdef Q_OS_WIN32
QSKIP("This test crashes on Windows. Remove skip once the issue causing the crash is fixed (QTBUG-24300).");
#endif
#ifndef Q_OS_MAC
// Test hangs on Mac OS X, see QTBUG-24319
{