From 4e6c4d50a5fe10e355802ac05ce143aed32cffb4 Mon Sep 17 00:00:00 2001 From: Morten Sorvig Date: Mon, 15 Aug 2011 13:50:22 +0200 Subject: Fix crash-on-exit in qmlscene. Take control over NSWindow deletion to make sure it's lifetime matches that of the QCocoaWindow. Change-Id: Ia10006d814345356e6aebe7fa1f9a0e012535786 Reviewed-on: http://codereview.qt.nokia.com/2960 Reviewed-by: Qt Sanity Bot Reviewed-by: Richard Moe Gustavsen --- src/plugins/platforms/cocoa/qcocoawindow.h | 1 + src/plugins/platforms/cocoa/qcocoawindow.mm | 14 +++++++++++++- src/plugins/platforms/cocoa/qnswindowdelegate.mm | 4 +++- 3 files changed, 17 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h index 92fc026bc1..035a09b607 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.h +++ b/src/plugins/platforms/cocoa/qcocoawindow.h @@ -76,6 +76,7 @@ public: void windowDidMove(); void windowDidResize(); + void windowWillClose(); void setCurrentContext(QCocoaGLContext *context); QCocoaGLContext *currentContext() const; diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index 7e88cdbf75..80a195d788 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -82,6 +82,12 @@ QCocoaWindow::QCocoaWindow(QWindow *tlw) [m_nsWindow setDelegate:delegate]; [m_nsWindow setAcceptsMouseMovedEvents:YES]; + // Prevent Cocoa from releasing the window on close. Qt + // handles the close event asynchronously and we want to + // make sure that m_nsWindow stays valid until the + // QCocoaWindow is deleted by Qt. + [m_nsWindow setReleasedWhenClosed : NO]; + m_contentView = [[QNSView alloc] initWithQWindow:tlw]; if (tlw->surfaceType() == QWindow::OpenGLSurface) { @@ -99,7 +105,7 @@ QCocoaWindow::QCocoaWindow(QWindow *tlw) QCocoaWindow::~QCocoaWindow() { - + [m_nsWindow release]; } void QCocoaWindow::setGeometry(const QRect &rect) @@ -178,6 +184,12 @@ void QCocoaWindow::windowDidResize() m_glContext->update(); } + +void QCocoaWindow::windowWillClose() +{ + QWindowSystemInterface::handleCloseEvent(window()); +} + void QCocoaWindow::setCurrentContext(QCocoaGLContext *context) { m_glContext = context; diff --git a/src/plugins/platforms/cocoa/qnswindowdelegate.mm b/src/plugins/platforms/cocoa/qnswindowdelegate.mm index 6521db5cf7..869ef7840b 100644 --- a/src/plugins/platforms/cocoa/qnswindowdelegate.mm +++ b/src/plugins/platforms/cocoa/qnswindowdelegate.mm @@ -75,7 +75,9 @@ - (void)windowWillClose:(NSNotification *)notification { Q_UNUSED(notification); - QWindowSystemInterface::handleCloseEvent(m_cocoaWindow->window()); + if (m_cocoaWindow) { + m_cocoaWindow->windowWillClose(); + } } @end -- cgit v1.2.3