Bug 44678 - On Mac, use a custom Carbon event to signal that the PLEvent queue needs to be processed. r=sdagley/sr=sfraser

This commit is contained in:
ccarlen%netscape.com 2002-12-19 15:25:57 +00:00
Родитель eaddaf794a
Коммит 51f74c3342
2 изменённых файлов: 133 добавлений и 29 удалений

Просмотреть файл

@ -114,7 +114,10 @@ void nsMacNSPREventQueueHandler::StartPumping()
{
++mRefCnt;
NS_LOG_ADDREF(this, mRefCnt, "nsMacNSPREventQueueHandler", sizeof(*this));
#if !TARGET_CARBON
StartRepeating();
#endif
}
//-------------------------------------------------------------------------
@ -126,7 +129,9 @@ PRBool nsMacNSPREventQueueHandler::StopPumping()
--mRefCnt;
NS_LOG_RELEASE(this, mRefCnt, "nsMacNSPREventQueueHandler");
if (mRefCnt == 0) {
#if !TARGET_CARBON
StopRepeating();
#endif
return PR_TRUE;
}
}

Просмотреть файл

@ -47,20 +47,21 @@
#include <kernel/OS.h>
#endif
#if defined(XP_MACOSX)
#undef XP_UNIX
#define XP_MAC 1
#if defined(XP_MAC) || defined(XP_MACOSX)
#if !defined(MOZ_WIDGET_COCOA) && TARGET_CARBON
#include <CarbonEvents.h>
#define MAC_USE_CARBON_EVENT
#else
#include <Processes.h>
#define MAC_USE_WAKEUPPROCESS
#endif
#endif
#if defined(XP_MAC)
#include <AppleEvents.h>
#include <Processes.h>
#if !defined(XP_MACOSX)
#include "pprthred.h"
#endif
#else
#include "private/pprthred.h"
#endif /* XP_MAC */
#endif /* defined(XP_MAC) */
#if defined(VMS)
/*
@ -134,7 +135,7 @@ struct PLEventQueue {
PRPackedBool timerSet;
#endif
#if defined(XP_UNIX)
#if defined(XP_UNIX) && !defined(XP_MACOSX)
#if defined(VMS)
int efn;
#else
@ -147,9 +148,14 @@ struct PLEventQueue {
PRBool removeMsg;
#elif defined(XP_BEOS)
port_id eventport;
#elif defined(XP_MAC)
#elif defined(XP_MAC) || defined(XP_MACOSX)
#if defined(MAC_USE_CARBON_EVENT)
EventHandlerUPP eventHandlerUPP;
EventHandlerRef eventHandlerRef;
#elif defined(MAC_USE_WAKEUPPROCESS)
ProcessSerialNumber psn;
#endif
#endif
};
#define PR_EVENT_PTR(_qp) \
@ -183,6 +189,18 @@ static LPCTSTR _md_GetEventQueuePropName() {
}
#endif
#if defined(MAC_USE_CARBON_EVENT)
enum {
kEventClassPL = FOUR_CHAR_CODE('PLEC'),
kEventProcessPLEvents = 1,
kEventParamPLEventQueue = FOUR_CHAR_CODE('OWNQ')
};
static pascal Boolean _md_CarbonEventComparator(EventRef inEvent, void *inCompareData);
#endif
/*******************************************************************************
* Event Queue Operations
******************************************************************************/
@ -220,11 +238,12 @@ static PLEventQueue * _pl_CreateEventQueue(char *name,
#if defined(_WIN32) || defined(XP_OS2)
self->removeMsg = PR_TRUE;
#endif
self->notified = PR_FALSE;
#if defined (XP_MAC)
#if defined(MAC_USE_WAKEUPPROCESS)
self->psn.lowLongOfPSN = kNoProcess;
#endif
self->notified = PR_FALSE;
PR_INIT_CLIST(&self->queue);
if ( qtype == EventQueueIsNative ) {
err = _pl_SetupNativeNotifier(self);
@ -304,7 +323,7 @@ PL_PostEvent(PLEventQueue* self, PLEvent* event)
mon = self->monitor;
PR_EnterMonitor(mon);
#ifdef XP_UNIX
#if defined(XP_UNIX) && !defined(XP_MACOSX)
if (self->idFunc && event)
event->id = self->idFunc(self->idFuncClosure);
#endif
@ -620,7 +639,7 @@ PL_InitEvent(PLEvent* self, void* owner,
PR_ASSERT(self->lock);
self->condVar = PR_NewCondVar(self->lock);
PR_ASSERT(self->condVar);
#ifdef XP_UNIX
#if defined(XP_UNIX) && !defined(XP_MACOSX)
self->id = 0;
#endif
}
@ -813,7 +832,7 @@ _pl_SetupNativeNotifier(PLEventQueue* self)
PR_LOG(event_lm, PR_LOG_DEBUG,
("$$$ Allocated event flag %d", self->efn));
return PR_SUCCESS;
#elif defined(XP_UNIX)
#elif defined(XP_UNIX) && !defined(XP_MACOSX)
int err;
int flags;
@ -889,7 +908,7 @@ _pl_CleanupNativeNotifier(PLEventQueue* self)
("$$$ Freeing event flag %d", self->efn));
status = LIB$FREE_EF(&self->efn);
}
#elif defined(XP_UNIX)
#elif defined(XP_UNIX) && !defined(XP_MACOSX)
close(self->eventPipe[0]);
close(self->eventPipe[1]);
#elif defined(_WIN32)
@ -901,6 +920,15 @@ _pl_CleanupNativeNotifier(PLEventQueue* self)
DestroyWindow(self->eventReceiverWindow);
#elif defined(XP_OS2)
WinDestroyWindow(self->eventReceiverWindow);
#elif defined(MAC_USE_CARBON_EVENT)
EventComparatorUPP comparator = NewEventComparatorUPP(_md_CarbonEventComparator);
PR_ASSERT(comparator != NULL);
if (comparator) {
FlushSpecificEventsFromQueue(GetMainEventQueue(), comparator, self);
DisposeEventComparatorUPP(comparator);
}
DisposeEventHandlerUPP(self->eventHandlerUPP);
RemoveEventHandler(self->eventHandlerRef);
#endif
}
@ -1131,7 +1159,7 @@ _pl_NativeNotify(PLEventQueue* self)
else
return PR_FAILURE;
}/* --- end _pl_NativeNotify() --- */
#elif defined(XP_UNIX)
#elif defined(XP_UNIX) && !defined(XP_MACOSX)
static PRStatus
_pl_NativeNotify(PLEventQueue* self)
@ -1151,7 +1179,7 @@ _pl_NativeNotify(PLEventQueue* self)
} else
return PR_FAILURE;
}/* --- end _pl_NativeNotify() --- */
#endif /* XP_UNIX */
#endif /* defined(XP_UNIX) && !defined(XP_MACOSX) */
#if defined(XP_BEOS)
struct ThreadInterfaceData
@ -1172,14 +1200,30 @@ _pl_NativeNotify(PLEventQueue* self)
}
#endif /* XP_BEOS */
#if defined(XP_MAC)
#if defined(XP_MAC) || defined(XP_MACOSX)
static PRStatus
_pl_NativeNotify(PLEventQueue* self)
{
#if defined(MAC_USE_CARBON_EVENT)
OSErr err;
EventRef newEvent;
if (CreateEvent(NULL, kEventClassPL, kEventProcessPLEvents,
0, kEventAttributeNone, &newEvent) != noErr)
return PR_FAILURE;
err = SetEventParameter(newEvent, kEventParamPLEventQueue,
typeUInt32, sizeof(PREventQueue*), &self);
if (err == noErr) {
err = PostEventToQueue(GetMainEventQueue(), newEvent, kEventPriorityLow);
ReleaseEvent(newEvent);
}
if (err != noErr)
return PR_FAILURE;
#elif defined(MAC_USE_WAKEUPPROCESS)
WakeUpProcess(&self->psn);
return PR_SUCCESS; /* XXX can fail? */
#endif
return PR_SUCCESS;
}
#endif /* XP_MAC */
#endif /* defined(XP_MAC) || defined(XP_MACOSX) */
static PRStatus
_pl_AcknowledgeNativeNotify(PLEventQueue* self)
@ -1222,7 +1266,7 @@ _pl_AcknowledgeNativeNotify(PLEventQueue* self)
*/
sys$clref(self->efn);
return PR_SUCCESS;
#elif defined(XP_UNIX)
#elif defined(XP_UNIX) && !defined(XP_MACOSX)
PRInt32 count;
unsigned char c;
@ -1256,7 +1300,7 @@ PL_GetEventQueueSelectFD(PLEventQueue* self)
#if defined(VMS)
return -(self->efn);
#elif defined(XP_UNIX)
#elif defined(XP_UNIX) && !defined(XP_MACOSX)
return self->eventPipe[0];
#else
return -1; /* other platforms don't handle this (yet) */
@ -1457,7 +1501,7 @@ static void _md_CreateEventQueue( PLEventQueue *eventQueue )
} /* end _md_CreateEventQueue() */
#endif /* XP_OS2 */
#if defined(XP_UNIX) || defined(XP_BEOS)
#if (defined(XP_UNIX) && !defined(XP_MACOSX)) || defined(XP_BEOS)
/*
** _md_CreateEventQueue() -- ModelDependent initializer
*/
@ -1469,22 +1513,77 @@ static void _md_CreateEventQueue( PLEventQueue *eventQueue )
*/
return;
} /* end _md_CreateEventQueue() */
#endif /* XP_UNIX */
#endif /* (defined(XP_UNIX) && !defined(XP_MACOSX)) || defined(XP_BEOS) */
#if defined(XP_MAC)
#if defined(MAC_USE_CARBON_EVENT)
/*
** _md_CreateEventQueue() -- ModelDependent initializer
*/
static pascal OSStatus _md_EventReceiverProc(EventHandlerCallRef nextHandler,
EventRef inEvent,
void* userData)
{
if (GetEventClass(inEvent) == kEventClassPL &&
GetEventKind(inEvent) == kEventProcessPLEvents)
{
PREventQueue *queue;
if (GetEventParameter(inEvent, kEventParamPLEventQueue,
typeUInt32, NULL, sizeof(PREventQueue*), NULL,
&queue) == noErr)
{
PL_ProcessPendingEvents(queue);
return noErr;
}
}
return eventNotHandledErr;
}
static pascal Boolean _md_CarbonEventComparator(EventRef inEvent,
void *inCompareData)
{
Boolean match = false;
if (GetEventClass(inEvent) == kEventClassPL &&
GetEventKind(inEvent) == kEventProcessPLEvents)
{
PREventQueue *queue;
match = ((GetEventParameter(inEvent, kEventParamPLEventQueue,
typeUInt32, NULL, sizeof(PREventQueue*), NULL,
&queue) == noErr) && (queue == inCompareData));
}
return match;
}
#endif /* defined(MAC_USE_CARBON_EVENT) */
#if defined(XP_MAC) || defined(XP_MACOSX)
static void _md_CreateEventQueue( PLEventQueue *eventQueue )
{
#if defined(MAC_USE_CARBON_EVENT)
eventQueue->eventHandlerUPP = NewEventHandlerUPP(_md_EventReceiverProc);
PR_ASSERT(eventQueue->eventHandlerUPP);
if (eventQueue->eventHandlerUPP)
{
EventTypeSpec eventType;
eventType.eventClass = kEventClassPL;
eventType.eventKind = kEventProcessPLEvents;
InstallApplicationEventHandler(eventQueue->eventHandlerUPP, 1, &eventType,
eventQueue, &eventQueue->eventHandlerRef);
PR_ASSERT(eventQueue->eventHandlerRef);
}
#elif defined(MAC_USE_WAKEUPPROCESS)
OSErr err = GetCurrentProcess(&eventQueue->psn);
PR_ASSERT(err == noErr);
#endif
} /* end _md_CreateEventQueue() */
#endif /* XP_MAC */
#endif /* defined(XP_MAC) || defined(XP_MACOSX) */
/* extra functions for unix */
#ifdef XP_UNIX
#if defined(XP_UNIX) && !defined(XP_MACOSX)
PR_IMPLEMENT(PRInt32)
PL_ProcessEventsBeforeID(PLEventQueue *aSelf, unsigned long aID)
@ -1578,6 +1677,6 @@ PL_UnregisterEventIDFunc(PLEventQueue *aSelf)
aSelf->idFuncClosure = 0;
}
#endif /* XP_UNIX */
#endif /* defined(XP_UNIX) && !defined(XP_MACOSX) */
/* --- end plevent.c --- */