From 2428e685048027219921651e01b1c51f7e982fe6 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Tue, 21 Jun 2022 01:26:03 +0100 Subject: [PATCH] Refactor (windows). --- date_windows.go | 17 ++++++++--------- entry_windows.go | 17 ++++++++--------- internal/win/user32.go | 4 ++++ internal/win/zsyscall_windows.go | 29 +++++++++++++++++++++++++++++ list_windows.go | 17 ++++++++--------- progress_windows.go | 17 ++++++++--------- pwd_windows.go | 17 ++++++++--------- util_windows.go | 15 +++------------ 8 files changed, 76 insertions(+), 57 deletions(-) diff --git a/date_windows.go b/date_windows.go index 92a886b..898b9f3 100644 --- a/date_windows.go +++ b/date_windows.go @@ -146,25 +146,25 @@ func (dlg *calendarDialog) layout(dpi dpi) { } } -func calendarProc(wnd uintptr, msg uint32, wparam uintptr, lparam *unsafe.Pointer) uintptr { +func calendarProc(wnd win.HWND, msg uint32, wparam uintptr, lparam *unsafe.Pointer) uintptr { var dlg *calendarDialog switch msg { case win.WM_NCCREATE: - saveBackRef(wnd, *lparam) + saveBackRef(uintptr(wnd), *lparam) dlg = (*calendarDialog)(*lparam) case win.WM_NCDESTROY: - deleteBackRef(wnd) + deleteBackRef(uintptr(wnd)) default: - dlg = (*calendarDialog)(loadBackRef(wnd)) + dlg = (*calendarDialog)(loadBackRef(uintptr(wnd))) } switch msg { case win.WM_DESTROY: - postQuitMessage.Call(0) + win.PostQuitMessage(0) case win.WM_CLOSE: dlg.err = ErrCanceled - destroyWindow.Call(wnd) + win.DestroyWindow(wnd) case win.WM_COMMAND: switch wparam { @@ -179,14 +179,13 @@ func calendarProc(wnd uintptr, msg uint32, wparam uintptr, lparam *unsafe.Pointe case win.IDNO: dlg.err = ErrExtraButton } - destroyWindow.Call(wnd) + win.DestroyWindow(wnd) case win.WM_DPICHANGED: dlg.layout(dpi(uint32(wparam) >> 16)) default: - res, _, _ := defWindowProc.Call(wnd, uintptr(msg), wparam, uintptr(unsafe.Pointer(lparam))) - return res + return win.DefWindowProc(wnd, msg, wparam, unsafe.Pointer(lparam)) } return 0 diff --git a/entry_windows.go b/entry_windows.go index 64b491d..aad8f79 100644 --- a/entry_windows.go +++ b/entry_windows.go @@ -140,25 +140,25 @@ func (dlg *entryDialog) layout(dpi dpi) { } } -func entryProc(wnd uintptr, msg uint32, wparam uintptr, lparam *unsafe.Pointer) uintptr { +func entryProc(wnd win.HWND, msg uint32, wparam uintptr, lparam *unsafe.Pointer) uintptr { var dlg *entryDialog switch msg { case win.WM_NCCREATE: - saveBackRef(wnd, *lparam) + saveBackRef(uintptr(wnd), *lparam) dlg = (*entryDialog)(*lparam) case win.WM_NCDESTROY: - deleteBackRef(wnd) + deleteBackRef(uintptr(wnd)) default: - dlg = (*entryDialog)(loadBackRef(wnd)) + dlg = (*entryDialog)(loadBackRef(uintptr(wnd))) } switch msg { case win.WM_DESTROY: - postQuitMessage.Call(0) + win.PostQuitMessage(0) case win.WM_CLOSE: dlg.err = ErrCanceled - destroyWindow.Call(wnd) + win.DestroyWindow(wnd) case win.WM_COMMAND: switch wparam { @@ -171,14 +171,13 @@ func entryProc(wnd uintptr, msg uint32, wparam uintptr, lparam *unsafe.Pointer) case win.IDNO: dlg.err = ErrExtraButton } - destroyWindow.Call(wnd) + win.DestroyWindow(wnd) case win.WM_DPICHANGED: dlg.layout(dpi(uint32(wparam) >> 16)) default: - res, _, _ := defWindowProc.Call(wnd, uintptr(msg), wparam, uintptr(unsafe.Pointer(lparam))) - return res + return win.DefWindowProc(wnd, msg, wparam, unsafe.Pointer(lparam)) } return 0 diff --git a/internal/win/user32.go b/internal/win/user32.go index 337b7c7..b2aec2f 100644 --- a/internal/win/user32.go +++ b/internal/win/user32.go @@ -174,13 +174,16 @@ type WNDCLASSEX struct { //sys CreateIconFromResource(resBits []byte, icon bool, ver uint32) (ret Handle, err error) = user32.CreateIconFromResource //sys CreateWindowEx(exStyle uint32, className *uint16, windowName *uint16, style uint32, x int, y int, width int, height int, parent HWND, menu Handle, instance Handle, param unsafe.Pointer) (ret HWND, err error) = user32.CreateWindowExW //sys DestroyIcon(icon Handle) (err error) = user32.DestroyIcon +//sys DestroyWindow(wnd HWND) (err error) = user32.DestroyWindow //sys DispatchMessage(msg *MSG) (ret uintptr) = user32.DispatchMessageW +//sys DefWindowProc(wnd HWND, msg uint32, wparam uintptr, lparam unsafe.Pointer) (ret uintptr) = user32.DefWindowProcW //sys EnableWindow(wnd HWND, enable bool) (ok bool) = user32.EnableWindow //sys EnumChildWindows(parent HWND, enumFunc uintptr, lparam unsafe.Pointer) = user32.EnumChildWindows //sys EnumWindows(enumFunc uintptr, lparam unsafe.Pointer) (err error) = user32.EnumChildWindows //sys GetDlgCtrlID(wnd HWND) (ret int) = user32.GetDlgCtrlID //sys getDpiForWindow(wnd HWND) (ret int) = user32.GetDpiForWindow //sys GetMessage(msg *MSG, wnd HWND, msgFilterMin uint32, msgFilterMax uint32) (ret uintptr) = user32.GetMessageW +//sys GetSystemMetrics(index int) (ret int) = user32.GetSystemMetrics //sys GetWindowDC(wnd HWND) (ret Handle) = user32.GetWindowDC //sys GetWindowRect(wnd HWND, cmdShow *RECT) (err error) = user32.GetWindowRect //sys GetWindowText(wnd HWND, str *uint16, maxCount int) (ret int, err error) = user32.GetWindowTextW @@ -188,6 +191,7 @@ type WNDCLASSEX struct { //sys IsDialogMessage(wnd HWND, msg *MSG) (ok bool) = user32.IsDialogMessageW //sys LoadIcon(instance Handle, resource uintptr) (ret Handle, err error) = user32.LoadIconW //sys LoadImage(instance Handle, name *uint16, typ int, cx int, cy int, load int) (ret Handle, err error) = user32.LoadImageW +//sys PostQuitMessage(exitCode int) = user32.PostQuitMessage //sys RegisterClassEx(cls *WNDCLASSEX) (err error) = user32.RegisterClassExW //sys ReleaseDC(wnd HWND, dc Handle) (ok bool) = user32.ReleaseDC //sys SendMessage(wnd HWND, msg uint32, wparam uintptr, lparam uintptr) (ret uintptr) = user32.SendMessageW diff --git a/internal/win/zsyscall_windows.go b/internal/win/zsyscall_windows.go index 3d55843..107e986 100644 --- a/internal/win/zsyscall_windows.go +++ b/internal/win/zsyscall_windows.go @@ -68,13 +68,16 @@ var ( procShell_NotifyIconW = modshell32.NewProc("Shell_NotifyIconW") procCreateIconFromResource = moduser32.NewProc("CreateIconFromResource") procCreateWindowExW = moduser32.NewProc("CreateWindowExW") + procDefWindowProcW = moduser32.NewProc("DefWindowProcW") procDestroyIcon = moduser32.NewProc("DestroyIcon") + procDestroyWindow = moduser32.NewProc("DestroyWindow") procDispatchMessageW = moduser32.NewProc("DispatchMessageW") procEnableWindow = moduser32.NewProc("EnableWindow") procEnumChildWindows = moduser32.NewProc("EnumChildWindows") procGetDlgCtrlID = moduser32.NewProc("GetDlgCtrlID") procGetDpiForWindow = moduser32.NewProc("GetDpiForWindow") procGetMessageW = moduser32.NewProc("GetMessageW") + procGetSystemMetrics = moduser32.NewProc("GetSystemMetrics") procGetWindowDC = moduser32.NewProc("GetWindowDC") procGetWindowRect = moduser32.NewProc("GetWindowRect") procGetWindowTextLengthW = moduser32.NewProc("GetWindowTextLengthW") @@ -82,6 +85,7 @@ var ( procIsDialogMessageW = moduser32.NewProc("IsDialogMessageW") procLoadIconW = moduser32.NewProc("LoadIconW") procLoadImageW = moduser32.NewProc("LoadImageW") + procPostQuitMessage = moduser32.NewProc("PostQuitMessage") procRegisterClassExW = moduser32.NewProc("RegisterClassExW") procReleaseDC = moduser32.NewProc("ReleaseDC") procSendMessageW = moduser32.NewProc("SendMessageW") @@ -253,6 +257,12 @@ func CreateWindowEx(exStyle uint32, className *uint16, windowName *uint16, style return } +func DefWindowProc(wnd HWND, msg uint32, wparam uintptr, lparam unsafe.Pointer) (ret uintptr) { + r0, _, _ := syscall.Syscall6(procDefWindowProcW.Addr(), 4, uintptr(wnd), uintptr(msg), uintptr(wparam), uintptr(lparam), 0, 0) + ret = uintptr(r0) + return +} + func DestroyIcon(icon Handle) (err error) { r1, _, e1 := syscall.Syscall(procDestroyIcon.Addr(), 1, uintptr(icon), 0, 0) if r1 == 0 { @@ -261,6 +271,14 @@ func DestroyIcon(icon Handle) (err error) { return } +func DestroyWindow(wnd HWND) (err error) { + r1, _, e1 := syscall.Syscall(procDestroyWindow.Addr(), 1, uintptr(wnd), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func DispatchMessage(msg *MSG) (ret uintptr) { r0, _, _ := syscall.Syscall(procDispatchMessageW.Addr(), 1, uintptr(unsafe.Pointer(msg)), 0, 0) ret = uintptr(r0) @@ -308,6 +326,12 @@ func GetMessage(msg *MSG, wnd HWND, msgFilterMin uint32, msgFilterMax uint32) (r return } +func GetSystemMetrics(index int) (ret int) { + r0, _, _ := syscall.Syscall(procGetSystemMetrics.Addr(), 1, uintptr(index), 0, 0) + ret = int(r0) + return +} + func GetWindowDC(wnd HWND) (ret Handle) { r0, _, _ := syscall.Syscall(procGetWindowDC.Addr(), 1, uintptr(wnd), 0, 0) ret = Handle(r0) @@ -364,6 +388,11 @@ func LoadImage(instance Handle, name *uint16, typ int, cx int, cy int, load int) return } +func PostQuitMessage(exitCode int) { + syscall.Syscall(procPostQuitMessage.Addr(), 1, uintptr(exitCode), 0, 0) + return +} + func RegisterClassEx(cls *WNDCLASSEX) (err error) { r1, _, e1 := syscall.Syscall(procRegisterClassExW.Addr(), 1, uintptr(unsafe.Pointer(cls)), 0, 0) if r1 == 0 { diff --git a/list_windows.go b/list_windows.go index e5f95aa..cb8d54c 100644 --- a/list_windows.go +++ b/list_windows.go @@ -160,25 +160,25 @@ func (dlg *listDialog) layout(dpi dpi) { } } -func listProc(wnd uintptr, msg uint32, wparam uintptr, lparam *unsafe.Pointer) uintptr { +func listProc(wnd win.HWND, msg uint32, wparam uintptr, lparam *unsafe.Pointer) uintptr { var dlg *listDialog switch msg { case win.WM_NCCREATE: - saveBackRef(wnd, *lparam) + saveBackRef(uintptr(wnd), *lparam) dlg = (*listDialog)(*lparam) case win.WM_NCDESTROY: - deleteBackRef(wnd) + deleteBackRef(uintptr(wnd)) default: - dlg = (*listDialog)(loadBackRef(wnd)) + dlg = (*listDialog)(loadBackRef(uintptr(wnd))) } switch msg { case win.WM_DESTROY: - postQuitMessage.Call(0) + win.PostQuitMessage(0) case win.WM_CLOSE: dlg.err = ErrCanceled - destroyWindow.Call(wnd) + win.DestroyWindow(wnd) case win.WM_COMMAND: switch wparam { @@ -208,14 +208,13 @@ func listProc(wnd uintptr, msg uint32, wparam uintptr, lparam *unsafe.Pointer) u case win.IDNO: dlg.err = ErrExtraButton } - destroyWindow.Call(wnd) + win.DestroyWindow(wnd) case win.WM_DPICHANGED: dlg.layout(dpi(uint32(wparam) >> 16)) default: - res, _, _ := defWindowProc.Call(wnd, uintptr(msg), wparam, uintptr(unsafe.Pointer(lparam))) - return res + return win.DefWindowProc(wnd, msg, wparam, unsafe.Pointer(lparam)) } return 0 diff --git a/progress_windows.go b/progress_windows.go index a58f62f..b4b9efe 100644 --- a/progress_windows.go +++ b/progress_windows.go @@ -234,25 +234,25 @@ func (d *progressDialog) layout(dpi dpi) { } } -func progressProc(wnd uintptr, msg uint32, wparam uintptr, lparam *unsafe.Pointer) uintptr { +func progressProc(wnd win.HWND, msg uint32, wparam uintptr, lparam *unsafe.Pointer) uintptr { var dlg *progressDialog switch msg { case win.WM_NCCREATE: - saveBackRef(wnd, *lparam) + saveBackRef(uintptr(wnd), *lparam) dlg = (*progressDialog)(*lparam) case win.WM_NCDESTROY: - deleteBackRef(wnd) + deleteBackRef(uintptr(wnd)) default: - dlg = (*progressDialog)(loadBackRef(wnd)) + dlg = (*progressDialog)(loadBackRef(uintptr(wnd))) } switch msg { case win.WM_DESTROY: - postQuitMessage.Call(0) + win.PostQuitMessage(0) case win.WM_CLOSE: dlg.err = ErrCanceled - destroyWindow.Call(wnd) + win.DestroyWindow(wnd) case win.WM_COMMAND: switch wparam { @@ -265,14 +265,13 @@ func progressProc(wnd uintptr, msg uint32, wparam uintptr, lparam *unsafe.Pointe case win.IDNO: dlg.err = ErrExtraButton } - destroyWindow.Call(wnd) + win.DestroyWindow(wnd) case win.WM_DPICHANGED: dlg.layout(dpi(uint32(wparam) >> 16)) default: - res, _, _ := defWindowProc.Call(wnd, uintptr(msg), wparam, uintptr(unsafe.Pointer(lparam))) - return res + return win.DefWindowProc(wnd, msg, wparam, unsafe.Pointer(lparam)) } return 0 diff --git a/pwd_windows.go b/pwd_windows.go index 1da90be..84d71f4 100644 --- a/pwd_windows.go +++ b/pwd_windows.go @@ -161,25 +161,25 @@ func (dlg *passwordDialog) layout(dpi dpi) { } } -func passwordProc(wnd uintptr, msg uint32, wparam uintptr, lparam *unsafe.Pointer) uintptr { +func passwordProc(wnd win.HWND, msg uint32, wparam uintptr, lparam *unsafe.Pointer) uintptr { var dlg *passwordDialog switch msg { case win.WM_NCCREATE: - saveBackRef(wnd, *lparam) + saveBackRef(uintptr(wnd), *lparam) dlg = (*passwordDialog)(*lparam) case win.WM_NCDESTROY: - deleteBackRef(wnd) + deleteBackRef(uintptr(wnd)) default: - dlg = (*passwordDialog)(loadBackRef(wnd)) + dlg = (*passwordDialog)(loadBackRef(uintptr(wnd))) } switch msg { case win.WM_DESTROY: - postQuitMessage.Call(0) + win.PostQuitMessage(0) case win.WM_CLOSE: dlg.err = ErrCanceled - destroyWindow.Call(wnd) + win.DestroyWindow(wnd) case win.WM_COMMAND: switch wparam { @@ -193,14 +193,13 @@ func passwordProc(wnd uintptr, msg uint32, wparam uintptr, lparam *unsafe.Pointe case win.IDNO: dlg.err = ErrExtraButton } - destroyWindow.Call(wnd) + win.DestroyWindow(wnd) case win.WM_DPICHANGED: dlg.layout(dpi(uint32(wparam) >> 16)) default: - res, _, _ := defWindowProc.Call(wnd, uintptr(msg), wparam, uintptr(unsafe.Pointer(lparam))) - return res + return win.DefWindowProc(wnd, msg, wparam, unsafe.Pointer(lparam)) } return 0 diff --git a/util_windows.go b/util_windows.go index 28cbe0f..a7be33a 100644 --- a/util_windows.go +++ b/util_windows.go @@ -20,10 +20,6 @@ var ( user32 = windows.NewLazySystemDLL("user32.dll") callNextHookEx = user32.NewProc("CallNextHookEx") - defWindowProc = user32.NewProc("DefWindowProcW") - destroyWindow = user32.NewProc("DestroyWindow") - getSystemMetrics = user32.NewProc("GetSystemMetrics") - postQuitMessage = user32.NewProc("PostQuitMessage") setWindowsHookEx = user32.NewProc("SetWindowsHookExW") systemParametersInfo = user32.NewProc("SystemParametersInfoW") unhookWindowsHookEx = user32.NewProc("UnhookWindowsHookEx") @@ -312,16 +308,11 @@ func (i *icon) delete() { } func centerWindow(wnd win.HWND) { - getMetric := func(i uintptr) int32 { - n, _, _ := getSystemMetrics.Call(i) - return int32(n) - } - var rect win.RECT win.GetWindowRect(wnd, &rect) - x := (getMetric(0 /* SM_CXSCREEN */) - (rect.Right - rect.Left)) / 2 - y := (getMetric(1 /* SM_CYSCREEN */) - (rect.Bottom - rect.Top)) / 2 - win.SetWindowPos(wnd, 0, int(x), int(y), 0, 0, 0x5) // SWP_NOZORDER|SWP_NOSIZE + x := (win.GetSystemMetrics(0 /* SM_CXSCREEN */) - int(rect.Right-rect.Left)) / 2 + y := (win.GetSystemMetrics(1 /* SM_CYSCREEN */) - int(rect.Bottom-rect.Top)) / 2 + win.SetWindowPos(wnd, 0, x, y, 0, 0, 0x5) // SWP_NOZORDER|SWP_NOSIZE } func getWindowString(wnd win.HWND) string {