diff --git a/darwin/main.m b/darwin/main.m index 0bdb2965..2aef0af0 100644 --- a/darwin/main.m +++ b/darwin/main.m @@ -244,6 +244,42 @@ void uiQueueMain(void (*f)(void *data), void *data) dispatch_async_f(dispatch_get_main_queue(), data, f); } +@interface TimerDelegate : NSObject { + int (*f)(void *data); + void *data; +} +- (id)initWithCallback:(int (*)(void *))callback data:(void*)callbackData; +- (void)doTimer:(NSTimer *)timer; +@end + +@implementation TimerDelegate + +- (id)initWithCallback:(int (*)(void *))callback data:(void*)callbackData +{ + self = [super init]; + if (self) { + f = callback; + data = callbackData; + } + return self; +} + +- (void)doTimer:(NSTimer *)timer +{ + if (!f(data)) + [timer invalidate]; +} + +@end + void uiTimer(int milliseconds, int (*f)(void *data), void *data) { + TimerDelegate *delegate; + + delegate = [[TimerDelegate alloc] initWithCallback:f data:data]; + [NSTimer scheduledTimerWithTimeInterval:milliseconds / 1000.0 + target:delegate + selector:@selector(doTimer:) + userInfo:nil + repeats:YES]; } diff --git a/unix/main.c b/unix/main.c index 1047f5c5..ec3182db 100644 --- a/unix/main.c +++ b/unix/main.c @@ -107,6 +107,29 @@ void uiQueueMain(void (*f)(void *data), void *data) gdk_threads_add_idle(doqueued, q); } +struct timer { + int (*f)(void *); + void *data; +}; + +static gboolean dotimer(gpointer data) +{ + struct timer *t = (struct timer *) data; + + if((*(t->f))(t->data)) + return TRUE; + else { + g_free(t); + return FALSE; + } +} + void uiTimer(int milliseconds, int (*f)(void *data), void *data) { + struct timer *t; + + t = g_new0(struct timer, 1); + t->f = f; + t->data = data; + g_timeout_add(milliseconds, dotimer, t); }