diff options
| author | Pietro Gagliardi <[email protected]> | 2015-12-11 21:03:38 -0500 |
|---|---|---|
| committer | Pietro Gagliardi <[email protected]> | 2015-12-11 21:03:38 -0500 |
| commit | eef149060f7306c7eccc8855dceee68ccd45026e (patch) | |
| tree | 08d9f7306813142028e8af65c5f4cfce2424d04e /main.go | |
| parent | f8e3f12ab02b528f2a05a4f713d7af7ea8e44b42 (diff) | |
Started the work I guess.
Diffstat (limited to 'main.go')
| -rw-r--r-- | main.go | 60 |
1 files changed, 60 insertions, 0 deletions
@@ -0,0 +1,60 @@ +// 11 december 2015 + +package ui + +import ( + "errors" +) + +// #include "interop.h" +import "C" + +// 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 { + errchan := make(chan error) + go start(errchan, f) + return <-errchan +} + +func start(errchan chan error, f func()) { + estr := C.interopInit() + if estr != "" { + errchan <- errors.New(C.GoString(estr)) + C.interopFreeStr(estr) + return + } + QueueMain(f) + C.interopRun() + errchan <- nil +} + +// Quit queues an exit from the GUI thread. It does not exit the +// program. Quit must be called from the GUI thread. +func Quit() { + C.interopQuit() +} + +// 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. +func QueueMain(f func()) { + n := interoperAdd(f) + C.interopQueueMain(n) +} + +//export interopDoQueued +func interopDoQueued(n C.uintptr_t) { + ff := interoperTake(n) + f := ff.(func()) + f() +} |
