]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/core/evtloop_cf.cpp
Allow non-modal windows shown from modal dialogs to work in wxOSX.
[wxWidgets.git] / src / osx / core / evtloop_cf.cpp
index 4b3c9ad9234a32075421ccacba1acaad80f2e5e2..6dc470f8174d0d0ef5830b135d367f628991acbc 100644 (file)
@@ -146,14 +146,14 @@ wxCFEventLoop::AddSourceForFD(int WXUNUSED(fd),
 
 #endif // wxUSE_EVENTLOOP_SOURCE
 
-void wxObserverCallBack(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info)
+extern "C" void wxObserverCallBack(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info)
 {
     wxCFEventLoop * eventloop = static_cast<wxCFEventLoop *>(info);
     if ( eventloop )
         eventloop->ObserverCallBack(observer, activity);
 }
 
-void wxCFEventLoop::ObserverCallBack(CFRunLoopObserverRef observer, int activity)
+void wxCFEventLoop::ObserverCallBack(CFRunLoopObserverRef WXUNUSED(observer), int activity)
 {
     if ( activity & kCFRunLoopBeforeTimers )
     {
@@ -196,13 +196,14 @@ wxCFEventLoop::wxCFEventLoop()
     bzero( &ctxt, sizeof(ctxt) );
     ctxt.info = this;
     m_runLoopObserver = CFRunLoopObserverCreate( kCFAllocatorDefault, kCFRunLoopBeforeTimers | kCFRunLoopBeforeWaiting , true /* repeats */, 0,
-                                                wxObserverCallBack, &ctxt );
-    CFRunLoopAddObserver(m_runLoop, m_runLoopObserver, kCFRunLoopDefaultMode);
+                                            wxObserverCallBack, &ctxt );
+    CFRunLoopAddObserver(m_runLoop, m_runLoopObserver, kCFRunLoopCommonModes);
+    CFRelease(m_runLoopObserver);
 }
 
 wxCFEventLoop::~wxCFEventLoop()
 {
-    CFRunLoopRemoveObserver(m_runLoop, m_runLoopObserver, kCFRunLoopDefaultMode);
+    CFRunLoopRemoveObserver(m_runLoop, m_runLoopObserver, kCFRunLoopCommonModes);
 }
 
 
@@ -213,11 +214,21 @@ CFRunLoopRef wxCFEventLoop::CFGetCurrentRunLoop() const
 
 void wxCFEventLoop::WakeUp()
 {
-    extern void wxMacWakeUp();
+    CFRunLoopWakeUp(m_runLoop);
+}
+
+#if wxUSE_BASE
 
-    wxMacWakeUp();
+void wxMacWakeUp()
+{
+    wxEventLoopBase * const loop = wxEventLoopBase::GetActive();
+    
+    if ( loop )
+        loop->WakeUp();
 }
 
+#endif
+
 bool wxCFEventLoop::YieldFor(long eventsToProcess)
 {
 #if wxUSE_THREADS
@@ -267,7 +278,7 @@ bool wxCFEventLoop::Pending() const
 
 int wxCFEventLoop::DoProcessEvents()
 {
-    return DispatchTimeout( 1000 );
+    return DispatchTimeout( 0 );
 }
 
 bool wxCFEventLoop::Dispatch()
@@ -409,27 +420,3 @@ void wxCFEventLoop::Exit(int rc)
     m_shouldExit = true;
     DoStop();
 }
-
-#if wxUSE_GUI
-
-wxModalEventLoop::wxModalEventLoop(wxWindow *winModal)
-{
-    m_modalWindow = dynamic_cast<wxNonOwnedWindow*> (winModal);
-    wxASSERT_MSG( m_modalWindow != NULL, "must pass in a toplevel window for modal event loop" );
-}
-
-#ifdef __WXOSX_IPHONE__
-
-void wxModalEventLoop::DoRun()
-{
-    // presentModalViewController:animated:
-}
-
-void wxModalEventLoop::DoStop()
-{
-    // (void)dismissModalViewControllerAnimated:(BOOL)animated
-}
-
-#endif // wxUSE_GUI
-
-#endif