summaryrefslogtreecommitdiff
path: root/uitask_windows.go
diff options
context:
space:
mode:
Diffstat (limited to 'uitask_windows.go')
-rw-r--r--uitask_windows.go49
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