Repository navigation
Expand file tree
/
Copy pathmain.go
More file actions
74 lines (65 loc) · 2.56 KB
/
Copy pathmain.go
File metadata and controls
74 lines (65 loc) · 2.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// RapidProxy —— 把 WorkBuddy / CodeBuddy 背后的模型封装成 OpenAI 兼容服务。
//
// 程序形态:Wails 桌面应用 + 系统托盘。窗口关闭只最小化到托盘,
// 只有在托盘菜单选择「退出」才会真正结束进程。
package main
import (
"embed"
"os"
"strings"
"github.com/wailsapp/wails/v2"
"github.com/wailsapp/wails/v2/pkg/options"
"github.com/wailsapp/wails/v2/pkg/options/assetserver"
"github.com/znsoftm/RapidProxy/internal/singleton"
)
//go:embed all:frontend/dist
var assets embed.FS
// wantHidden 判断是否以静默方式启动(开机自启动统一附带 --hidden:
// 程序照常运行,只是不弹出主窗口,藏在系统托盘里)。
func wantHidden() bool {
for _, arg := range os.Args[1:] {
if strings.EqualFold(strings.TrimSpace(arg), "--hidden") {
return true
}
}
return false
}
func main() {
// 单实例:第二份程序把已有实例的界面弹到前台后立即退出,避免重复的
// 服务端口占用、托盘图标和配置读写。锁随进程存活、崩溃自动释放,无需清理。
if !singleton.Acquire("RapidProxy") {
if !singleton.Activate("RapidProxy") {
// 唤醒失败(首实例是旧版本、或激活监听异常):退化为提示框。
singleton.NotifyAlreadyRunning("RapidProxy")
}
return
}
application := NewApp()
// 托盘必须在主事件循环启动之前注册,由 Wails 的事件循环驱动。
application.startTray()
// 监听后续实例的激活请求:收到后把主窗口弹到前台(见 HandleSecondInstance)。
singleton.Listen("RapidProxy", application.HandleSecondInstance)
err := wails.Run(&options.App{
Title: "RapidProxy",
// 尺寸只是期望值:窗口创建后 App.fitWindow 会按当前屏幕的缩放比例与
// 可用区域收敛一次,避免在高 DPI / 小屏上窗口跑到屏幕外。
Width: windowDefaultWidth,
Height: windowDefaultHeight,
MinWidth: windowMinWidth,
MinHeight: windowMinHeight,
DisableResize: false,
StartHidden: wantHidden(),
AssetServer: &assetserver.Options{Assets: assets},
BackgroundColour: &options.RGBA{R: 244, G: 245, B: 247, A: 255},
OnStartup: application.startup,
OnBeforeClose: application.beforeClose,
Bind: []any{application},
})
if err != nil {
// 界面不可用时(例如缺少 WebView2 运行时)退化为后台服务 + 托盘,
// 保证 OpenAI 接口仍然可用。
application.log.Errorf("界面启动失败: %v", err)
application.runHeadless()
}
os.Exit(0)
}