git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@20354 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
152 lines
3.6 KiB
C++
152 lines
3.6 KiB
C++
/* -------------------------------------------------------------------------
|
|
* Project: Mac Notifier Support
|
|
* Name: macnotfy.c
|
|
* Author: Stefan CSomor
|
|
* Purpose: Mac Notifier main file
|
|
* CVSID: $Id$
|
|
* -------------------------------------------------------------------------
|
|
*/
|
|
|
|
#include "wx/wx.h"
|
|
|
|
#include "wx/mac/private.h"
|
|
|
|
#include "wx/mac/macnotfy.h"
|
|
|
|
const short kMaxEvents = 1000 ;
|
|
|
|
struct wxMacNotificationEvents
|
|
{
|
|
short top ;
|
|
short bottom ;
|
|
|
|
wxMacNotificationProcPtr proc[kMaxEvents] ;
|
|
unsigned long events[kMaxEvents] ;
|
|
void* data[kMaxEvents] ;
|
|
} ;
|
|
|
|
typedef struct wxMacNotificationEvents wxMacNotificationEvents ;
|
|
wxMacNotificationEvents gMacNotificationEvents ;
|
|
|
|
ProcessSerialNumber gAppProcess ;
|
|
|
|
void wxMacWakeUp()
|
|
{
|
|
ProcessSerialNumber psn ;
|
|
Boolean isSame ;
|
|
psn.highLongOfPSN = 0 ;
|
|
psn.lowLongOfPSN = kCurrentProcess ;
|
|
SameProcess( &gAppProcess , &psn , &isSame ) ;
|
|
if ( isSame )
|
|
{
|
|
PostEvent( nullEvent , 0 ) ;
|
|
}
|
|
else
|
|
{
|
|
WakeUpProcess( &gAppProcess ) ;
|
|
}
|
|
}
|
|
|
|
void wxMacCreateNotifierTable()
|
|
{
|
|
GetCurrentProcess(&gAppProcess);
|
|
gMacNotificationEvents.top = 0 ;
|
|
gMacNotificationEvents.bottom = 0 ;
|
|
for ( int i = 0 ; i < kMaxEvents ; ++i )
|
|
{
|
|
gMacNotificationEvents.proc[i] = NULL ;
|
|
gMacNotificationEvents.events[i] = NULL ;
|
|
gMacNotificationEvents.data[i] = NULL ;
|
|
}
|
|
}
|
|
|
|
void wxMacDestroyNotifierTable()
|
|
{
|
|
}
|
|
|
|
wxMacNotifierTableRef wxMacGetNotifierTable()
|
|
{
|
|
return (wxMacNotifierTableRef) &gMacNotificationEvents ;
|
|
}
|
|
|
|
void wxMacAddEvent(
|
|
wxMacNotifierTableRef table ,
|
|
wxMacNotificationProcPtr handler ,
|
|
unsigned long event ,
|
|
void* data ,
|
|
short wakeUp )
|
|
{
|
|
wxMacNotificationEvents *e = (wxMacNotificationEvents *) table ;
|
|
wxASSERT_MSG( handler != NULL , "illegal notification proc ptr" ) ;
|
|
/* this should be protected eventually */
|
|
short index = e->top++ ;
|
|
|
|
if ( e->top == kMaxEvents )
|
|
e->top = 0 ;
|
|
|
|
e->proc[index] = handler ;
|
|
e->events[index] = event ;
|
|
e->data[index] = data ;
|
|
if ( wakeUp )
|
|
wxMacWakeUp() ;
|
|
}
|
|
|
|
bool gInProcessing = false ;
|
|
|
|
void wxMacRemoveAllNotifiersForData( wxMacNotifierTableRef table , void* data )
|
|
{
|
|
wxMacNotificationEvents *e = (wxMacNotificationEvents *) table ;
|
|
/* this should be protected eventually */
|
|
short index = e->bottom ;
|
|
|
|
while ( e->top != index )
|
|
{
|
|
if ( e->data[index] == data )
|
|
e->data[index] = NULL ;
|
|
index++ ;
|
|
if ( index == kMaxEvents )
|
|
index = 0 ;
|
|
}
|
|
}
|
|
|
|
void wxMacProcessNotifierEvents()
|
|
{
|
|
// if ( gInProcessing )
|
|
// return ;
|
|
|
|
gInProcessing = true ;
|
|
if ( gMacNotificationEvents.top != gMacNotificationEvents.bottom )
|
|
{
|
|
// 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 ;
|
|
}
|
|
|
|
void wxMacProcessNotifierAndPendingEvents()
|
|
{
|
|
wxMacProcessNotifierEvents() ;
|
|
wxTheApp->ProcessPendingEvents() ;
|
|
}
|