X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/336775c0587b2b83d671efcda03b0f0ced74aaed..6b8ef0b35d674bc262eb2005ac1321762c831d31:/src/osx/cocoa/dialog.mm diff --git a/src/osx/cocoa/dialog.mm b/src/osx/cocoa/dialog.mm index c975bdf1e8..ab4ed1e5c3 100644 --- a/src/osx/cocoa/dialog.mm +++ b/src/osx/cocoa/dialog.mm @@ -28,6 +28,19 @@ void wxDialog::DoShowModal() { wxCHECK_RET( !IsModal(), wxT("DoShowModal() called twice") ); + // If the app hasn't started, flush the event queue + // If we don't do this, the Dock doesn't get the message that + // the app has started so will refuse to activate it. + NSApplication *theNSApp = [NSApplication sharedApplication]; + if (![theNSApp isRunning]) + { + wxMacAutoreleasePool pool; + while(NSEvent *event = [theNSApp nextEventMatchingMask:NSAnyEventMask untilDate:nil inMode:NSDefaultRunLoopMode dequeue:YES]) + { + [theNSApp sendEvent:event]; + } + } + wxModalDialogs.Append(this); SetFocus() ; @@ -45,9 +58,9 @@ void wxDialog::DoShowModal() } */ NSWindow* theWindow = GetWXWindow(); - + NSModalSession session = [NSApp beginModalSessionForWindow:theWindow]; - while (IsModal()) + while (IsModal()) { wxMacAutoreleasePool autoreleasepool; // we cannot break based on the return value, because nested @@ -55,9 +68,23 @@ void wxDialog::DoShowModal() // unsafe [NSApp runModalSession:session]; - // do some idle processing - if (wxTheApp) - wxTheApp->ProcessIdle(); + // break if ended, perform no further idle processing + if (!IsModal()) + break; + + // do some idle processing + bool needMore = false; + if (wxTheApp) + { + wxTheApp->ProcessPendingEvents(); + needMore = wxTheApp->ProcessIdle(); + } + + if (!needMore) + { + // no more idle processing wanted - block until the next event + [theNSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantFuture] inMode:NSDefaultRunLoopMode dequeue:NO]; + } } [NSApp endModalSession:session];