[linux] window registration + default menu

This commit is contained in:
Travis McLane 2023-04-27 17:08:34 -05:00
commit 9453a60254
2 changed files with 42 additions and 14 deletions

View file

@ -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()
}

View file

@ -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
}