diff options
Diffstat (limited to 'Src/Wasabi/api/timer/timerclient.h')
-rw-r--r-- | Src/Wasabi/api/timer/timerclient.h | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/Src/Wasabi/api/timer/timerclient.h b/Src/Wasabi/api/timer/timerclient.h new file mode 100644 index 00000000..52860a01 --- /dev/null +++ b/Src/Wasabi/api/timer/timerclient.h @@ -0,0 +1,183 @@ +#ifndef __TIMER_CLIENT_H +#define __TIMER_CLIENT_H + +#include <bfc/dispatch.h> +#include <bfc/common.h> +#include <bfc/depend.h> +#include <map> + +#define DEFERREDCB_TIMERID -2 + +class TimerClient; + +#ifdef _WIN32 +typedef UINT_PTR TimerToken ; +#elif defined(__APPLE__) +typedef EventLoopTimerRef TimerToken; +#else +#error port me! +#endif + +typedef struct { + TimerClient *origin; + intptr_t param1; + intptr_t param2; +} deferred_callback; + +class NOVTABLE TimerClient : public Dispatchable +{ +protected: + TimerClient() { } + +public: + int timerclient_setTimer(int id, int ms); + int timerclient_killTimer(int id); + void timerclient_postDeferredCallback(intptr_t param1, intptr_t param2=0, int mindelay=0); + int timerclient_onDeferredCallback(intptr_t param1, intptr_t param2); + void timerclient_timerCallback(TimerToken token); + + TimerClient *timerclient_getMasterClient(); + void timerclient_onMasterClientMultiplex(); + api_dependent *timerclient_getDependencyPtr(); + void timerclient_setSkipped(int s); + int timerclient_getSkipped(); + void timerclient_setTimerDelay(int td); + int timerclient_getTimerDelay(); + const wchar_t *timerclient_getName(); + + enum { + TIMERCLIENT_TIMERCALLBACK = 101, + TIMERCLIENT_SETTIMER = 110, + TIMERCLIENT_KILLTIMER = 120, + TIMERCLIENT_GETMASTERCLIENT = 130, + TIMERCLIENT_ONMASTERMUX = 140, + TIMERCLIENT_GETDEPPTR = 150, + TIMERCLIENT_SETSKIPPED = 160, + TIMERCLIENT_GETSKIPPED = 170, + TIMERCLIENT_SETTIMERDELAY = 180, + TIMERCLIENT_GETTIMERDELAY = 190, + TIMERCLIENT_POSTDEFERREDCB = 200, + TIMERCLIENT_ONDEFERREDCB = 210, + TIMERCLIENT_GETNAME = 220, + }; +}; + +inline void TimerClient::timerclient_timerCallback(TimerToken token) { + _voidcall(TIMERCLIENT_TIMERCALLBACK, token); +} + +inline int TimerClient::timerclient_setTimer(int id, int ms) { + return _call(TIMERCLIENT_SETTIMER, 0, id, ms); +} + +inline int TimerClient::timerclient_killTimer(int id) { + return _call(TIMERCLIENT_KILLTIMER, 0, id); +} + +inline TimerClient *TimerClient::timerclient_getMasterClient() { + return _call(TIMERCLIENT_GETMASTERCLIENT, (TimerClient *)NULL); +} + +inline void TimerClient::timerclient_onMasterClientMultiplex() { + _voidcall(TIMERCLIENT_ONMASTERMUX); +} + +inline api_dependent *TimerClient::timerclient_getDependencyPtr() { + return _call(TIMERCLIENT_GETDEPPTR, (api_dependent *)NULL); +} + +inline void TimerClient::timerclient_setSkipped(int s) { + _voidcall(TIMERCLIENT_SETSKIPPED, s); +} + +inline int TimerClient::timerclient_getSkipped() { + return _call(TIMERCLIENT_GETSKIPPED, 0); +} + +inline void TimerClient::timerclient_setTimerDelay(int td) { + _voidcall(TIMERCLIENT_SETTIMERDELAY, td); +} + +inline int TimerClient::timerclient_getTimerDelay() { + return _call(TIMERCLIENT_GETTIMERDELAY, 0); +} + +inline void TimerClient::timerclient_postDeferredCallback(intptr_t param1, intptr_t param2, int mindelay) { + _voidcall(TIMERCLIENT_POSTDEFERREDCB, param1, param2, mindelay); +} + +inline int TimerClient::timerclient_onDeferredCallback(intptr_t param1, intptr_t param2) { + return _call(TIMERCLIENT_ONDEFERREDCB, 0, param1, param2); +} + +inline const wchar_t *TimerClient::timerclient_getName() { + return _call(TIMERCLIENT_GETNAME, (const wchar_t *)NULL); +} + +class NOVTABLE TimerClientI : public TimerClient { +protected: + TimerClientI(); + +public: + virtual ~TimerClientI(); + + virtual int timerclient_setTimer(intptr_t id, int ms); + virtual int timerclient_killTimer(intptr_t id); + + // override this to catch your timer events + virtual void timerclient_timerCallback(int id) { } + + virtual TimerClient *timerclient_getMasterClient() { return NULL; } + virtual void timerclient_onMasterClientMultiplex() { }; + virtual api_dependent *timerclient_getDependencyPtr()=0; + virtual void timerclient_setSkipped(int s) { skipped = s; } + virtual int timerclient_getSkipped() { return skipped; } + virtual void timerclient_setTimerDelay(int td) { timerdelay = td; } + virtual int timerclient_getTimerDelay() { return timerdelay; } + virtual void timerclient_postDeferredCallback(intptr_t param1, intptr_t param2=0, int mindelay=0); + virtual int timerclient_onDeferredCallback(intptr_t param1, intptr_t param2) { return 1; }; + virtual const wchar_t *timerclient_getName() { return NULL; } + +protected: + RECVS_DISPATCH; + +private: + virtual void timerclient_handleDeferredCallback(TimerToken token); + + int skipped; + int timerdelay; + int disallowset; + PtrList<deferred_callback> cbs; +#ifdef _WIN32 + class TokenMap + { + public: + void delItem(TimerToken) {} + bool reverseGetItem(intptr_t id, TimerToken *token) + { + *token = id; + return true; + } + bool getItem(TimerToken token, intptr_t *id) + { + *id = token; + return true; + } + void addItem(TimerToken, intptr_t) {} + }; +#else + typedef std::map<TimerToken, intptr_t> TokenMap; +#endif + TokenMap tokens; +}; + +class NOVTABLE TimerClientDI : public TimerClientI, public DependentI { +protected: + TimerClientDI() { } + +public: + api_dependent *timerclient_getDependencyPtr() { return this; } +}; + + +#endif |