summaryrefslogtreecommitdiff
path: root/redo/uitask_windows.go
diff options
context:
space:
mode:
Diffstat (limited to 'redo/uitask_windows.go')
-rw-r--r--redo/uitask_windows.go77
1 files changed, 14 insertions, 63 deletions
diff --git a/redo/uitask_windows.go b/redo/uitask_windows.go
index 15f4048..69d6906 100644
--- a/redo/uitask_windows.go
+++ b/redo/uitask_windows.go
@@ -8,13 +8,11 @@ import (
"unsafe"
)
-// global messages unique to everything
-const (
- msgRequest = c_WM_APP + 1 + iota // + 1 just to be safe
- msgCOMMAND // WM_COMMAND proxy; see forwardCommand() in controls_windows.go
-)
+// #cgo LDFLAGS: -luser32 -lkernel32 -lgdi32
+// #include "winapi_windows.h"
+import "C"
-var msgwin uintptr
+var msgwin C.HWND
func uiinit() error {
if err := initWindows(); err != nil {
@@ -33,20 +31,7 @@ func uiinit() error {
}
func uimsgloop() {
- var msg s_MSG
-
- for {
- res, err := f_GetMessageW(&msg, hNULL, 0, 0)
- if res < 0 {
- panic(fmt.Errorf("error calling GetMessage(): %v", err))
- }
- if res == 0 { // WM_QUIT
- break
- }
- // TODO IsDialogMessage()
- f_TranslateMessage(&msg)
- f_DispatchMessageW(&msg)
- }
+ C.uimsgloop()
}
func uistop() {
@@ -54,55 +39,21 @@ func uistop() {
}
func issue(req *Request) {
- res, err := f_PostMessageW(
- msgwin,
- msgRequest,
- 0,
- t_LPARAM(uintptr(unsafe.Pointer(req))))
- if res == 0 {
- panic(fmt.Errorf("error issuing request: %v", err))
- }
+ C.issue(unsafe.Pointer(req))
}
-const msgwinclass = "gouimsgwin"
-
func makemsgwin() error {
- var wc s_WNDCLASSW
+ var errmsg *C.char
- wc.lpfnWndProc = syscall.NewCallback(msgwinproc)
- wc.hInstance = hInstance
- wc.hIcon = hDefaultIcon
- wc.hCursor = hArrowCursor
- wc.hbrBackground = c_COLOR_BTNFACE + 1
- wc.lpszClassName = syscall.StringToUTF16Ptr(msgwinclass)
- res, err := f_RegisterClassW(&wc)
- if res == 0 {
- return fmt.Errorf("error registering message-only window class: %v", err)
- }
- msgwin, err = f_CreateWindowExW(
- 0,
- wc.lpszClassName,
- syscall.StringToUTF16Ptr("package ui message-only window"),
- 0,
- c_CW_USEDEFAULT, c_CW_USEDEFAULT,
- c_CW_USEDEFAULT, c_CW_USEDEFAULT,
- c_HWND_MESSAGE, hNULL, hInstance, nil)
- if msgwin == hNULL {
- return fmt.Errorf("error creating message-only window: %v", err)
+ err := C.makemsgwin(&errmsg)
+ if err != 0 || errmsg != nil {
+ return fmt.Errorf("%s: %v", C.GoString(errmsg), syscall.Errno(err))
}
return nil
}
-func msgwinproc(hwnd uintptr, uMsg t_UINT, wParam t_WPARAM, lParam t_LPARAM) t_LRESULT {
- switch uMsg {
- case c_WM_COMMAND:
- return forwardCommand(hwnd, uMsg, wParam, lParam)
- case msgRequest:
- req := (*Request)(unsafe.Pointer(uintptr(lParam)))
- perform(req)
- return 0
- default:
- return f_DefWindowProcW(hwnd, uMsg, wParam, lParam)
- }
- panic(fmt.Errorf("message-only window procedure does not return a value for message %d (bug in msgwinproc())", uMsg))
+//export xperform
+func xperform(xreq unsafe.Pointer) {
+ req := (*Request)(xreq)
+ perform(req)
}