f4eb3c9fa1
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 真機**
43 lines
2.0 KiB
Go
43 lines
2.0 KiB
Go
//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() }
|