Mercurial > projects > hoofbaby
diff deps/Platinum/ThirdParty/Neptune/Source/System/Cocoa/NptCocoaMessageQueue.mm @ 0:3425707ddbf6
Initial import (hopefully this mercurial stuff works...)
author | fraserofthenight |
---|---|
date | Mon, 06 Jul 2009 08:06:28 -0700 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/deps/Platinum/ThirdParty/Neptune/Source/System/Cocoa/NptCocoaMessageQueue.mm Mon Jul 06 08:06:28 2009 -0700 @@ -0,0 +1,98 @@ +/***************************************************************** +| +| Neptune - Cocoa Message Queue +| +| (c) 2001-2008 Gilles Boccon-Gibod +| Author: Gilles Boccon-Gibod (bok@bok.net) +| +****************************************************************/ + +/*---------------------------------------------------------------------- +| includes ++---------------------------------------------------------------------*/ +#include "NptCocoaMessageQueue.h" +#include <Cocoa/Cocoa.h> + +/*---------------------------------------------------------------------- +| NPT_CocoaMessageWrapper ++---------------------------------------------------------------------*/ +@interface NPT_CocoaMessageCapsule : NSObject +{ + NPT_Message* message; + NPT_MessageHandler* handler; +} +-(id) initWithMessage: (NPT_Message*) message andHandler: (NPT_MessageHandler*) handler; +-(void) handle; +@end + +@implementation NPT_CocoaMessageCapsule +-(id) initWithMessage: (NPT_Message*) aMessage andHandler: (NPT_MessageHandler*) aHandler +{ + if ((self = [super init])) { + message = aMessage; + handler = aHandler; + } + return self; +} + +-(void) dealloc +{ + [super dealloc]; + delete message; +} + +-(void) handle +{ + if (handler && message) { + handler->HandleMessage(message); + } +} +@end + +/*---------------------------------------------------------------------- +| NPT_CocoaMessageQueue::NPT_CocoaMessageQueue ++---------------------------------------------------------------------*/ +NPT_CocoaMessageQueue::NPT_CocoaMessageQueue() +{ +} + +/*---------------------------------------------------------------------- +| NPT_CocoaMessageQueue::~NPT_CocoaMessageQueue ++---------------------------------------------------------------------*/ +NPT_CocoaMessageQueue::~NPT_CocoaMessageQueue() +{ +} + +/*---------------------------------------------------------------------- +| NPT_CocoaMessageQueue::PumpMessage ++---------------------------------------------------------------------*/ +NPT_Result +NPT_CocoaMessageQueue::PumpMessage(NPT_Timeout) +{ + // you cannot pump messages on this type of queue, since they will + // be pumped by the main application message loop + return NPT_ERROR_NOT_SUPPORTED; +} + +/*---------------------------------------------------------------------- +| NPT_CocoaMessageQueue::QueueMessage ++---------------------------------------------------------------------*/ +NPT_Result +NPT_CocoaMessageQueue::QueueMessage(NPT_Message* message, + NPT_MessageHandler* handler) +{ + // create a capsule to represent the message and handler + NPT_CocoaMessageCapsule* capsule = [NPT_CocoaMessageCapsule alloc]; + [capsule initWithMessage: message andHandler: handler]; + + // trigger the handling of the message on the main thread + [capsule performSelectorOnMainThread: @selector(handle) + withObject: nil + waitUntilDone: FALSE]; + + // we no longer hold a reference to the capsule (it will be released + // by the receiving thread) + [capsule release]; + + return NPT_SUCCESS; +}