diff options
Diffstat (limited to 'uitask_windows.go')
| -rw-r--r-- | uitask_windows.go | 49 |
1 files changed, 37 insertions, 12 deletions
diff --git a/uitask_windows.go b/uitask_windows.go index 772403f..1075b5b 100644 --- a/uitask_windows.go +++ b/uitask_windows.go @@ -22,15 +22,17 @@ the only recourse, and the one both Microsoft (http://support.microsoft.com/kb/1 yay. */ -var uimsgwin _HWND +var uitask chan interface{} -// works from any thread; waits for the function to finish before returning -func uitask(f func()) { - _sendMessage.Call( - uintptr(uimsgwin), - msgRequested, - uintptr(0), - uintptr(unsafe.Pointer(&f))) +type uimsg struct { + call *syscall.LazyProc + p []uintptr + ret chan uiret +} + +type uiret struct { + ret uintptr + err error } const ( @@ -47,20 +49,34 @@ var ( func ui(main func()) error { runtime.LockOSThread() + uitask = make(chan interface{}) err := doWindowsInit() if err != nil { return fmt.Errorf("error doing general Windows initialization: %v", err) } - uimsgwin, err = makeMessageHandler() + hwnd, err := makeMessageHandler() if err != nil { return fmt.Errorf("error making invisible window for handling events: %v", err) } go func() { + for m := range uitask { + r1, _, err := _postMessage.Call( + uintptr(hwnd), + msgRequested, + uintptr(0), + uintptr(unsafe.Pointer(&m))) + if r1 == 0 { // failure + panic("error sending message to message loop to call function: " + err.Error()) + } + } + }() + + go func() { main() r1, _, err := _postMessage.Call( - uintptr(uimsgwin), + uintptr(hwnd), msgQuit, uintptr(0), uintptr(0)) @@ -162,8 +178,17 @@ func makeMessageHandler() (hwnd _HWND, err error) { func messageHandlerWndProc(hwnd _HWND, uMsg uint32, wParam _WPARAM, lParam _LPARAM) _LRESULT { switch uMsg { case msgRequested: - f := (*func())(unsafe.Pointer(lParam)) - (*f)() + mt := (*interface{})(unsafe.Pointer(lParam)) + switch m := (*mt).(type) { + case *uimsg: + r1, _, err := m.call.Call(m.p...) + m.ret <- uiret{ + ret: r1, + err: err, + } + case func(): + m() + } return 0 case msgQuit: // does not return a value according to MSDN |
