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