Implement uiTimer() for GTK+ and OS X
This commit is contained in:
parent
27b8ce1db3
commit
5dbe20593d
|
@ -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];
|
||||
}
|
||||
|
|
23
unix/main.c
23
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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue