]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/macnotfy.cpp
1. added native wxMessageDialog implementation for GTK+2
[wxWidgets.git] / src / mac / macnotfy.cpp
index a260697da01056d8bbb9251f4d038a5052117a61..c01f4deaf0cc189dd8cf8d79622dac2524f23e87 100644 (file)
@@ -7,6 +7,10 @@
  * -------------------------------------------------------------------------
  */
 
+#include "wx/wx.h"
+
+#include "wx/mac/private.h"
+
 #include "wx/mac/macnotfy.h"
 
 const short kMaxEvents = 1000 ;
@@ -35,7 +39,18 @@ void wxMacWakeUp()
        SameProcess( &gAppProcess , &psn , &isSame ) ;
        if ( isSame )
        {
+#if TARGET_CARBON
+               EventRef dummyEvent ;
+               OSStatus err = MacCreateEvent(nil, 'WXMC', 'WXMC', GetCurrentEventTime(),
+                        kEventAttributeNone, &dummyEvent);
+        if (err == noErr) 
+        {
+               err = PostEventToQueue(GetMainEventQueue(), dummyEvent,
+                                  kEventPriorityHigh);
+        } 
+#else
                PostEvent( nullEvent , 0 ) ;
+#endif
        }
        else
        {
@@ -58,7 +73,6 @@ void wxMacCreateNotifierTable()
 
 void wxMacDestroyNotifierTable() 
 {
-       wxASSERT( gMacNotificationEvents.top == gMacNotificationEvents.bottom ) ;
 }
 
 wxMacNotifierTableRef wxMacGetNotifierTable() 
@@ -74,6 +88,7 @@ void wxMacAddEvent(
        short wakeUp ) 
 {
        wxMacNotificationEvents *e = (wxMacNotificationEvents *) table ;
+       wxASSERT_MSG( handler != NULL , "illegal notification proc ptr" ) ;
        /* this should be protected eventually */
        short index = e->top++ ;
        
@@ -111,21 +126,31 @@ void wxMacProcessNotifierEvents()
 //     return ;
        
   gInProcessing = true ;
-  while ( gMacNotificationEvents.top != gMacNotificationEvents.bottom )
+  if ( gMacNotificationEvents.top != gMacNotificationEvents.bottom )
   {
-    // consume event at bottom
-       short index = gMacNotificationEvents.bottom++ ;
-    if ( gMacNotificationEvents.bottom == kMaxEvents )
-      gMacNotificationEvents.bottom = 0 ;
-    void* data = gMacNotificationEvents.data[index] ;
-    unsigned long event = gMacNotificationEvents.events[index] ;
-       wxMacNotificationProcPtr handler =  gMacNotificationEvents.proc[index] ;
-       
-       gMacNotificationEvents.data[index] = NULL ;
-       gMacNotificationEvents.events[index] = NULL ;
-       gMacNotificationEvents.proc[index]  = NULL ;
-    
-       handler( event , data  ) ;
+    // we only should process the notifiers that were here when we entered it
+    // otherwise we might never get out...  
+       short count = gMacNotificationEvents.top - gMacNotificationEvents.bottom ;
+       if ( count < 0 )
+        count += kMaxEvents ;
+        
+    while ( count-- )
+    {
+        // consume event at bottom
+       short index = gMacNotificationEvents.bottom++ ;
+        if ( gMacNotificationEvents.bottom == kMaxEvents )
+          gMacNotificationEvents.bottom = 0 ;
+        void* data = gMacNotificationEvents.data[index] ;
+        unsigned long event = gMacNotificationEvents.events[index] ;
+       wxMacNotificationProcPtr handler =  gMacNotificationEvents.proc[index] ;
+       
+       gMacNotificationEvents.data[index] = NULL ;
+       gMacNotificationEvents.events[index] = NULL ;
+       gMacNotificationEvents.proc[index]  = NULL ;
+        
+        if ( handler )
+           handler( event , data  ) ;
+       }
   }
   gInProcessing = false ;
 }