59cf9825d1
leo 同事真機實測撞到的兩個最嚴重問題。
④ 連線失敗會清空使用者輸入(leo:「很糟糕」)
真兇:失敗後呼叫 showConnectWizard(),註解寫著「不要把他丟回空白畫面」
**但行為與註解相反**——它重建整個對話框,urlEntry 是全新的,
而 cfg.CypherURL 因連線失敗根本沒寫入 ⇒ 欄位就是空的 ⇒ 使用者整段重打。
修:改 showConnectWizardWith(prevURL, prevEmail) 帶回上次輸入,
讓他只改錯的那個字。密碼不帶回(打錯時重打較安全,也少留記憶體)。
⑤ daemon 開著時每幾秒閃一個方框(約半螢幕)
真兇:arcrun-collector.exe 是 console 型執行檔,supervisor 每輪 exec 起它,
**Windows 預設會為 console 程式配可見視窗** ⇒ 每輪閃一次。
Mac/Linux 無此概念故開發期完全沒想到。
修:新增 hidewindow_windows.go(HideWindow + CREATE_NO_WINDOW)
+hidewindow_other.go(no-op),編譯期分平台不寫 runtime.GOOS 判斷。
註:-H windowsgui 是連結期選項(管自己有沒有視窗),與此(管起別人時給不給視窗)
是兩件事,兩者都要做才乾淨。
驗證:Mac 與 Windows 交叉編譯皆 exit=0 且產物生成;collector 全測試綠。
⚠️ 未真機驗——⑤ 的效果必須在真 Windows 上確認方框消失。
32 lines
1.3 KiB
Go
32 lines
1.3 KiB
Go
//go:build windows
|
||
|
||
package supervisor
|
||
|
||
import (
|
||
"os/exec"
|
||
"syscall"
|
||
)
|
||
|
||
// CREATE_NO_WINDOW:起子行程時不要配一個新的 console 視窗。
|
||
//
|
||
// 為什麼需要(t75,2026-07-28 leo 同事在真 Windows 上實測撞到):
|
||
// 使用者回報「**daemon 開啟時每幾秒螢幕會閃一個方框,大概有螢幕一半大,關閉它就消失**」。
|
||
// 根因=`arcrun-collector.exe` 是 **console 型執行檔**(`PE32+ (console)`),
|
||
// supervisor 每輪起它一次,**Windows 預設會為 console 程式配一個可見的視窗** ⇒ 每輪閃一下。
|
||
//
|
||
// **Mac/Linux 沒有這個概念**,所以這個跨平台差異在開發期完全沒被想到——
|
||
// 這也是為什麼「真機驗證」不能只驗自己改過的東西(見 t75 教訓)。
|
||
//
|
||
// 注意:`-H windowsgui` 是**連結期**選項,只影響「這支程式自己有沒有視窗」;
|
||
// 這裡處理的是「**我起別人時要不要給它視窗**」,是不同一件事,兩者都要做才乾淨。
|
||
const createNoWindow = 0x08000000
|
||
|
||
// hideChildWindow 讓子行程不要彈出 console 視窗(僅 Windows 有效)。
|
||
func hideChildWindow(cmd *exec.Cmd) {
|
||
if cmd.SysProcAttr == nil {
|
||
cmd.SysProcAttr = &syscall.SysProcAttr{}
|
||
}
|
||
cmd.SysProcAttr.HideWindow = true
|
||
cmd.SysProcAttr.CreationFlags |= createNoWindow
|
||
}
|