X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a765eef35fa0b614948b16de469b799acdc91319..cdc48273b49b0b90d9587a1ecc5935d38a160620:/src/osx/cocoa/evtloop.mm diff --git a/src/osx/cocoa/evtloop.mm b/src/osx/cocoa/evtloop.mm index d22e47a0e0..bcd24e8405 100644 --- a/src/osx/cocoa/evtloop.mm +++ b/src/osx/cocoa/evtloop.mm @@ -28,6 +28,7 @@ #ifndef WX_PRECOMP #include "wx/app.h" + #include "wx/nonownedwnd.h" #endif // WX_PRECOMP #include "wx/log.h" @@ -77,26 +78,14 @@ static int CalculateNSEventMaskFromEventCategory(wxEventCategory cat) wxGUIEventLoop::wxGUIEventLoop() { - m_sleepTime = 0.0; -} - -void wxGUIEventLoop::WakeUp() -{ - extern void wxMacWakeUp(); - - wxMacWakeUp(); -} - -CFRunLoopRef wxGUIEventLoop::CFGetCurrentRunLoop() const -{ - NSRunLoop* nsloop = [NSRunLoop currentRunLoop]; - return [nsloop getCFRunLoop]; } //----------------------------------------------------------------------------- // events dispatch and loop handling //----------------------------------------------------------------------------- +#if 0 + bool wxGUIEventLoop::Pending() const { #if 0 @@ -155,60 +144,76 @@ bool wxGUIEventLoop::Dispatch() return true; } -bool wxGUIEventLoop::YieldFor(long eventsToProcess) +#endif + +int wxGUIEventLoop::DoDispatchTimeout(unsigned long timeout) { -#if wxUSE_THREADS - // Yielding from a non-gui thread needs to bail out, otherwise we end up - // possibly sending events in the thread too. - if ( !wxThread::IsMain() ) - { - return true; - } -#endif // wxUSE_THREADS + wxMacAutoreleasePool autoreleasepool; - m_isInsideYield = true; - m_eventsToProcessInsideYield = eventsToProcess; + NSEvent *event = [NSApp + nextEventMatchingMask:NSAnyEventMask + untilDate:[NSDate dateWithTimeIntervalSinceNow: timeout/1000] + inMode:NSDefaultRunLoopMode + dequeue: YES]; + + if ( event == nil ) + return -1; -#if wxUSE_LOG - // disable log flushing from here because a call to wxYield() shouldn't - // normally result in message boxes popping up &c - wxLog::Suspend(); -#endif // wxUSE_LOG + [NSApp sendEvent: event]; - // process all pending events: - while ( Pending() ) - Dispatch(); + return 1; +} - // it's necessary to call ProcessIdle() to update the frames sizes which - // might have been changed (it also will update other things set from - // OnUpdateUI() which is a nice (and desired) side effect) - while ( ProcessIdle() ) {} +void wxGUIEventLoop::DoRun() +{ + wxMacAutoreleasePool autoreleasepool; + [NSApp run]; +} - // if there are pending events, we must process them. - if (wxTheApp) - wxTheApp->ProcessPendingEvents(); +void wxGUIEventLoop::DoStop() +{ + [NSApp stop:0]; +} -#if wxUSE_LOG - wxLog::Resume(); -#endif // wxUSE_LOG - m_isInsideYield = false; +// TODO move into a evtloop_osx.cpp - return true; +wxModalEventLoop::wxModalEventLoop(wxWindow *modalWindow) +{ + m_modalWindow = dynamic_cast (modalWindow); + wxASSERT_MSG( m_modalWindow != NULL, "must pass in a toplevel window for modal event loop" ); + m_modalNativeWindow = m_modalWindow->GetWXWindow(); } -int wxGUIEventLoop::DispatchTimeout(unsigned long timeout) +wxModalEventLoop::wxModalEventLoop(WXWindow modalNativeWindow) { - wxMacAutoreleasePool autoreleasepool; + m_modalWindow = NULL; + wxASSERT_MSG( modalNativeWindow != NULL, "must pass in a toplevel window for modal event loop" ); + m_modalNativeWindow = modalNativeWindow; +} - NSEvent *event = [NSApp - nextEventMatchingMask:NSAnyEventMask - untilDate:[NSDate dateWithTimeIntervalSinceNow: timeout/1000] - inMode:NSDefaultRunLoopMode - dequeue: YES]; - if ( !event ) - return -1; +// END move into a evtloop_osx.cpp - [NSApp sendEvent: event]; +void wxModalEventLoop::DoRun() +{ + wxMacAutoreleasePool pool; - return true; + // 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 sharedApplication]; + if (![NSApp isRunning]) + { + while(NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:nil inMode:NSDefaultRunLoopMode dequeue:YES]) + { + [NSApp sendEvent:event]; + } + } + + [NSApp runModalForWindow:m_modalNativeWindow]; +} + +void wxModalEventLoop::DoStop() +{ + [NSApp stopModal]; } +