package main import ( "context" "embed" "github.com/energye/systray" "github.com/wailsapp/wails/v2" "github.com/wailsapp/wails/v2/pkg/options" "github.com/wailsapp/wails/v2/pkg/options/assetserver" wruntime "github.com/wailsapp/wails/v2/pkg/runtime" ) //go:embed all:frontend/dist var assets embed.FS //go:embed build/trayicon.png var trayIcon []byte type wailsCtx = context.Context // 版本號由 build 時 -ldflags 注入(同 arcrun-tray 的規矩)。 var version = "dev" func main() { app := NewApp() err := wails.Run(&options.App{ Title: "Arcrun", Width: 1000, Height: 700, MinWidth: 820, MinHeight: 560, AssetServer: &assetserver.Options{Assets: assets}, OnStartup: func(ctx wailsCtx) { app.startup(ctx) startSupervisor() // 🔴 daemon 本體:不啟動就不會同步 setupTray(app) }, // 🔴 daemon 是常駐程式:關窗只是收起來,**不能真的結束** // (結束=停止看守資料夾,使用者不會預期按 × 就不再同步)。 OnBeforeClose: func(ctx wailsCtx) bool { wruntime.WindowHide(ctx) return true // true=攔下關閉 }, HideWindowOnClose: true, // Dock 不出現 icon:Wails v2.13 的 mac.ActivationPolicy 還沒開放(原始碼裡是註解掉的), // 改走 Info.plist 的 LSUIElement(與 fyne 版同一個做法,見 build/darwin/Info.plist)。 Bind: []interface{}{app}, }) if err != nil { println("Error:", err.Error()) } } // setupTray 建立選單列 icon。 // // 🔴 leo 2026-08-05:「依照 google drive,托盤裡**只剩下按右鍵會結束**, // 其他設定都在這個頁面,**點擊托盤的 icon 就立刻展開界面**」 // // ⇒ 左鍵=直接開視窗(不彈選單);右鍵=只有一項「結束 Arcrun」。 // 所有設定都在視窗裡,托盤不再是第二套 UI(fyne 版把設定塞在下拉選單, // leo:「daemon 設定項越來越多,不可能統統塞在下拉選單」)。 func setupTray(app *App) { go systray.Run(func() { systray.SetTemplateIcon(trayIcon, trayIcon) systray.SetTooltip("Arcrun — 你的知識庫同步小幫手") // 左鍵:立刻展開主視窗 systray.SetOnClick(func(menu systray.IMenu) { app.ShowWindow() }) // 右鍵:只有「結束」一項 quit := systray.AddMenuItem("結束 Arcrun", "停止同步並關閉") quit.Click(func() { app.Quit() }) systray.SetOnRClick(func(menu systray.IMenu) { _ = menu.ShowMenu() }) }, nil) }