Add playback controls to dock menu on MacOS

This commit is contained in:
Drew Weymouth
2026-07-20 18:18:24 -07:00
parent ab087c6d49
commit c80f4399eb
4 changed files with 130 additions and 28 deletions
+42 -1
View File
@@ -3,11 +3,20 @@
package ui
/*
#include <stdlib.h>
void installReopenDelegate();
void dockMenuBegin();
void dockMenuAddItem(const char* title, int index);
void dockMenuAddSeparator();
void dockMenuCommit();
*/
import "C"
import "fyne.io/fyne/v2"
import (
"unsafe"
"fyne.io/fyne/v2"
)
var darwinAppDelegateReopenWindow fyne.Window
@@ -38,3 +47,35 @@ func appReopened() {
func appShouldTerminate() {
darwinQuitting = true
}
// darwinDockMenuCallbacks is indexed by the NSMenuItem tag set in
// dockMenuAddItem, dispatched back to Go via dockMenuItemClicked.
var darwinDockMenuCallbacks []func()
func installDockMenu(menu *fyne.Menu) {
darwinDockMenuCallbacks = darwinDockMenuCallbacks[:0]
C.dockMenuBegin()
for _, item := range menu.Items {
if item.IsSeparator {
C.dockMenuAddSeparator()
continue
}
cTitle := C.CString(item.Label)
C.dockMenuAddItem(cTitle, C.int(len(darwinDockMenuCallbacks)))
C.free(unsafe.Pointer(cTitle))
darwinDockMenuCallbacks = append(darwinDockMenuCallbacks, item.Action)
}
C.dockMenuCommit()
}
//export dockMenuItemClicked
func dockMenuItemClicked(index C.int) {
i := int(index)
if i < 0 || i >= len(darwinDockMenuCallbacks) {
return
}
if cb := darwinDockMenuCallbacks[i]; cb != nil {
go func() { fyne.Do(cb) }()
}
}