X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3cac36541b70f7149928900257dd4da65d9332a4..ab67e8874db324fab5223cc8d5dff8a8de3e2b77:/src/osx/core/evtloop_cf.cpp diff --git a/src/osx/core/evtloop_cf.cpp b/src/osx/core/evtloop_cf.cpp index f83729f1c9..20f01f8fd6 100644 --- a/src/osx/core/evtloop_cf.cpp +++ b/src/osx/core/evtloop_cf.cpp @@ -25,8 +25,6 @@ #include "wx/evtloop.h" -#if wxUSE_EVENTLOOP_SOURCE - #ifndef WX_PRECOMP #include "wx/log.h" #include "wx/app.h" @@ -48,7 +46,8 @@ // wxCFEventLoopSource and wxCFEventLoop implementation // ============================================================================ -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 +#if wxUSE_EVENTLOOP_SOURCE + namespace { @@ -115,6 +114,9 @@ wxCFEventLoop::AddSourceForFD(int fd, CFRunLoopRef cfloop = CFGetCurrentRunLoop(); CFRunLoopAddSource(cfloop, cfsrc, kCFRunLoopDefaultMode); + // Enable the callbacks initially. + EnableDescriptorCallBacks(cffd, source->GetFlags()); + source->SetFileDescriptor(cffd.release()); return source.release(); @@ -133,18 +135,6 @@ wxCFEventLoopSource::~wxCFEventLoopSource() CFRelease(m_cffd); } -#else // OS X < 10.5 - -wxEventLoopSource * -wxCFEventLoop::AddSourceForFD(int WXUNUSED(fd), - wxEventLoopSourceHandler * WXUNUSED(handler), - int WXUNUSED(flags)) -{ - return NULL; -} - -#endif // MAC_OS_X_VERSION_MAX_ALLOWED - #endif // wxUSE_EVENTLOOP_SOURCE void wxCFEventLoop::OSXCommonModeObserverCallBack(CFRunLoopObserverRef observer, int activity, void *info) @@ -179,31 +169,39 @@ void wxCFEventLoop::CommonModeObserverCallBack(CFRunLoopObserverRef WXUNUSED(obs if ( activity & kCFRunLoopBeforeWaiting ) { + if ( m_processIdleEvents && ProcessIdle() ) + { + WakeUp(); + } + else + { #if wxUSE_THREADS - wxMutexGuiLeaveOrEnter(); + wxMutexGuiLeaveOrEnter(); #endif + } } } -void wxCFEventLoop::DefaultModeObserverCallBack(CFRunLoopObserverRef WXUNUSED(observer), int activity) +void +wxCFEventLoop::DefaultModeObserverCallBack(CFRunLoopObserverRef WXUNUSED(observer), + int WXUNUSED(activity)) { + /* if ( activity & kCFRunLoopBeforeTimers ) { } if ( activity & kCFRunLoopBeforeWaiting ) { - if ( ProcessIdle() ) - { - WakeUp(); - } } + */ } wxCFEventLoop::wxCFEventLoop() { m_shouldExit = false; + m_processIdleEvents = true; m_runLoop = CFGetCurrentRunLoop(); @@ -213,18 +211,19 @@ wxCFEventLoop::wxCFEventLoop() m_commonModeRunLoopObserver = CFRunLoopObserverCreate( kCFAllocatorDefault, kCFRunLoopBeforeTimers | kCFRunLoopBeforeWaiting , true /* repeats */, 0, (CFRunLoopObserverCallBack) wxCFEventLoop::OSXCommonModeObserverCallBack, &ctxt ); CFRunLoopAddObserver(m_runLoop, m_commonModeRunLoopObserver, kCFRunLoopCommonModes); - CFRelease(m_commonModeRunLoopObserver); m_defaultModeRunLoopObserver = CFRunLoopObserverCreate( kCFAllocatorDefault, kCFRunLoopBeforeTimers | kCFRunLoopBeforeWaiting , true /* repeats */, 0, (CFRunLoopObserverCallBack) wxCFEventLoop::OSXDefaultModeObserverCallBack, &ctxt ); CFRunLoopAddObserver(m_runLoop, m_defaultModeRunLoopObserver, kCFRunLoopDefaultMode); - CFRelease(m_defaultModeRunLoopObserver); } wxCFEventLoop::~wxCFEventLoop() { CFRunLoopRemoveObserver(m_runLoop, m_commonModeRunLoopObserver, kCFRunLoopCommonModes); CFRunLoopRemoveObserver(m_runLoop, m_defaultModeRunLoopObserver, kCFRunLoopDefaultMode); + + CFRelease(m_defaultModeRunLoopObserver); + CFRelease(m_commonModeRunLoopObserver); } @@ -442,6 +441,20 @@ void wxCFEventLoop::Exit(int rc) DoStop(); } +wxCFEventLoopPauseIdleEvents::wxCFEventLoopPauseIdleEvents() +{ + wxCFEventLoop* cfl = dynamic_cast(wxEventLoopBase::GetActive()); + if ( cfl ) + cfl->SetProcessIdleEvents(false); +} + +wxCFEventLoopPauseIdleEvents::~wxCFEventLoopPauseIdleEvents() +{ + wxCFEventLoop* cfl = dynamic_cast(wxEventLoopBase::GetActive()); + if ( cfl ) + cfl->SetProcessIdleEvents(true); +} + // TODO Move to thread_osx.cpp #if wxUSE_THREADS