aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/timer/timerclient.h
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Wasabi/api/timer/timerclient.h')
-rw-r--r--Src/Wasabi/api/timer/timerclient.h183
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