//go:build windows package main import ( "log" "net" "os" "os/exec" "path/filepath" "strconv" "strings" "vrc_osc_go/internal/app" "vrc_osc_go/internal/config" ) func main() { initialTab := parseInitialTab(os.Args[1:]) if exe, err := os.Executable(); err == nil { _ = app.AppendRuntimeLog("GUI", "starting vrc_osc_gui.exe exe="+exe+" dir="+filepath.Dir(exe)+" initial_tab="+initialTab) } else { _ = app.AppendRuntimeLog("GUI", "starting vrc_osc_gui.exe exe=unknown err="+err.Error()) } ensureRuntimeStarted() if err := runNativeGUI(initialTab); err != nil { _ = app.AppendRuntimeLog("GUI", "runNativeGUI failed: "+err.Error()) log.Fatal(err) } _ = app.AppendRuntimeLog("GUI", "runNativeGUI returned cleanly") } func parseInitialTab(args []string) string { for _, arg := range args { switch { case arg == "--settings" || arg == "-settings" || arg == "/settings": return "settings" case arg == "--translate" || arg == "-translate" || arg == "/translate": return "join" case arg == "--log" || arg == "-log" || arg == "/log": return "join" case strings.HasPrefix(arg, "--tab="): if tab := normalizeInitialTab(strings.TrimPrefix(arg, "--tab=")); tab != "" { return tab } case strings.HasPrefix(arg, "/tab="): if tab := normalizeInitialTab(strings.TrimPrefix(arg, "/tab=")); tab != "" { return tab } } } return "join" } func normalizeInitialTab(tab string) string { switch strings.ToLower(strings.TrimSpace(tab)) { case "join", "log", "logs": return "join" case "translate", "translation": return "join" case "settings", "setting", "config": return "settings" default: return "" } } func ensureRuntimeStarted() { cfg, err := config.Load("") if err != nil { _ = app.AppendRuntimeLog("GUI", "runtime autostart skipped config="+err.Error()) return } addr := net.JoinHostPort(cfg.OSC.Host, strconv.Itoa(cfg.OSC.Port)) probe, err := net.ListenPacket("udp", addr) if err != nil { _ = app.AppendRuntimeLog("GUI", "runtime already listening addr="+addr+" err="+err.Error()) return } _ = probe.Close() exe, err := os.Executable() if err != nil { _ = app.AppendRuntimeLog("GUI", "runtime autostart skipped exe="+err.Error()) return } runtimeExe := filepath.Join(filepath.Dir(exe), "vrc_osc.exe") if _, err := os.Stat(runtimeExe); err != nil { _ = app.AppendRuntimeLog("GUI", "runtime autostart missing exe="+runtimeExe+" err="+err.Error()) return } if err := exec.Command(runtimeExe, "--no-gui").Start(); err != nil { _ = app.AppendRuntimeLog("GUI", "runtime autostart failed exe="+runtimeExe+" err="+err.Error()) return } _ = app.AppendRuntimeLog("GUI", "runtime autostart launched exe="+runtimeExe) }