summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--link_darwin.go22
-rw-r--r--link_unix.go4
-rw-r--r--link_windows.go4
-rw-r--r--main.go2
5 files changed, 32 insertions, 2 deletions
diff --git a/README.md b/README.md
index 186107d..8b028e3 100644
--- a/README.md
+++ b/README.md
@@ -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
+}
diff --git a/main.go b/main.go
index c7cb51a..5f8f624 100644
--- a/main.go
+++ b/main.go
@@ -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{}