diff --git a/cmd/arcrun-tray/build-mac.sh b/cmd/arcrun-tray/build-mac.sh index 10f06e9..0fffc92 100755 --- a/cmd/arcrun-tray/build-mac.sh +++ b/cmd/arcrun-tray/build-mac.sh @@ -14,7 +14,7 @@ echo "① 編 collector(同綑執行檔)" ( cd ../.. && go build -o "cmd/arcrun-tray/arcrun-collector" . ) echo "② fyne package" -go run fyne.io/fyne/v2/cmd/fyne@latest package -os darwin -icon icon.png -name "Arcrun RAG" +go run fyne.io/fyne/v2/cmd/fyne@latest package -os darwin -icon icon.png -name "Arcrun RAG" -appID dev.arcrun.rag.tray APP="Arcrun RAG.app" PLIST="$APP/Contents/Info.plist" @@ -26,5 +26,8 @@ echo "③ LSUIElement=true(托盤唯一指示器,隱 Dock icon——leo 07-2 echo "④ 同綑 collector 進 app bundle(托盤 collectorBinPath 找同層)" cp arcrun-collector "$APP/Contents/MacOS/arcrun-collector" +echo "⑤ ad-hoc 重簽(Apple Silicon:改過 plist/塞過檔必重簽,否則 launchd 拒開 error 162——07-24 真機實撞)" +codesign --force --deep -s - "$APP" + echo "✅ 完成:$APP" echo "驗法:open '$APP' → 選單列出現 icon、Dock **不出現** icon → 選單列出資料夾清單" diff --git a/cmd/arcrun-tray/dock_darwin.go b/cmd/arcrun-tray/dock_darwin.go new file mode 100644 index 0000000..d1efd1c --- /dev/null +++ b/cmd/arcrun-tray/dock_darwin.go @@ -0,0 +1,24 @@ +//go:build darwin + +// dock_darwin.go — 托盤唯一指示器(leo 07-24 裁決)的 macOS 實作。 +// +// 真機實測(07-24 第三枚坑):Info.plist 的 LSUIElement=true 會被 fyne/glfw 啟動時 +// 強制的 Regular activation policy 蓋掉(lsappinfo 實測 ApplicationType=Foreground), +// Dock icon 照樣出現。唯一可靠解=app 起來後 runtime 直接把 policy 切成 Accessory。 +package main + +/* +#cgo CFLAGS: -x objective-c +#cgo LDFLAGS: -framework AppKit +#import +static void arcrunHideDock(void) { + dispatch_async(dispatch_get_main_queue(), ^{ + [NSApp setActivationPolicy:NSApplicationActivationPolicyAccessory]; + }); +} +*/ +import "C" + +// hideDockIcon 把 app 切成 Accessory(選單列有、Dock 無)。須在 NSApp 初始化後呼叫 +// (掛在 fyne Lifecycle SetOnStarted)。 +func hideDockIcon() { C.arcrunHideDock() } diff --git a/cmd/arcrun-tray/dock_other.go b/cmd/arcrun-tray/dock_other.go new file mode 100644 index 0000000..e1dab88 --- /dev/null +++ b/cmd/arcrun-tray/dock_other.go @@ -0,0 +1,6 @@ +//go:build !darwin + +package main + +// hideDockIcon 在非 macOS 平台是 no-op(Windows 系統匣本來就不佔工作列)。 +func hideDockIcon() {} diff --git a/cmd/arcrun-tray/icon.png b/cmd/arcrun-tray/icon.png new file mode 100644 index 0000000..ec864e0 Binary files /dev/null and b/cmd/arcrun-tray/icon.png differ diff --git a/cmd/arcrun-tray/main.go b/cmd/arcrun-tray/main.go index e00cf03..318b219 100644 --- a/cmd/arcrun-tray/main.go +++ b/cmd/arcrun-tray/main.go @@ -256,6 +256,9 @@ func main() { desk.SetSystemTrayIcon(theme.StorageIcon()) // TODO 換品牌 icon(leo logo 進行中);Mac 建議 template 單色 } rebuildTray() // 開機即建初始選單(否則第一次狀態回呼前選單是空的) + // 托盤唯一指示器(leo 07-24 裁決):NSApp 起來後把 activation policy 切 Accessory + //(plist LSUIElement 會被 fyne/glfw 蓋掉——07-24 真機實測第三枚坑,見 dock_darwin.go) + a.Lifecycle().SetOnStarted(func() { hideDockIcon() }) refreshTray := rebuildTray // 狀態變更 → 刷新 tray 文案(回呼在 supervisor goroutine,切回 UI thread)