Register Windows notification icon via metadata after NewWindow.

Fyne toasts read App.Icon without SetIcon, preserving the PE multi-size
window and taskbar icon while giving failure notifications app artwork.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-05 23:02:52 +03:00
parent 0a50f3c66b
commit 0aab9d8db6
3 changed files with 26 additions and 0 deletions
+2
View File
@@ -44,6 +44,8 @@ import (
// - Tray: SetSystemTrayIcon(IconSmallICO()). The notification area is ICO-native
// and renders at 16-24px; a single-frame 16x16 .ico pins the hand-tuned glyph
// (a multi-size .ico made the tray pick and downscale a larger frame).
// - Desktop toasts: AppMetadata.Icon (set after NewWindow in run.go) feeds
// SendNotification without calling SetIcon, which would override GLFW_ICON.
//
// Linux / other non-Windows (no PE icon resource exists):
// - Window titlebar: a.SetIcon(IconSmall()) in run.go feeds the resource to
+6
View File
@@ -4,6 +4,12 @@ All notable GoSentry changes are recorded in this file.
## 1.0.1 - 2026-08-04
**Windows failure notifications can show the app icon (experimental).**
- **`ui.run`** — after `NewWindow`, register `AppMetadata.Icon` on Windows so
Fyne toasts pick up artwork without calling `SetIcon`, which would override
the PE multi-size window/taskbar icon.
**Sample jobs include a disabled failure test for desktop notifications.**
- **`storage.defaultJobs`** — new disabled example *Failure notification test*
+18
View File
@@ -59,6 +59,7 @@ func Run(startInTray bool) {
}
w := a.NewWindow("GoSentry " + app.Version)
setWindowsNotificationIcon()
prefs := a.Preferences()
winW := float32(prefs.FloatWithFallback("window.width", defaultWindowWidth))
winH := float32(prefs.FloatWithFallback("window.height", defaultWindowHeight))
@@ -94,3 +95,20 @@ func Run(startInTray bool) {
recordStartup(time.Since(started), true)
a.Run()
}
// setWindowsNotificationIcon supplies App.Icon for Fyne desktop notifications
// without touching the window or taskbar icon. On Windows those come from the PE
// gosentry.ico resource, so run.go must not call SetIcon. Fyne's NewWindow ends
// with SetIcon(nil), which adopts App.Icon when it is already set — metadata
// must therefore be registered only after the window is created. The tray icon
// is set separately in tray.go via SetSystemTrayIcon.
func setWindowsNotificationIcon() {
if runtime.GOOS != "windows" {
return
}
fyneapp.SetMetadata(fyne.AppMetadata{
ID: appID,
Name: "GoSentry",
Icon: assets.Icon(),
})
}