github.com/secoba/wails/v2@v2.6.4/internal/frontend/desktop/windows/winc/wndproc.go (about) 1 //go:build windows 2 3 /* 4 * Copyright (C) 2019 The Winc Authors. All Rights Reserved. 5 * Copyright (C) 2010-2013 Allen Dang. All Rights Reserved. 6 */ 7 8 package winc 9 10 import ( 11 "unsafe" 12 13 "github.com/secoba/wails/v2/internal/frontend/desktop/windows/winc/w32" 14 ) 15 16 var wmInvokeCallback uint32 17 18 func init() { 19 wmInvokeCallback = RegisterWindowMessage("WincV0.InvokeCallback") 20 } 21 22 func genPoint(p uintptr) (x, y int) { 23 x = int(w32.LOWORD(uint32(p))) 24 y = int(w32.HIWORD(uint32(p))) 25 return 26 } 27 28 func genMouseEventArg(wparam, lparam uintptr) *MouseEventData { 29 var data MouseEventData 30 data.Button = int(wparam) 31 data.X, data.Y = genPoint(lparam) 32 33 return &data 34 } 35 36 func genDropFilesEventArg(wparam uintptr) *DropFilesEventData { 37 hDrop := w32.HDROP(wparam) 38 39 var data DropFilesEventData 40 _, fileCount := w32.DragQueryFile(hDrop, 0xFFFFFFFF) 41 data.Files = make([]string, fileCount) 42 43 var i uint 44 for i = 0; i < fileCount; i++ { 45 data.Files[i], _ = w32.DragQueryFile(hDrop, i) 46 } 47 48 data.X, data.Y, _ = w32.DragQueryPoint(hDrop) 49 w32.DragFinish(hDrop) 50 return &data 51 } 52 53 func generalWndProc(hwnd w32.HWND, msg uint32, wparam, lparam uintptr) uintptr { 54 55 switch msg { 56 case w32.WM_HSCROLL: 57 //println("case w32.WM_HSCROLL") 58 59 case w32.WM_VSCROLL: 60 //println("case w32.WM_VSCROLL") 61 } 62 63 if controller := GetMsgHandler(hwnd); controller != nil { 64 ret := controller.WndProc(msg, wparam, lparam) 65 66 switch msg { 67 case w32.WM_NOTIFY: //Reflect notification to control 68 nm := (*w32.NMHDR)(unsafe.Pointer(lparam)) 69 if controller := GetMsgHandler(nm.HwndFrom); controller != nil { 70 ret := controller.WndProc(msg, wparam, lparam) 71 if ret != 0 { 72 w32.SetWindowLong(hwnd, w32.DWL_MSGRESULT, uint32(ret)) 73 return w32.TRUE 74 } 75 } 76 case w32.WM_COMMAND: 77 if lparam != 0 { //Reflect message to control 78 h := w32.HWND(lparam) 79 if controller := GetMsgHandler(h); controller != nil { 80 ret := controller.WndProc(msg, wparam, lparam) 81 if ret != 0 { 82 w32.SetWindowLong(hwnd, w32.DWL_MSGRESULT, uint32(ret)) 83 return w32.TRUE 84 } 85 } 86 } 87 case w32.WM_CLOSE: 88 controller.OnClose().Fire(NewEvent(controller, nil)) 89 case w32.WM_KILLFOCUS: 90 controller.OnKillFocus().Fire(NewEvent(controller, nil)) 91 case w32.WM_SETFOCUS: 92 controller.OnSetFocus().Fire(NewEvent(controller, nil)) 93 case w32.WM_DROPFILES: 94 controller.OnDropFiles().Fire(NewEvent(controller, genDropFilesEventArg(wparam))) 95 case w32.WM_CONTEXTMENU: 96 if wparam != 0 { //Reflect message to control 97 h := w32.HWND(wparam) 98 if controller := GetMsgHandler(h); controller != nil { 99 contextMenu := controller.ContextMenu() 100 x, y := genPoint(lparam) 101 102 if contextMenu != nil { 103 id := w32.TrackPopupMenuEx( 104 contextMenu.hMenu, 105 w32.TPM_NOANIMATION|w32.TPM_RETURNCMD, 106 int32(x), 107 int32(y), 108 controller.Handle(), 109 nil) 110 111 item := findMenuItemByID(int(id)) 112 if item != nil { 113 item.OnClick().Fire(NewEvent(controller, genMouseEventArg(wparam, lparam))) 114 } 115 return 0 116 } 117 } 118 } 119 120 case w32.WM_LBUTTONDOWN: 121 controller.OnLBDown().Fire(NewEvent(controller, genMouseEventArg(wparam, lparam))) 122 case w32.WM_LBUTTONUP: 123 controller.OnLBUp().Fire(NewEvent(controller, genMouseEventArg(wparam, lparam))) 124 case w32.WM_LBUTTONDBLCLK: 125 controller.OnLBDbl().Fire(NewEvent(controller, genMouseEventArg(wparam, lparam))) 126 case w32.WM_MBUTTONDOWN: 127 controller.OnMBDown().Fire(NewEvent(controller, genMouseEventArg(wparam, lparam))) 128 case w32.WM_MBUTTONUP: 129 controller.OnMBUp().Fire(NewEvent(controller, genMouseEventArg(wparam, lparam))) 130 case w32.WM_RBUTTONDOWN: 131 controller.OnRBDown().Fire(NewEvent(controller, genMouseEventArg(wparam, lparam))) 132 case w32.WM_RBUTTONUP: 133 controller.OnRBUp().Fire(NewEvent(controller, genMouseEventArg(wparam, lparam))) 134 case w32.WM_RBUTTONDBLCLK: 135 controller.OnRBDbl().Fire(NewEvent(controller, genMouseEventArg(wparam, lparam))) 136 case w32.WM_MOUSEMOVE: 137 controller.OnMouseMove().Fire(NewEvent(controller, genMouseEventArg(wparam, lparam))) 138 case w32.WM_PAINT: 139 canvas := NewCanvasFromHwnd(hwnd) 140 defer canvas.Dispose() 141 controller.OnPaint().Fire(NewEvent(controller, &PaintEventData{Canvas: canvas})) 142 case w32.WM_KEYUP: 143 controller.OnKeyUp().Fire(NewEvent(controller, &KeyUpEventData{int(wparam), int(lparam)})) 144 case w32.WM_SIZE: 145 x, y := genPoint(lparam) 146 controller.OnSize().Fire(NewEvent(controller, &SizeEventData{uint(wparam), x, y})) 147 case wmInvokeCallback: 148 controller.invokeCallbacks() 149 } 150 return ret 151 } 152 153 return w32.DefWindowProc(hwnd, uint32(msg), wparam, lparam) 154 }