]> git.saurik.com Git - wxWidgets.git/commitdiff
Create RunLoop that can be used to process pending events so that events will still...
authorKevin Hock <hockkn@yahoo.com>
Mon, 28 Mar 2005 18:47:46 +0000 (18:47 +0000)
committerKevin Hock <hockkn@yahoo.com>
Mon, 28 Mar 2005 18:47:46 +0000 (18:47 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@33127 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/mac/carbon/app.h
src/mac/carbon/app.cpp

index ca6ecad5cb6b424b8c874fc19ee0131977031dc0..16d2af307808b4c2db6ac79688c19412b3c6bc52 100644 (file)
@@ -21,6 +21,8 @@
 #include "wx/gdicmn.h"
 #include "wx/event.h"
 
+#include <CoreFoundation/CoreFoundation.h>
+
 class WXDLLEXPORT wxFrame;
 class WXDLLEXPORT wxWindowMac;
 class WXDLLEXPORT wxApp ;
@@ -105,6 +107,7 @@ private:
     WXEVENTHANDLERREF     m_macEventHandler ;
     WXEVENTHANDLERCALLREF m_macCurrentEventHandlerCallRef ;
     WXEVENTREF            m_macCurrentEvent ;
+    CFRunLoopSourceRef    m_macEventPosted ;
 
 public:
     static bool           s_macSupportPCMenuShortcuts ;
index 43c7cf1b29d145c01911d2dd75894b4c7fe8eac2..908557b7da5403dcca31a50bd41b87f0343b87f4 100644 (file)
@@ -607,6 +607,11 @@ pascal static void wxMacAssertOutputHandler(OSType componentSignature, UInt32 op
 
 #endif //__WXDEBUG__
 
+extern "C" {
+   /* m_macEventPosted run loop source callback: */
+   void macPostedEventCallback(void *unused) { wxTheApp->ProcessPendingEvents(); }
+}
+
 bool wxApp::Initialize(int& argc, wxChar **argv)
 {
     // Mac-specific
@@ -674,6 +679,13 @@ bool wxApp::Initialize(int& argc, wxChar **argv)
 
     wxMacCreateNotifierTable() ;
 
+    /* connect posted events to common-mode run loop so that wxPostEvent events
+       are handled even while we're in the menu or on a scrollbar */
+    CFRunLoopSourceContext event_posted_context = {0};
+    event_posted_context.perform = macPostedEventCallback;
+    m_macEventPosted = CFRunLoopSourceCreate(NULL,0,&event_posted_context);
+    CFRunLoopAddSource(CFRunLoopGetCurrent(), m_macEventPosted, kCFRunLoopCommonModes);
+
     UMAShowArrowCursor() ;
 
     return true;
@@ -721,6 +733,12 @@ void wxApp::CleanUp()
     wxToolTip::RemoveToolTips() ;
 #endif
 
+    if (m_macEventPosted)
+    {
+        CFRelease(m_macEventPosted);
+    }
+    m_macEventPosted = NULL;
+
     // One last chance for pending objects to be cleaned up
     wxTheApp->DeletePendingObjects();
 
@@ -857,6 +875,7 @@ wxApp::wxApp()
 
   m_macCurrentEvent = NULL ;
   m_macCurrentEventHandlerCallRef = NULL ;
+  m_macEventPosted = NULL ;
 }
 
 int wxApp::MainLoop()
@@ -913,6 +932,10 @@ void wxApp::OnIdle(wxIdleEvent& event)
 
 void wxApp::WakeUpIdle()
 {
+    if (m_macEventPosted)
+    {
+        CFRunLoopSourceSignal(m_macEventPosted);
+    }
     wxMacWakeUp() ;
 }