Implement uiTimer() for GTK+ and OS X

This commit is contained in:
cody271 2017-08-19 15:41:04 -07:00
parent 27b8ce1db3
commit 5dbe20593d
2 changed files with 59 additions and 0 deletions

View File

@ -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];
}

View File

@ -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);
}