mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-02 20:03:01 +08:00

* 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>
155 lines
4.5 KiB
Go
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)
|
|
}
|