diff options
Diffstat (limited to 'uitask_windows.go')
| -rw-r--r-- | uitask_windows.go | 53 |
1 files changed, 28 insertions, 25 deletions
diff --git a/uitask_windows.go b/uitask_windows.go index 1075b5b..ef1c213 100644 --- a/uitask_windows.go +++ b/uitask_windows.go @@ -4,7 +4,6 @@ package ui import ( "fmt" - "runtime" "syscall" "unsafe" ) @@ -46,47 +45,51 @@ var ( _postMessage = user32.NewProc("PostMessageW") ) -func ui(main func()) error { - runtime.LockOSThread() +var msghwnd _HWND - uitask = make(chan interface{}) +func uiinit() error { err := doWindowsInit() if err != nil { return fmt.Errorf("error doing general Windows initialization: %v", err) } - hwnd, err := makeMessageHandler() + msghwnd, err = makeMessageHandler() if err != nil { return fmt.Errorf("error making invisible window for handling events: %v", err) } + // do this only on success just to be safe + uitask = make(chan interface{}) + return nil +} + +func ui() { go func() { - for m := range uitask { - r1, _, err := _postMessage.Call( - uintptr(hwnd), - msgRequested, - uintptr(0), + for { + select { + case m := <-uitask: + r1, _, err := _postMessage.Call( + uintptr(msghwnd), + msgRequested, + uintptr(0), uintptr(unsafe.Pointer(&m))) - if r1 == 0 { // failure - panic("error sending message to message loop to call function: " + err.Error()) + if r1 == 0 { // failure + panic("error sending message to message loop to call function: " + err.Error()) + } + case <-Stop: + r1, _, err := _postMessage.Call( + uintptr(msghwnd), + msgQuit, + uintptr(0), + uintptr(0)) + if r1 == 0 { // failure + panic("error sending quit message to message loop: " + err.Error()) + } } } }() - go func() { - main() - r1, _, err := _postMessage.Call( - uintptr(hwnd), - msgQuit, - uintptr(0), - uintptr(0)) - if r1 == 0 { // failure - panic("error sending quit message to message loop: " + err.Error()) - } - }() - msgloop() - return nil } var ( |
