diff options
| author | Pietro Gagliardi <[email protected]> | 2015-12-13 02:24:43 -0500 |
|---|---|---|
| committer | Pietro Gagliardi <[email protected]> | 2015-12-13 02:24:43 -0500 |
| commit | 4760ad7c5a4f9a6db8c7adb5af8c10a27badb199 (patch) | |
| tree | 56436a80eb0e9aa8c4151f8fa2555e3a76ea4d8c | |
| parent | 4689c6c0ab0bfe1b8e0dec7d2d2072275022b55f (diff) | |
Added OS X building. Go 1.5 required because of https://github.com/golang/go/issues/9411 which affects this. Also set up proper multithreading on OS X. Currently crashes due to similar issue I've had with libui.
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | link_darwin.go | 22 | ||||
| -rw-r--r-- | link_unix.go | 4 | ||||
| -rw-r--r-- | link_windows.go | 4 | ||||
| -rw-r--r-- | main.go | 2 |
5 files changed, 32 insertions, 2 deletions
@@ -10,7 +10,7 @@ It runs on/requires: - Mac OS X: cgo, Mac OS X 10.7 and newer - other Unixes: cgo, GTK+ 3.4 and newer -TODO figure out the minimum required version of Go +It also requires Go 1.5 or newer (due to various bugs in cgo that were fixed only starting with 1.5). (this README needs some work) diff --git a/link_darwin.go b/link_darwin.go new file mode 100644 index 0000000..c1d1a20 --- /dev/null +++ b/link_darwin.go @@ -0,0 +1,22 @@ +// 13 december 2015 + +package ui + +// #cgo LDFLAGS: -L${SRCDIR} -lui -framework CoreFoundation -lpthread +// #include <CoreFoundation/CoreFoundation.h> +// #include <pthread.h> +// extern void _CFRunLoopSetCurrent(CFRunLoopRef); +// extern pthread_t _CFMainPThread; +import "C" + +// OS X cares very deeply if we don't run on the very first thread the OS creates +// why? who knows. it's stupid and completely indefensible. let's use undocumented APIs to get around it. +// apple uses them too: http://www.opensource.apple.com/source/kext_tools/kext_tools-19.2/kextd_main.c?txt +// apple HAS SUGGESTED them too: http://lists.apple.com/archives/darwin-development/2002/Sep/msg00250.html +// gstreamer uses them too: http://cgit.freedesktop.org/gstreamer/gst-plugins-good/tree/sys/osxvideo/osxvideosink.m +func ensureMainThread() { + // TODO set to nil like the apple code? + C._CFRunLoopSetCurrent(C.CFRunLoopGetMain()) + // TODO is this part necessary? + C._CFMainPThread = C.pthread_self() +} diff --git a/link_unix.go b/link_unix.go index 597dc44..e06cb12 100644 --- a/link_unix.go +++ b/link_unix.go @@ -7,3 +7,7 @@ package ui // #cgo LDFLAGS: -L${SRCDIR} -lui -Wl,-rpath=$ORIGIN import "C" + +func ensureMainThread() { + // do nothing; GTK+ doesn't care which thread we're on so long as we don't change it after starting +} diff --git a/link_windows.go b/link_windows.go index b385907..279d3a2 100644 --- a/link_windows.go +++ b/link_windows.go @@ -4,3 +4,7 @@ package ui // #cgo LDFLAGS: -L${SRCDIR} -lui import "C" + +func ensureMainThread() { + // do nothing; Windows doesn't care which thread we're on so long as we don't change it after starting +} @@ -40,7 +40,7 @@ func Main(f func()) error { func start(errchan chan error, f func()) { runtime.LockOSThread() - // TODO set main thread on OS X + ensureMainThread() // TODO HEAP SAFETY opts := C.uiInitOptions{} |
