diff --git a/application.go b/application.go index 6e503d2..2aa03a9 100644 --- a/application.go +++ b/application.go @@ -4,6 +4,7 @@ package gocoa // #cgo LDFLAGS: -framework Cocoa // #include "application.h" import "C" +import "runtime/cgo" var appDidFinishLaunchingFunc func() @@ -34,3 +35,16 @@ func callOnApplicationDidFinishLaunchingHandler() { appDidFinishLaunchingFunc() } } + +//export go_callback +func go_callback(h C.uintptr_t) { + hnd := cgo.Handle(h) + fn := hnd.Value().(func()) + fn() + hnd.Delete() +} + +func RunOnMainLoop(fn func()) { + h := cgo.NewHandle(fn) + C.RunOnMainLoop(C.uintptr_t(h)) +} diff --git a/application.h b/application.h index 01dbfd1..876e7fb 100644 --- a/application.h +++ b/application.h @@ -1,5 +1,7 @@ +#include #import void InitSharedApplication(); void RunApplication(); -void TerminateApplication(); \ No newline at end of file +void TerminateApplication(); +void RunOnMainLoop(uintptr_t h); \ No newline at end of file diff --git a/application.m b/application.m index 7e05f56..572b03b 100644 --- a/application.m +++ b/application.m @@ -31,4 +31,11 @@ void RunApplication() { void TerminateApplication() { [NSApp terminate:nil]; +} + +extern void go_callback(uintptr_t h); +void RunOnMainLoop(uintptr_t h) { + dispatch_async(dispatch_get_main_queue(), ^{ + go_callback(h); + }); } \ No newline at end of file