menus.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. //go:build windows
  2. package wintray
  3. import (
  4. "fmt"
  5. "log/slog"
  6. "unsafe"
  7. "golang.org/x/sys/windows"
  8. )
  9. const (
  10. _ = iota
  11. updateAvailableMenuID
  12. updateMenuID
  13. separatorMenuID
  14. diagLogsMenuID
  15. diagSeparatorMenuID
  16. quitMenuID
  17. )
  18. func (t *winTray) initMenus() error {
  19. if err := t.addOrUpdateMenuItem(diagLogsMenuID, 0, diagLogsMenuTitle, false); err != nil {
  20. return fmt.Errorf("unable to create menu entries %w\n", err)
  21. }
  22. if err := t.addSeparatorMenuItem(diagSeparatorMenuID, 0); err != nil {
  23. return fmt.Errorf("unable to create menu entries %w", err)
  24. }
  25. if err := t.addOrUpdateMenuItem(quitMenuID, 0, quitMenuTitle, false); err != nil {
  26. return fmt.Errorf("unable to create menu entries %w\n", err)
  27. }
  28. return nil
  29. }
  30. func (t *winTray) UpdateAvailable(ver string) error {
  31. if !t.updateNotified {
  32. slog.Debug("updating menu and sending notification for new update")
  33. if err := t.addOrUpdateMenuItem(updateAvailableMenuID, 0, updateAvailableMenuTitle, true); err != nil {
  34. return fmt.Errorf("unable to create menu entries %w", err)
  35. }
  36. if err := t.addOrUpdateMenuItem(updateMenuID, 0, updateMenutTitle, false); err != nil {
  37. return fmt.Errorf("unable to create menu entries %w", err)
  38. }
  39. if err := t.addSeparatorMenuItem(separatorMenuID, 0); err != nil {
  40. return fmt.Errorf("unable to create menu entries %w", err)
  41. }
  42. iconFilePath, err := iconBytesToFilePath(wt.updateIcon)
  43. if err != nil {
  44. return fmt.Errorf("unable to write icon data to temp file: %w", err)
  45. }
  46. if err := wt.setIcon(iconFilePath); err != nil {
  47. return fmt.Errorf("unable to set icon: %w", err)
  48. }
  49. t.updateNotified = true
  50. t.pendingUpdate = true
  51. // Now pop up the notification
  52. t.muNID.Lock()
  53. defer t.muNID.Unlock()
  54. copy(t.nid.InfoTitle[:], windows.StringToUTF16(updateTitle))
  55. copy(t.nid.Info[:], windows.StringToUTF16(fmt.Sprintf(updateMessage, ver)))
  56. t.nid.Flags |= NIF_INFO
  57. t.nid.Timeout = 10
  58. t.nid.Size = uint32(unsafe.Sizeof(*wt.nid))
  59. err = t.nid.modify()
  60. if err != nil {
  61. return err
  62. }
  63. }
  64. return nil
  65. }