5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-02 20:03:01 +08:00
wails/v2/internal/frontend/desktop/windows/winc/wndproc.go
Misite Bao f70d9de366
fix: fix go test errors (#2169)
* fix: fix go test errors

* Add flags to mac test

* Run on all branches

* Update PR workflow

Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
2022-12-06 06:45:06 +11:00

155 lines
4.5 KiB
Go

//go:build windows
/*
* Copyright (C) 2019 The Winc Authors. All Rights Reserved.
* Copyright (C) 2010-2013 Allen Dang. All Rights Reserved.
*/
package winc
import (
"unsafe"
"github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/winc/w32"
)
var wmInvokeCallback uint32
func init() {
wmInvokeCallback = RegisterWindowMessage("WincV0.InvokeCallback")
}
func genPoint(p uintptr) (x, y int) {
x = int(w32.LOWORD(uint32(p)))
y = int(w32.HIWORD(uint32(p)))
return
}
func genMouseEventArg(wparam, lparam uintptr) *MouseEventData {
var data MouseEventData
data.Button = int(wparam)
data.X, data.Y = genPoint(lparam)
return &data
}
func genDropFilesEventArg(wparam uintptr) *DropFilesEventData {
hDrop := w32.HDROP(wparam)
var data DropFilesEventData
_, fileCount := w32.DragQueryFile(hDrop, 0xFFFFFFFF)
data.Files = make([]string, fileCount)
var i uint
for i = 0; i < fileCount; i++ {
data.Files[i], _ = w32.DragQueryFile(hDrop, i)
}
data.X, data.Y, _ = w32.DragQueryPoint(hDrop)
w32.DragFinish(hDrop)
return &data
}
func generalWndProc(hwnd w32.HWND, msg uint32, wparam, lparam uintptr) uintptr {
switch msg {
case w32.WM_HSCROLL:
//println("case w32.WM_HSCROLL")
case w32.WM_VSCROLL:
//println("case w32.WM_VSCROLL")
}
if controller := GetMsgHandler(hwnd); controller != nil {
ret := controller.WndProc(msg, wparam, lparam)
switch msg {
case w32.WM_NOTIFY: //Reflect notification to control
nm := (*w32.NMHDR)(unsafe.Pointer(lparam))
if controller := GetMsgHandler(nm.HwndFrom); controller != nil {
ret := controller.WndProc(msg, wparam, lparam)
if ret != 0 {
w32.SetWindowLong(hwnd, w32.DWL_MSGRESULT, uint32(ret))
return w32.TRUE
}
}
case w32.WM_COMMAND:
if lparam != 0 { //Reflect message to control
h := w32.HWND(lparam)
if controller := GetMsgHandler(h); controller != nil {
ret := controller.WndProc(msg, wparam, lparam)
if ret != 0 {
w32.SetWindowLong(hwnd, w32.DWL_MSGRESULT, uint32(ret))
return w32.TRUE
}
}
}
case w32.WM_CLOSE:
controller.OnClose().Fire(NewEvent(controller, nil))
case w32.WM_KILLFOCUS:
controller.OnKillFocus().Fire(NewEvent(controller, nil))
case w32.WM_SETFOCUS:
controller.OnSetFocus().Fire(NewEvent(controller, nil))
case w32.WM_DROPFILES:
controller.OnDropFiles().Fire(NewEvent(controller, genDropFilesEventArg(wparam)))
case w32.WM_CONTEXTMENU:
if wparam != 0 { //Reflect message to control
h := w32.HWND(wparam)
if controller := GetMsgHandler(h); controller != nil {
contextMenu := controller.ContextMenu()
x, y := genPoint(lparam)
if contextMenu != nil {
id := w32.TrackPopupMenuEx(
contextMenu.hMenu,
w32.TPM_NOANIMATION|w32.TPM_RETURNCMD,
int32(x),
int32(y),
controller.Handle(),
nil)
item := findMenuItemByID(int(id))
if item != nil {
item.OnClick().Fire(NewEvent(controller, genMouseEventArg(wparam, lparam)))
}
return 0
}
}
}
case w32.WM_LBUTTONDOWN:
controller.OnLBDown().Fire(NewEvent(controller, genMouseEventArg(wparam, lparam)))
case w32.WM_LBUTTONUP:
controller.OnLBUp().Fire(NewEvent(controller, genMouseEventArg(wparam, lparam)))
case w32.WM_LBUTTONDBLCLK:
controller.OnLBDbl().Fire(NewEvent(controller, genMouseEventArg(wparam, lparam)))
case w32.WM_MBUTTONDOWN:
controller.OnMBDown().Fire(NewEvent(controller, genMouseEventArg(wparam, lparam)))
case w32.WM_MBUTTONUP:
controller.OnMBUp().Fire(NewEvent(controller, genMouseEventArg(wparam, lparam)))
case w32.WM_RBUTTONDOWN:
controller.OnRBDown().Fire(NewEvent(controller, genMouseEventArg(wparam, lparam)))
case w32.WM_RBUTTONUP:
controller.OnRBUp().Fire(NewEvent(controller, genMouseEventArg(wparam, lparam)))
case w32.WM_RBUTTONDBLCLK:
controller.OnRBDbl().Fire(NewEvent(controller, genMouseEventArg(wparam, lparam)))
case w32.WM_MOUSEMOVE:
controller.OnMouseMove().Fire(NewEvent(controller, genMouseEventArg(wparam, lparam)))
case w32.WM_PAINT:
canvas := NewCanvasFromHwnd(hwnd)
defer canvas.Dispose()
controller.OnPaint().Fire(NewEvent(controller, &PaintEventData{Canvas: canvas}))
case w32.WM_KEYUP:
controller.OnKeyUp().Fire(NewEvent(controller, &KeyUpEventData{int(wparam), int(lparam)}))
case w32.WM_SIZE:
x, y := genPoint(lparam)
controller.OnSize().Fire(NewEvent(controller, &SizeEventData{uint(wparam), x, y}))
case wmInvokeCallback:
controller.invokeCallbacks()
}
return ret
}
return w32.DefWindowProc(hwnd, uint32(msg), wparam, lparam)
}