//go:build !ci && !js && !wasm && !test_web_driver // +build !ci,!js,!wasm,!test_web_driver package app /* #cgo CFLAGS: -x objective-c #cgo LDFLAGS: -framework Foundation #include #include bool isBundled(); void sendNotification(char *title, char *content); */ import "C" import ( "fmt" "strings" "unsafe" "fyne.io/fyne/v2" "golang.org/x/sys/execabs" ) func (a *fyneApp) SendNotification(n *fyne.Notification) { if C.isBundled() { titleStr := C.CString(n.Title) defer C.free(unsafe.Pointer(titleStr)) contentStr := C.CString(n.Content) defer C.free(unsafe.Pointer(contentStr)) C.sendNotification(titleStr, contentStr) return } fallbackNotification(n.Title, n.Content) } func escapeNotificationString(in string) string { noSlash := strings.ReplaceAll(in, "\\", "\\\\") return strings.ReplaceAll(noSlash, "\"", "\\\"") } //export fallbackSend func fallbackSend(cTitle, cContent *C.char) { title := C.GoString(cTitle) content := C.GoString(cContent) fallbackNotification(title, content) } func fallbackNotification(title, content string) { template := `display notification "%s" with title "%s"` script := fmt.Sprintf(template, escapeNotificationString(content), escapeNotificationString(title)) err := execabs.Command("osascript", "-e", script).Start() if err != nil { fyne.LogError("Failed to launch darwin notify script", err) } }