wxCFEventLoop::wxCFEventLoop() { m_shouldExit = false; m_runLoop = CFGetCurrentRunLoop(); CFRunLoopObserverContext ctxt; bzero( &ctxt, sizeof(ctxt) ); ctxt.info = this; 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() { m_shouldExit = false; m_processIdleEvents = true; #if wxUSE_UIACTIONSIMULATOR m_shouldWaitForEvent = false; #endif m_runLoop = CFGetCurrentRunLoop(); CFRunLoopObserverContext ctxt; bzero( &ctxt, sizeof(ctxt) ); ctxt.info = this; m_commonModeRunLoopObserver = CFRunLoopObserverCreate( kCFAllocatorDefault, kCFRunLoopBeforeTimers | kCFRunLoopBeforeWaiting , true /* repeats */, 0, (CFRunLoopObserverCallBack) wxCFEventLoop::OSXCommonModeObserverCallBack, &ctxt ); CFRunLoopAddObserver(m_runLoop, m_commonModeRunLoopObserver, kCFRunLoopCommonModes); m_defaultModeRunLoopObserver = CFRunLoopObserverCreate( kCFAllocatorDefault, kCFRunLoopBeforeTimers | kCFRunLoopBeforeWaiting , true /* repeats */, 0, (CFRunLoopObserverCallBack) wxCFEventLoop::OSXDefaultModeObserverCallBack, &ctxt ); CFRunLoopAddObserver(m_runLoop, m_defaultModeRunLoopObserver, kCFRunLoopDefaultMode); }
wxEventLoopSource * wxCFEventLoop::AddSourceForFD(int fd, wxEventLoopSourceHandler *handler, int flags) { wxCHECK_MSG( fd != -1, NULL, "can't monitor invalid fd" ); wxScopedPtr<wxCFEventLoopSource> source(new wxCFEventLoopSource(handler, flags)); CFFileDescriptorContext ctx = { 0, source.get(), NULL, NULL, NULL }; wxCFRef<CFFileDescriptorRef> cffd(CFFileDescriptorCreate ( kCFAllocatorDefault, fd, true, // close on invalidate wx_cffiledescriptor_callback, &ctx )); if ( !cffd ) return NULL; wxCFRef<CFRunLoopSourceRef> cfsrc(CFFileDescriptorCreateRunLoopSource(kCFAllocatorDefault, cffd, 0)); if ( !cfsrc ) return NULL; CFRunLoopRef cfloop = CFGetCurrentRunLoop(); CFRunLoopAddSource(cfloop, cfsrc, kCFRunLoopDefaultMode); // Enable the callbacks initially. EnableDescriptorCallBacks(cffd, source->GetFlags()); source->SetFileDescriptor(cffd.release()); return source.release(); }
void wxCFEventLoop::OSXDoStop() { CFRunLoopStop(CFGetCurrentRunLoop()); }