Fixed the PeekMessage() call as per http://blogs.msdn.com/b/oldnewthing/archive/2006/02/10/529525.aspx
This commit is contained in:
parent
08ba4a1074
commit
6da43e8bb7
|
@ -3,7 +3,6 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"syscall"
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
@ -28,19 +27,8 @@ func ui(initDone chan error) {
|
||||||
uitask = make(chan *uimsg)
|
uitask = make(chan *uimsg)
|
||||||
initDone <- doWindowsInit()
|
initDone <- doWindowsInit()
|
||||||
|
|
||||||
// go msgloop()
|
quit := false
|
||||||
var msg struct {
|
for !quit {
|
||||||
Hwnd _HWND
|
|
||||||
Message uint32
|
|
||||||
WParam _WPARAM
|
|
||||||
LParam _LPARAM
|
|
||||||
Time uint32
|
|
||||||
Pt _POINT
|
|
||||||
}
|
|
||||||
var _peekMessage = user32.NewProc("PeekMessageW")
|
|
||||||
const _PM_REMOVE = 0x0001
|
|
||||||
|
|
||||||
for {
|
|
||||||
select {
|
select {
|
||||||
case m := <-uitask:
|
case m := <-uitask:
|
||||||
r1, _, err := m.call.Call(m.p...)
|
r1, _, err := m.call.Call(m.p...)
|
||||||
|
@ -49,20 +37,19 @@ func ui(initDone chan error) {
|
||||||
err: err,
|
err: err,
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
// TODO figure out how to handle errors
|
quit = msgloopstep()
|
||||||
_peekMessage.Call(
|
|
||||||
uintptr(unsafe.Pointer(&msg)),
|
|
||||||
uintptr(_NULL),
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
uintptr(_PM_REMOVE))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
_PM_REMOVE = 0x0001
|
||||||
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
_dispatchMessage = user32.NewProc("DispatchMessageW")
|
_dispatchMessage = user32.NewProc("DispatchMessageW")
|
||||||
_getMessage = user32.NewProc("GetMessageW")
|
_getMessage = user32.NewProc("GetMessageW")
|
||||||
|
_peekMessage = user32.NewProc("PeekMessageW")
|
||||||
_postQuitMessage = user32.NewProc("PostQuitMessage")
|
_postQuitMessage = user32.NewProc("PostQuitMessage")
|
||||||
_sendMessage = user32.NewProc("SendMessageW")
|
_sendMessage = user32.NewProc("SendMessageW")
|
||||||
_translateMessage = user32.NewProc("TranslateMessage")
|
_translateMessage = user32.NewProc("TranslateMessage")
|
||||||
|
@ -70,9 +57,7 @@ var (
|
||||||
|
|
||||||
var getMessageFail = -1 // because Go doesn't let me
|
var getMessageFail = -1 // because Go doesn't let me
|
||||||
|
|
||||||
func msgloop() {
|
func msgloopstep() (quit bool) {
|
||||||
runtime.LockOSThread()
|
|
||||||
|
|
||||||
var msg struct {
|
var msg struct {
|
||||||
Hwnd _HWND
|
Hwnd _HWND
|
||||||
Message uint32
|
Message uint32
|
||||||
|
@ -82,19 +67,21 @@ func msgloop() {
|
||||||
Pt _POINT
|
Pt _POINT
|
||||||
}
|
}
|
||||||
|
|
||||||
for {
|
// TODO figure out how to handle errors
|
||||||
r1, _, err := _getMessage.Call(
|
r1, _, _ := _peekMessage.Call(
|
||||||
uintptr(unsafe.Pointer(&msg)),
|
uintptr(unsafe.Pointer(&msg)),
|
||||||
uintptr(_NULL),
|
uintptr(_NULL),
|
||||||
uintptr(0),
|
uintptr(0),
|
||||||
uintptr(0))
|
uintptr(0),
|
||||||
if r1 == uintptr(getMessageFail) { // failure
|
uintptr(_PM_REMOVE))
|
||||||
panic(fmt.Sprintf("GetMessage failed: %v", err))
|
if r1 == 0 { // no message available
|
||||||
} else if r1 == 0 { // quit
|
return false
|
||||||
break
|
|
||||||
}
|
|
||||||
// TODO handle potential errors in TranslateMessage() and DispatchMessage()
|
|
||||||
_translateMessage.Call(uintptr(unsafe.Pointer(&msg)))
|
|
||||||
_dispatchMessage.Call(uintptr(unsafe.Pointer(&msg)))
|
|
||||||
}
|
}
|
||||||
|
if msg.Message == _WM_QUIT {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
// TODO handle potential errors in TranslateMessage() and DispatchMessage()
|
||||||
|
_translateMessage.Call(uintptr(unsafe.Pointer(&msg)))
|
||||||
|
_dispatchMessage.Call(uintptr(unsafe.Pointer(&msg)))
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue