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:
parent
53229ec8f7
commit
62a654cc90
@ -97,6 +97,7 @@ private:
|
|||||||
|
|
||||||
QScopedPointer<QPlatformAccessibility> mAccessibility;
|
QScopedPointer<QPlatformAccessibility> mAccessibility;
|
||||||
QScopedPointer<QPlatformTheme> mPlatformTheme;
|
QScopedPointer<QPlatformTheme> mPlatformTheme;
|
||||||
|
QList<QCocoaScreen *> mScreens;
|
||||||
};
|
};
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -134,6 +134,7 @@ QCocoaIntegration::QCocoaIntegration()
|
|||||||
NSArray *screens = [NSScreen screens];
|
NSArray *screens = [NSScreen screens];
|
||||||
for (uint i = 0; i < [screens count]; i++) {
|
for (uint i = 0; i < [screens count]; i++) {
|
||||||
QCocoaScreen *screen = new QCocoaScreen(i);
|
QCocoaScreen *screen = new QCocoaScreen(i);
|
||||||
|
mScreens.append(screen);
|
||||||
screenAdded(screen);
|
screenAdded(screen);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,6 +143,11 @@ QCocoaIntegration::QCocoaIntegration()
|
|||||||
QCocoaIntegration::~QCocoaIntegration()
|
QCocoaIntegration::~QCocoaIntegration()
|
||||||
{
|
{
|
||||||
[[NSApplication sharedApplication] setDelegate: 0];
|
[[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
|
bool QCocoaIntegration::hasCapability(QPlatformIntegration::Capability cap) const
|
||||||
|
@ -115,7 +115,11 @@ public:
|
|||||||
|
|
||||||
QWindowsScreenManager();
|
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();
|
void handleScreenChanges();
|
||||||
bool handleDisplayChange(WPARAM wParam, LPARAM lParam);
|
bool handleDisplayChange(WPARAM wParam, LPARAM lParam);
|
||||||
|
@ -191,7 +191,9 @@ QXcbConnection::~QXcbConnection()
|
|||||||
{
|
{
|
||||||
delete m_clipboard;
|
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
|
#ifdef XCB_USE_XINPUT2_MAEMO
|
||||||
finalizeXInput2();
|
finalizeXInput2();
|
||||||
|
@ -605,9 +605,6 @@ public slots:
|
|||||||
|
|
||||||
void tst_QApplication::quitOnLastWindowClosed()
|
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
|
#ifndef Q_OS_MAC
|
||||||
// Test hangs on Mac OS X, see QTBUG-24319
|
// Test hangs on Mac OS X, see QTBUG-24319
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user