diff options
Diffstat (limited to 'BBB_GOFILES')
| -rw-r--r-- | BBB_GOFILES/main.go | 132 | ||||
| -rw-r--r-- | BBB_GOFILES/util.go | 45 |
2 files changed, 0 insertions, 177 deletions
diff --git a/BBB_GOFILES/main.go b/BBB_GOFILES/main.go deleted file mode 100644 index 6500345..0000000 --- a/BBB_GOFILES/main.go +++ /dev/null @@ -1,132 +0,0 @@ -// 11 december 2015 - -package ui - -import ( - "runtime" - "errors" - "sync" - "unsafe" -) - -// #include "ui.h" -// extern void doQueueMain(void *); -// extern int doOnShouldQuit(void *); -// // see golang/go#19835 -// typedef void (*queueMainCallback)(void *); -// typedef int (*onShouldQuitCallback)(void *); -import "C" - -// make sure main() runs on the first thread created by the OS -// if main() calls Main(), things will just work on macOS, where the first thread created by the OS is the only thread allowed to be the main GUI thread -// we might as well lock the OS thread for the other platforms here too (though on those it doesn't matter *which* thread we lock to) -// TODO describe the source of this trick -func init() { - runtime.LockOSThread() -} - -// Main initializes package ui, runs f to set up the program, -// and executes the GUI main loop. f should set up the program's -// initial state: open the main window, create controls, and set up -// events. It should then return, at which point Main will -// process events until Quit is called, at which point Main will return -// nil. If package ui fails to initialize, Main returns an appropriate -// error. -func Main(f func()) error { - // TODO HEAP SAFETY - opts := C.uiInitOptions{} - estr := C.uiInit(&opts) - if estr != nil { - err := errors.New(C.GoString(estr)) - C.uiFreeInitError(estr) - return err - } - C.uiOnShouldQuit(C.onShouldQuitCallback(C.doOnShouldQuit), nil) - QueueMain(f) - C.uiMain() - return nil -} - -// Quit queues a return from Main. It does not exit the program. -// It also does not immediately cause Main to return; Main will -// return when it next can. Quit must be called from the GUI thread. -func Quit() { - C.uiQuit() -} - -// These prevent the passing of Go functions into C land. -// TODO make an actual sparse list instead of this monotonic map thingy -var ( - qmmap = make(map[uintptr]func()) - qmcurrent = uintptr(0) - qmlock sync.Mutex -) - -// QueueMain queues f to be executed on the GUI thread when -// next possible. It returns immediately; that is, it does not wait -// for the function to actually be executed. QueueMain is the only -// function that can be called from other goroutines, and its -// primary purpose is to allow communication between other -// goroutines and the GUI thread. Calling QueueMain after Quit -// has been called results in undefined behavior. -// -// If you start a goroutine in f, it also cannot call package ui -// functions. So for instance, the following will result in -// undefined behavior: -// -// ui.QueueMain(func() { -// go ui.MsgBox(...) -// }) -func QueueMain(f func()) { - qmlock.Lock() - defer qmlock.Unlock() - - n := uintptr(0) - for { - n = qmcurrent - qmcurrent++ - if qmmap[n] == nil { - break - } - } - qmmap[n] = f - C.uiQueueMain(C.queueMainCallback(C.doQueueMain), unsafe.Pointer(n)) -} - -//export doQueueMain -func doQueueMain(nn unsafe.Pointer) { - qmlock.Lock() - - n := uintptr(nn) - f := qmmap[n] - delete(qmmap, n) - - // allow uiQueueMain() to be called by a queued function - // TODO explicitly allow this in libui too - qmlock.Unlock() - - f() -} - -// no need to lock this; this API is only safe on the main thread -var shouldQuitFunc func() bool - -// OnShouldQuit schedules f to be exeucted when the OS wants -// the program to quit or when a Quit menu item has been clicked. -// Only one function may be registered at a time. If the function -// returns true, Quit will be called. If the function returns false, or -// if OnShouldQuit is never called. Quit will not be called and the -// OS will be told that the program needs to continue running. -func OnShouldQuit(f func() bool) { - shouldQuitFunc = f -} - -//export doOnShouldQuit -func doOnShouldQuit(unused unsafe.Pointer) C.int { - if shouldQuitFunc == nil { - return 0 - } - return frombool(shouldQuitFunc()) -} - -// TODO Timer? diff --git a/BBB_GOFILES/util.go b/BBB_GOFILES/util.go deleted file mode 100644 index bcd4d33..0000000 --- a/BBB_GOFILES/util.go +++ /dev/null @@ -1,45 +0,0 @@ -// 12 december 2015 - -package ui - -import ( - "unsafe" -) - -// #include <stdlib.h> -// #include "util.h" -import "C" - -// We want Go itself to complain when we're out of memory. -// The allocators in cgo *should* do this, but there isn't a -// C.CMalloc(). There *is* a C.CBytes(), however, for transferring -// binary blobs from Go to C. If we pass this an arbitrary slice -// of the desired length, we get our C.CMalloc(). Using a slice -// that's always initialized to zero gives us the memset(0) -// (or ZeroMemory()) for free. -var allocBytes = make([]byte, 1024) // 1024 bytes first - -//export pkguiAlloc -func pkguiAlloc(n C.size_t) unsafe.Pointer { - if n > C.size_t(len(allocBytes)) { - // TODO round n up to a multiple of a power of 2? - // for instance 0x1234 bytes -> 0x1800 bytes - allocBytes = make([]byte, n) - } - return C.CBytes(allocBytes[:n]) -} - -func freestr(str *C.char) { - C.free(unsafe.Pointer(str)) -} - -func tobool(b C.int) bool { - return b != 0 -} - -func frombool(b bool) C.int { - if b { - return 1 - } - return 0 -} |
