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