From 0fc535f2f139d55720ecf74c901115e2e212c2e1 Mon Sep 17 00:00:00 2001 From: Travis McLane Date: Thu, 2 Nov 2023 12:23:02 -0500 Subject: [PATCH] [v3 linux] contextMenus --- v3/pkg/application/linux_cgo.go | 17 +++++++++++++++ v3/pkg/application/webview_window_linux.go | 25 ++++++++++------------ 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/v3/pkg/application/linux_cgo.go b/v3/pkg/application/linux_cgo.go index 3f43913ff..26fe4a856 100644 --- a/v3/pkg/application/linux_cgo.go +++ b/v3/pkg/application/linux_cgo.go @@ -233,6 +233,23 @@ func appDestroy(application pointer) { C.g_application_quit((*C.GApplication)(application)) } +func contextMenuShow(window pointer, menu pointer, data *ContextMenuData) { + geometry := C.GdkRectangle{ + x: C.int(data.X), + y: C.int(data.Y), + } + event := C.GdkEvent{} + gdkWindow := C.gtk_widget_get_window((*C.GtkWidget)(window)) + C.gtk_menu_popup_at_rect( + (*C.GtkMenu)(menu), + gdkWindow, + (*C.GdkRectangle)(&geometry), + C.GDK_GRAVITY_NORTH_WEST, + C.GDK_GRAVITY_NORTH_WEST, + (*C.GdkEvent)(&event), + ) +} + func getCurrentWindowID(application pointer, windows map[windowPointer]uint) uint { // TODO: Add extra metadata to window and use it! window := (*C.GtkWindow)(C.gtk_application_get_active_window((*C.GtkApplication)(application))) diff --git a/v3/pkg/application/webview_window_linux.go b/v3/pkg/application/webview_window_linux.go index a7afff6b8..33f9126a7 100644 --- a/v3/pkg/application/webview_window_linux.go +++ b/v3/pkg/application/webview_window_linux.go @@ -57,20 +57,17 @@ func (w *linuxWebviewWindow) connectSignals() { } func (w *linuxWebviewWindow) openContextMenu(menu *Menu, data *ContextMenuData) { - // Create the menu - thisMenu := newMenuImpl(menu) - thisMenu.update() - fmt.Println("linux.openContextMenu() - not implemented") - /* void - gtk_menu_popup_at_rect ( - GtkMenu* menu, - GdkWindow* rect_window, - const GdkRectangle* rect, - GdkGravity rect_anchor, - GdkGravity menu_anchor, - const GdkEvent* trigger_event - ) - */ + // Create the menu manually because we don't want a gtk_menu_bar + // as the top-level item + ctxMenu := &linuxMenu{ + menu: menu, + } + if menu.impl == nil { + ctxMenu.update() + } + + native := ctxMenu.menu.impl.(*linuxMenu).native + contextMenuShow(w.window, native, data) } func (w *linuxWebviewWindow) getZoom() float64 {