diff options
Diffstat (limited to 'redo/uitask_windows.go')
| -rw-r--r-- | redo/uitask_windows.go | 77 |
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) } |
