diff --git a/v3/pkg/application/application_linux_purego.go b/v3/pkg/application/application_linux_purego.go index 6dae3da20..3d6aa9be2 100644 --- a/v3/pkg/application/application_linux_purego.go +++ b/v3/pkg/application/application_linux_purego.go @@ -7,7 +7,7 @@ import ( "log" "os" "strings" - "time" + "sync" "github.com/ebitengine/purego" "github.com/wailsapp/wails/v2/pkg/assetserver/webview" @@ -55,6 +55,10 @@ type linuxApp struct { application uintptr applicationMenu uintptr parent *App + + // Native -> uint + windows map[uintptr]uint + windowsLock sync.Mutex } func (m *linuxApp) hide() { @@ -67,6 +71,7 @@ func (m *linuxApp) show() { func (m *linuxApp) on(eventID uint) { log.Println("linuxApp.on()", eventID) + // TODO: Setup signal handling as appropriate // Note: GTK signals seem to be strings! } @@ -80,15 +85,19 @@ func (m *linuxApp) name() string { } func (m *linuxApp) getCurrentWindowID() uint { - fmt.Println("getCurrentWindowID") var getCurrentWindow func(uintptr) uintptr purego.RegisterLibFunc(&getCurrentWindow, gtk, "gtk_application_get_active_window") - // window := getCurrentWindow(m.application) - // if window != 0 { - // webview := (*WebviewWindow)(window) - // return webview.id - // } - return uint(1) + window := getCurrentWindow(m.application) + if window == 0 { + return 1 + } + m.windowsLock.Lock() + defer m.windowsLock.Unlock() + if identifier, ok := m.windows[window]; ok { + return identifier + } + + return 1 } func (m *linuxApp) setApplicationMenu(menu *Menu) { @@ -96,19 +105,21 @@ func (m *linuxApp) setApplicationMenu(menu *Menu) { // Create a default menu menu = defaultApplicationMenu() } - - menu.Update() - m.applicationMenu = (menu.impl).(*linuxMenu).native + globalApplication.dispatchOnMainThread(func() { + menu.Update() + m.applicationMenu = (menu.impl).(*linuxMenu).native + }) } func (m *linuxApp) activate() { fmt.Println("linuxApp.activated!", m.application) var hold func(uintptr) purego.RegisterLibFunc(&hold, gtk, "g_application_hold") + hold(m.application) - time.Sleep(50 * time.Millisecond) - m.parent.activate() + // time.Sleep(50 * time.Millisecond) + // m.parent.activate() } func (m *linuxApp) run() error { @@ -119,6 +130,11 @@ func (m *linuxApp) run() error { fmt.Println("ApplicationDidFinishLaunching!") }) */ + m.parent.OnWindowCreation(func(window *WebviewWindow) { + fmt.Println("OnWindowCreation: ", window) + + }) + var g_signal_connect func(uintptr, string, uintptr, uintptr, bool, int) int purego.RegisterLibFunc(&g_signal_connect, gtk, "g_signal_connect_data") g_signal_connect(m.application, "activate", purego.NewCallback(m.activate), m.application, false, 0) @@ -146,6 +162,12 @@ func (m *linuxApp) destroy() { quit(m.application) } +func (m *linuxApp) registerWindow(address uintptr, window uint) { + m.windowsLock.Lock() + m.windows[address] = window + m.windowsLock.Unlock() +} + func newPlatformApp(parent *App) *linuxApp { name := strings.ToLower(parent.options.Name) if name == "" { @@ -159,6 +181,7 @@ func newPlatformApp(parent *App) *linuxApp { appName: identifier, parent: parent, application: gtkNew(identifier, 0), + windows: map[uintptr]uint{}, } return app } diff --git a/v3/pkg/application/menu_linux_purego.go b/v3/pkg/application/menu_linux_purego.go index 36c72ca47..8f22a89c2 100644 --- a/v3/pkg/application/menu_linux_purego.go +++ b/v3/pkg/application/menu_linux_purego.go @@ -166,3 +166,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 +} diff --git a/v3/pkg/application/menuitem_linux_purego.go b/v3/pkg/application/menuitem_linux_purego.go index f5dca543d..9a8dae60e 100644 --- a/v3/pkg/application/menuitem_linux_purego.go +++ b/v3/pkg/application/menuitem_linux_purego.go @@ -122,11 +122,9 @@ func newMenuItemImpl(item *MenuItem) *linuxMenuItem { switch item.itemType { case text: - fmt.Println("text", item.label) result.native = newWithLabel(item.label) case checkbox: - fmt.Println("cb", item.label) result.native = newCBWithLabel(item.label) result.setChecked(item.checked) if item.accelerator != nil { @@ -136,7 +134,6 @@ func newMenuItemImpl(item *MenuItem) *linuxMenuItem { panic("Shouldn't get here with a radio item") case submenu: - fmt.Println("submenu", item.label) result.native = newWithLabel(item.label) default: