X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ee6b1d97e741fda8d579fa21cbc89f0c91615cef..02a1dfbae942c883d8651e34dcfbc5153aabc56e:/src/mac/macnotfy.cpp diff --git a/src/mac/macnotfy.cpp b/src/mac/macnotfy.cpp index 3546eeb7f2..507605510d 100644 --- a/src/mac/macnotfy.cpp +++ b/src/mac/macnotfy.cpp @@ -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 ; }