From a1344512aae1ba4d7f571f04ac4dd989e29258f5 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Tue, 11 Feb 2014 18:31:24 -0500 Subject: [PATCH] Added the Windows message loop. --- uitask_windows.go | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) 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))) + } +}