menus.go 2.2 KB

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