From 9453a6025405426a07ca44eb84923b209b85b67b Mon Sep 17 00:00:00 2001 From: Travis McLane Date: Thu, 27 Apr 2023 17:08:34 -0500 Subject: [PATCH] [linux] window registration + default menu --- v3/pkg/application/application_linux.go | 43 ++++++++++++++++++------- v3/pkg/application/menu_linux.go | 13 ++++++-- 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/v3/pkg/application/application_linux.go b/v3/pkg/application/application_linux.go index cf37d9e7e..b2475584f 100644 --- a/v3/pkg/application/application_linux.go +++ b/v3/pkg/application/application_linux.go @@ -48,6 +48,7 @@ import ( "log" "os" "strings" + "sync" "unsafe" "github.com/wailsapp/wails/v3/pkg/events" @@ -63,7 +64,11 @@ type linuxApp struct { applicationMenu unsafe.Pointer parent *App - startupActions []func() // startupActions should contain actions to take after `activate` signal arrival + startupActions []func() + + // Native -> uint + windows map[*C.GtkWindow]uint + windowsLock sync.Mutex } func (m *linuxApp) hide() { @@ -112,26 +117,30 @@ func (m *linuxApp) name() string { func (m *linuxApp) getCurrentWindowID() uint { // TODO: Add extra metadata to window - window := C.gtk_application_get_active_window((*C.GtkApplication)(m.application)) - if window != nil { - // return uint(window.id) - fmt.Println("getCurrentWindowID", window) + window := (*C.GtkWindow)(C.gtk_application_get_active_window((*C.GtkApplication)(m.application))) + if window == nil { + return uint(1) + } + m.windowsLock.Lock() + defer m.windowsLock.Unlock() + identifier, ok := m.windows[window] + if ok { + return identifier } return uint(1) } -func (m *linuxApp) afterActivation(fn func()) { - m.startupActions = append(m.startupActions, fn) -} - func (m *linuxApp) setApplicationMenu(menu *Menu) { if menu == nil { // Create a default menu menu = defaultApplicationMenu() } + globalApplication.dispatchOnMainThread(func() { + fmt.Println("setApplicationMenu") - menu.Update() - m.applicationMenu = (menu.impl).(*linuxMenu).native + menu.Update() + m.applicationMenu = (menu.impl).(*linuxMenu).native + }) } func (m *linuxApp) run() error { @@ -140,7 +149,9 @@ func (m *linuxApp) run() error { // FIXME: add Wails specific events - i.e. Shouldn't platform specific ones be translated to Wails events? m.parent.On(events.Mac.ApplicationDidFinishLaunching, func() { // Do we need to do anything now? + fmt.Println("events.Mac.ApplicationDidFinishLaunching received!") }) + var app C.App app.app = unsafe.Pointer(m) C.run(m.application, m.application) @@ -151,6 +162,13 @@ func (m *linuxApp) destroy() { C.g_application_quit((*C.GApplication)(m.application)) } +// register our window to our parent mapping +func (m *linuxApp) registerWindow(window *C.GtkWindow, id uint) { + m.windowsLock.Lock() + m.windows[window] = id + m.windowsLock.Unlock() +} + func newPlatformApp(parent *App) *linuxApp { name := strings.ToLower(strings.Replace(parent.options.Name, " ", "", -1)) if name == "" { @@ -161,6 +179,7 @@ func newPlatformApp(parent *App) *linuxApp { parent: parent, application: unsafe.Pointer(C.init(nameC)), // name: fmt.Sprintf("org.wails.%s", name), + windows: map[*C.GtkWindow]uint{}, } C.free(unsafe.Pointer(nameC)) return app @@ -176,7 +195,7 @@ func (m *linuxApp) executeStartupActions() { //export activateLinux func activateLinux(data unsafe.Pointer) { - globalApplication.activate() + // globalApplication.activate() app := (globalApplication.impl).(*linuxApp) app.executeStartupActions() } diff --git a/v3/pkg/application/menu_linux.go b/v3/pkg/application/menu_linux.go index 73a6edd98..e0c0118a9 100644 --- a/v3/pkg/application/menu_linux.go +++ b/v3/pkg/application/menu_linux.go @@ -44,8 +44,6 @@ func handleClick(idPtr unsafe.Pointer) { if menuItem.isChecked() { processMenuItemClick(C.uint(item.id)) } - default: - fmt.Println("handleClick", item.itemType, item.id) } } @@ -189,3 +187,14 @@ func (l *linuxMenu) createMenu(name string, items []*MenuItem) *Menu { impl.menu = menu return menu } + +func defaultApplicationMenu() *Menu { + menu := NewMenu() + menu.AddRole(AppMenu) + menu.AddRole(FileMenu) + menu.AddRole(EditMenu) + menu.AddRole(ViewMenu) + menu.AddRole(WindowMenu) + menu.AddRole(HelpMenu) + return menu +}