]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/macnotfy.cpp
added mlte implementation
[wxWidgets.git] / src / mac / macnotfy.cpp
index 3546eeb7f27defcb123bec949b6bdb68c06521b1..507605510db7d7c126d65b0a07ea3f64a8b47969 100644 (file)
@@ -7,6 +7,10 @@
  * -------------------------------------------------------------------------
  */
 
+#include "wx/wx.h"
+
+#include "wx/mac/private.h"
+
 #include "wx/mac/macnotfy.h"
 
 const short kMaxEvents = 1000 ;
@@ -24,7 +28,7 @@ struct wxMacNotificationEvents
 typedef struct wxMacNotificationEvents wxMacNotificationEvents ;
 wxMacNotificationEvents gMacNotificationEvents ;
 
-ProcessSerialNumber gSocketProcess ;
+ProcessSerialNumber gAppProcess ;
 
 void wxMacWakeUp()
 {
@@ -32,20 +36,20 @@ void wxMacWakeUp()
        Boolean isSame ;
        psn.highLongOfPSN = 0 ;
        psn.lowLongOfPSN = kCurrentProcess ;
-       SameProcess( &gSocketProcess , &psn , &isSame ) ;
+       SameProcess( &gAppProcess , &psn , &isSame ) ;
        if ( isSame )
        {
                PostEvent( nullEvent , 0 ) ;
        }
        else
        {
-               WakeUpProcess( &gSocketProcess ) ;
+               WakeUpProcess( &gAppProcess ) ;
        }
 }
 
 void wxMacCreateNotifierTable()
 {
-       GetCurrentProcess(&gSocketProcess);
+       GetCurrentProcess(&gAppProcess);
        gMacNotificationEvents.top = 0 ;
        gMacNotificationEvents.bottom = 0 ;
        for ( int i = 0 ; i < kMaxEvents ; ++i )
@@ -58,7 +62,6 @@ void wxMacCreateNotifierTable()
 
 void wxMacDestroyNotifierTable() 
 {
-       wxASSERT( gMacNotificationEvents.top == gMacNotificationEvents.bottom ) ;
 }
 
 wxMacNotifierTableRef wxMacGetNotifierTable() 
@@ -74,6 +77,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 +115,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 ;
 }