src/gui/kernel/qeventdispatcher_mac.mm
changeset 3 41300fa6a67c
parent 0 1918ee327afb
child 4 3b1da2848fc7
child 7 f7bc934e204c
--- a/src/gui/kernel/qeventdispatcher_mac.mm	Tue Jan 26 12:42:25 2010 +0200
+++ b/src/gui/kernel/qeventdispatcher_mac.mm	Tue Feb 02 00:43:10 2010 +0200
@@ -571,6 +571,12 @@
                 QBoolBlocker execGuard(d->currentExecIsNSAppRun, false);
                 while (!d->interrupt && [NSApp runModalSession:session] == NSRunContinuesResponse)
                     qt_mac_waitForMoreModalSessionEvents();
+                if (!d->interrupt && session == d->currentModalSessionCached) {
+                    // INVARIANT: Someone called e.g. [NSApp stopModal:] from outside the event
+                    // dispatcher (e.g to stop a native dialog). But that call wrongly stopped
+                    // 'session' as well. As a result, we need to restart all internal sessions:
+                    d->temporarilyStopAllModalSessions();
+                }
             } else {
                 d->nsAppRunCalledByQt = true;
                 QBoolBlocker execGuard(d->currentExecIsNSAppRun, true);
@@ -590,7 +596,13 @@
                 if (NSModalSession session = d->currentModalSession()) {
                     if (flags & QEventLoop::WaitForMoreEvents)
                         qt_mac_waitForMoreModalSessionEvents();
-                    [NSApp runModalSession:session];
+                    NSInteger status = [NSApp runModalSession:session];
+                    if (status != NSRunContinuesResponse && session == d->currentModalSessionCached) {
+                        // INVARIANT: Someone called e.g. [NSApp stopModal:] from outside the event
+                        // dispatcher (e.g to stop a native dialog). But that call wrongly stopped
+                        // 'session' as well. As a result, we need to restart all internal sessions:
+                        d->temporarilyStopAllModalSessions();
+                    }
                     retVal = true;
                     break;
                 } else {