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  }