Files
arcrun-collector/cmd/arcrun-app/dock_darwin.go
T
Leo f4eb3c9fa1 Mac 四修:Dock 不再重複/結束真的會結束/全螢幕可用/視窗 70%
leo 08-06 Mac 實測回報。四個都是**只在 Mac 現形**的病。

## ① Dock 與選單列兩邊都顯示(連帶:只有 Arcrun 列在強制結束清單)
真兇:Wails 在 AppDelegate.m:44 applicationWillFinishLaunching 硬設
`setActivationPolicy:Regular`,**runtime 蓋掉 Info.plist 的 LSUIElement**
(後者只決定啟動當下的初始 policy)。而 v2.13 的 mac.ActivationPolicy 是註解掉的。
🔴 **這件事 fyne 版 604704a(07-24)已經解過且真機驗證通過**,換 Wails 時整段掉了;
   wiki mistakes.md:124 也早就記著同一條。**本次是取回原版,不是重新發明**——
   dock_darwin.go/dock_other.go 逐字沿用,只更新註解說明 Wails 死法相同。

## ② 托盤右鍵「結束 Arcrun」點了不會結束
leo:「唯一結束法是強制結束…因為舊版沒結束導致無法覆蓋,
      **如果不知道怎麼強制結束的人就放棄了**」
真兇:Wails 的 runtime.Quit() 與「按 ×」**共用同一個 OnBeforeClose**
(frontend.go:364 `if !OnBeforeClose(ctx) { mainWindow.Quit() }`),
我們無條件回 true ⇒ mainWindow.Quit() 永遠不執行,還順手 WindowHide
⇒ 看起來像關了、其實行程還活著。
(AppDelegate.m:41 的 applicationShouldTerminate 也一律回 NSTerminateCancel,
  決定權整個在這個回呼 ⇒ 回 true 就沒有任何出口。)
解:quitting 旗標區分兩者,並抽出 closeMeansHide()/beginQuit() 讓它**可機械驗證**。

## ③ Mac 全螢幕(綠色)按鈕被停用
真兇同樣在 Wails:window.go:92 `zoomable` 只在 `frontendOptions.Mac != nil` 時賦值,
我們沒設 Mac ⇒ zoomable 維持零值 false ⇒ WailsContext.m:208
`if (!zoomable && resizable) { [zoomButton setEnabled:NO]; }`。Windows 無此段。
解:`Mac: &mac.Options{}`(空的即可,DisableZoom 預設 false)。

## ④ 視窗 50% 太小
leo:「Google Drive 大約螢幕長寬的 70%,改成 50% 後顯得太小」⇒ 常數 screenFraction=0.70。
並加 appLog 留痕(螢幕多大、算出多大),以後不必請人量像素。

## 驗(本機真機實跑,非推測)
· `lsappinfo` → **type="UIElement"**、Version="0.18.8"
  = 604704a 當年用的同一個驗法,通過 ⇒ Dock 無 icon、不列強制結束
· 截圖放大號誌燈 → **綠燈是彩色的(enabled)**,停用時會是灰色
· app.log 自報 → **視窗依螢幕 1470x956 設為 1029x669(70%)**
· 首頁顯示「看守中·資料夾有變動就會自動整理/已整理 1 份」=判活正常
· go test TestCloseMeansHide 通過(釘住「按×要隱藏、按結束要放行」)
· go vet 全綠;mac build + windows 交叉編譯皆 OK
· **未驗**:托盤右鍵實際點擊(osascript 缺輔助取用權限,點不到選單列)
  ⇒ 邏輯已單元測試+原始碼追到底,但**實際點擊歸 leo 真機**
2026-08-06 14:11:49 +08:00

43 lines
2.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//go:build darwin
// dock_darwin.go — 托盤唯一指示器(leo 07-24 裁決)的 macOS 實作。
//
// 🔴 **這段是取回 `604704a`07-24,fyne 版)的原版,不是重新發明。**
// 當時已真機驗證通過(`lsappinfo` 實測 `type=UIElement`),換 Wails 時整段掉了
// ⇒ leo 08-06 又撞同一個病:「托盤顯示 icon 時通常 Dock 就不顯示了,但現在是兩邊都顯示」。
//
// 原版註解說的是 fyne/glfw**Wails 的死法一模一樣**(已查原始碼確認):
//
// wails/v2@v2.13.0 internal/frontend/desktop/darwin/AppDelegate.m:44
// - (void)applicationWillFinishLaunching:… {
// [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
//
// ⇒ `Info.plist` 的 `LSUIElement=true` **只決定啟動當下的初始 policy**,
// app 起來後自己呼叫 setActivationPolicy 就把它蓋掉了。
// (我們的 plist 實測確實有 `LSUIElement => true`,但 Dock 照樣出 icon——就是這個原因。)
// ⇒ 而 Wails v2.13 的 `mac.ActivationPolicy` 選項在原始碼裡是**註解掉的**,設不了。
// ⇒ 唯一可靠解=app 起來後 runtime 直接把 policy 切成 Accessory(就是本檔)。
//
// 附帶解掉的第三個症狀:leo「別的托盤 daemon 都不列在強制結束列表裡,只有 Arcrun 有」——
// 因為 Regular policy 的 app 才會被列進「強制結束」;切成 Accessory 後就不列了。
package main
/*
#cgo CFLAGS: -x objective-c
#cgo LDFLAGS: -framework AppKit
#import <AppKit/AppKit.h>
static void arcrunHideDock(void) {
dispatch_async(dispatch_get_main_queue(), ^{
[NSApp setActivationPolicy:NSApplicationActivationPolicyAccessory];
});
}
*/
import "C"
// hideDockIcon 把 app 切成 Accessory(選單列有、Dock 無)。
//
// 須在 NSApp 起來**之後**呼叫——fyne 版掛在 `Lifecycle().SetOnStarted`
// Wails 版掛在 `OnStartup`(見 main.go)。裡面已經 dispatch 回主佇列,
// 呼叫端不必自己處理執行緒。
func hideDockIcon() { C.arcrunHideDock() }