Cocoa: Fix modal session cleanup.

Call [NSApp endModalSession] at the correct time.

Calling cleanupModalSessions() from processPostedEvents()
resulted in endModalSession being called from within
[NSApp runModalSession] - ending and cleaning up the
the modal session while Cocoa is still using it.

Move the cleanupModalSessions() call to to after
runModalSession returns.

Task-number: QTBUG-37699
Change-Id: I5868def36f6869667b0bbe33733286e3e49488eb
Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
This commit is contained in:
Morten Johan Sørvig 2014-05-15 13:29:25 +02:00 committed by The Qt Project
parent 11fdc4f6c0
commit 530607d8ba

View File

@ -415,6 +415,11 @@ bool QCocoaEventDispatcher::processEvents(QEventLoop::ProcessEventsFlags flags)
// 'session' as well. As a result, we need to restart all internal sessions: // 'session' as well. As a result, we need to restart all internal sessions:
d->temporarilyStopAllModalSessions(); d->temporarilyStopAllModalSessions();
} }
// Clean up the modal session list, call endModalSession.
if (d->cleanupModalSessionsNeeded)
d->cleanupModalSessions();
} else { } else {
d->nsAppRunCalledByQt = true; d->nsAppRunCalledByQt = true;
QBoolBlocker execGuard(d->currentExecIsNSAppRun, true); QBoolBlocker execGuard(d->currentExecIsNSAppRun, true);
@ -441,6 +446,11 @@ bool QCocoaEventDispatcher::processEvents(QEventLoop::ProcessEventsFlags flags)
// 'session' as well. As a result, we need to restart all internal sessions: // 'session' as well. As a result, we need to restart all internal sessions:
d->temporarilyStopAllModalSessions(); d->temporarilyStopAllModalSessions();
} }
// Clean up the modal session list, call endModalSession.
if (d->cleanupModalSessionsNeeded)
d->cleanupModalSessions();
retVal = true; retVal = true;
} else do { } else do {
// Dispatch all non-user events (but que non-user events up for later). In // Dispatch all non-user events (but que non-user events up for later). In
@ -860,9 +870,6 @@ void QCocoaEventDispatcherPrivate::processPostedEvents()
return; return;
} }
if (cleanupModalSessionsNeeded)
cleanupModalSessions();
if (interrupt) { if (interrupt) {
if (currentExecIsNSAppRun) { if (currentExecIsNSAppRun) {
// The event dispatcher has been interrupted. But since // The event dispatcher has been interrupted. But since