summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPietro Gagliardi <[email protected]>2014-02-11 18:31:24 -0500
committerPietro Gagliardi <[email protected]>2014-02-11 18:31:24 -0500
commita1344512aae1ba4d7f571f04ac4dd989e29258f5 (patch)
tree3c9b3ddff8c5342013b6f77b2becbb9988cfd43f
parentb918496ae453d5e4e703f02d4a70474b9a84d67a (diff)
Added the Windows message loop.
-rw-r--r--uitask_windows.go38
1 files changed, 38 insertions, 0 deletions
diff --git a/uitask_windows.go b/uitask_windows.go
index 8fe705c..df04d2e 100644
--- a/uitask_windows.go
+++ b/uitask_windows.go
@@ -3,6 +3,7 @@
package main
import (
+ "fmt"
"syscall"
"unsafe"
"runtime"
@@ -27,6 +28,8 @@ func ui(initDone chan error) {
uitask = make(chan *uimsg)
initDone <- doWindowsInit()
+ go msgloop()
+
for m := range uitask {
r1, _, err := m.msg.Call(m.p...)
m.ret <- uiret{
@@ -35,3 +38,38 @@ func ui(initDone chan error) {
}
}
}
+
+var (
+ _dispatchMessage = user32.NewProc("DispatchMessageW")
+ _getMessage = user32.NewProc("GetMessageW")
+ _postQuitMessage = user32.NewProc("PostQuitMessage")
+ _sendMessage = user32.NewProc("SendMessageW")
+ _translateMessage = user32.NewProc("TranslateMessage")
+)
+
+func msgloop() {
+ var msg struct {
+ Hwnd _HWND
+ Message uint32
+ WParam _WPARAM
+ LParam _LPARAM
+ Time uint32
+ Pt _POINT
+ }
+
+ for {
+ r1, _, err := getMessage.Call(
+ uintptr(unsafe.Pointer(&msg)),
+ uintptr(_NULL),
+ uintptr(0),
+ uintptr(0))
+ if r1 == uintptr(getMessageFail) { // failure
+ panic(fmt.Sprintf("GetMessage failed: %v", err))
+ } else if r1 == 0 { // quit
+ break
+ }
+ // TODO handle potential errors in TranslateMessage() and DispatchMessage()
+ _translateMessage.Call(uintptr(unsafe.Pointer(&msg)))
+ _dispatchMessage.Call(uintptr(unsafe.Pointer(&msg)))
+ }
+}