X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a765eef35fa0b614948b16de469b799acdc91319..ff1e36afc063262750da38ca866784645be13520:/src/osx/cocoa/evtloop.mm diff --git a/src/osx/cocoa/evtloop.mm b/src/osx/cocoa/evtloop.mm index d22e47a0e0..11e9d21129 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 @@ -129,10 +118,16 @@ bool wxGUIEventLoop::Dispatch() inMode:NSDefaultRunLoopMode dequeue: YES]) { + WXEVENTREF formerEvent = wxTheApp == NULL ? NULL : wxTheApp->MacGetCurrentEvent(); + WXEVENTHANDLERCALLREF formerHandler = wxTheApp == NULL ? NULL : wxTheApp->MacGetCurrentEventHandlerCallRef(); + if (wxTheApp) wxTheApp->MacSetCurrentEvent(event, NULL); m_sleepTime = 0.0; [NSApp sendEvent: event]; + + if (wxTheApp) + wxTheApp->MacSetCurrentEvent(formerEvent , formerHandler); } else { @@ -155,60 +150,83 @@ 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; + + [NSApp sendEvent: event]; + + 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 +void wxGUIEventLoop::DoRun() +{ + wxMacAutoreleasePool autoreleasepool; + [NSApp run]; +} - // process all pending events: - while ( Pending() ) - Dispatch(); +void wxGUIEventLoop::DoStop() +{ + [NSApp stop:0]; +} - // 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() ) {} +CFRunLoopRef wxGUIEventLoop::CFGetCurrentRunLoop() const +{ + NSRunLoop* nsloop = [NSRunLoop currentRunLoop]; + return [nsloop getCFRunLoop]; +} - // if there are pending events, we must process them. - if (wxTheApp) - wxTheApp->ProcessPendingEvents(); -#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]; +} +