diff --git a/v3/STATUS.md b/v3/STATUS.md index 3ef24f876..63209c8c4 100644 --- a/v3/STATUS.md +++ b/v3/STATUS.md @@ -46,7 +46,7 @@ Webview Window Interface Methods | minimise() | Y | | Y | | | nativeWindowHandle() (uintptr, error) | Y | | Y | | | on(eventID uint) | Y | | Y | | -| openContextMenu(menu *Menu, data *ContextMenuData) | | | Y | | +| openContextMenu(menu *Menu, data *ContextMenuData) | Y | | Y | | | position() (int, int) | Y | | Y | | | reload() | Y | | Y | | | run() | Y | | Y | | diff --git a/v3/pkg/application/popupmenu_windows.go b/v3/pkg/application/popupmenu_windows.go index d7880a9f8..3ff6a073a 100644 --- a/v3/pkg/application/popupmenu_windows.go +++ b/v3/pkg/application/popupmenu_windows.go @@ -177,10 +177,10 @@ func (p *Win32Menu) ShowAtCursor() { } -func (p *Win32Menu) ProcessCommand(cmdMsgID int) { +func (p *Win32Menu) ProcessCommand(cmdMsgID int) bool { item := p.menuMapping[cmdMsgID] if item == nil { - return + return false } if item.IsRadio() { item.checked = true @@ -189,6 +189,7 @@ func (p *Win32Menu) ProcessCommand(cmdMsgID int) { if item.callback != nil { item.handleClick() } + return true } func (p *Win32Menu) Destroy() { diff --git a/v3/pkg/application/systemtray_windows.go b/v3/pkg/application/systemtray_windows.go index 89e4399fd..5e7703b54 100644 --- a/v3/pkg/application/systemtray_windows.go +++ b/v3/pkg/application/systemtray_windows.go @@ -210,7 +210,7 @@ func (s *windowsSystemTray) wndProc(msg uint32, wParam, lParam uintptr) uintptr } //println(w32.WMMessageToString(msg)) - // TODO: Menu processing + // Menu processing case w32.WM_COMMAND: cmdMsgID := int(wParam & 0xffff) switch cmdMsgID { diff --git a/v3/pkg/application/webview_window_windows.go b/v3/pkg/application/webview_window_windows.go index 82f669dfc..bb86b0da6 100644 --- a/v3/pkg/application/webview_window_windows.go +++ b/v3/pkg/application/webview_window_windows.go @@ -27,10 +27,11 @@ import ( var showDevTools = func(chromium *edge.Chromium) {} type windowsWebviewWindow struct { - windowImpl unsafe.Pointer - parent *WebviewWindow - hwnd w32.HWND - menu *Win32Menu + windowImpl unsafe.Pointer + parent *WebviewWindow + hwnd w32.HWND + menu *Win32Menu + currentlyOpenContextMenu *Win32Menu // Fullscreen flags isCurrentlyFullscreen bool @@ -540,9 +541,9 @@ func newWindowImpl(parent *WebviewWindow) *windowsWebviewWindow { func (w *windowsWebviewWindow) openContextMenu(menu *Menu, data *ContextMenuData) { // Create the menu - thisMenu := newMenuImpl(menu) - thisMenu.update() - //C.windowShowMenu(w.nsWindow, thisMenu.nsMenu, C.int(data.X), C.int(data.Y)) + thisMenu := NewPopupMenu(w.hwnd, menu) + w.currentlyOpenContextMenu = thisMenu + thisMenu.ShowAtCursor() } func (w *windowsWebviewWindow) setStyle(b bool, style int) { @@ -568,7 +569,7 @@ func (w *windowsWebviewWindow) setBackdropType(backdropType BackdropType) { var data w32.WINDOWCOMPOSITIONATTRIBDATA data.Attrib = w32.WCA_ACCENT_POLICY data.PvData = w32.PVOID(&accent) - data.CbData = w32.SIZE_T(unsafe.Sizeof(accent)) + data.CbData = unsafe.Sizeof(accent) w32.SetWindowCompositionAttribute(w.hwnd, &data) } else { @@ -730,13 +731,21 @@ func (w *windowsWebviewWindow) WndProc(msg uint32, wparam, lparam uintptr) uintp } } - if w.menu != nil { + if w.menu != nil || w.currentlyOpenContextMenu != nil { switch msg { case w32.WM_COMMAND: cmdMsgID := int(wparam & 0xffff) switch cmdMsgID { default: - w.menu.ProcessCommand(cmdMsgID) + var processed bool + if w.currentlyOpenContextMenu != nil { + processed = w.currentlyOpenContextMenu.ProcessCommand(cmdMsgID) + w.currentlyOpenContextMenu = nil + + } + if !processed && w.menu != nil { + processed = w.menu.ProcessCommand(cmdMsgID) + } } } }