// OSGOS helper // ======================================================================================================= // Author: LLC Texnico // All rights reserved // Russia, Chelyabinsk, 2022-2024 package main /* #cgo linux openbsd freebsd pkg-config: gtk+-3.0 webkit2gtk-4.0 #include */ import "C" import ( "flag" "fmt" "github.com/phillvancejr/webview" log "github.com/sirupsen/logrus" "io" "math/rand" "os" "os/signal" "syscall" "time" ) var ( port *int ) func init() { log.SetFormatter(&log.TextFormatter{ DisableQuote: true, }) log.SetLevel(log.InfoLevel) log.SetOutput(os.Stdout) } //# Если в Windows 10 появляется белый экран при загрузке каких-либо окон, то нужно установить WebView 2 //https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution //# Если в Windows 10 не открывается loopback, то под администратором надо выполнить: //CheckNetIsolation.exe LoopbackExempt -a -n="Microsoft.Win32WebViewHost_cw5n1h2txyewy" //# Linux build command //$ go build -o helper //# Windows requires special linker flags for GUI apps. //# It's also recommended to use TDM-GCC-64 compiler for CGo. //# http://tdm-gcc.tdragon.net/download //$ go build -ldflags="-H windowsgui" -o helper.exe func main() { interrupt := make(chan os.Signal, 1) signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM) section := flag.String("section", "help", "целевая папка") folder := flag.String("folder", "/usr/share/doc/osgos", "путь до ресурсов") maximized := flag.Bool("max", false, "запустить максимального размера") minimized := flag.Bool("min", false, "запустить минимального размера") fixed := flag.Bool("fixed", false, "размер не изменяем") debug := flag.Bool("debug", false, "уровень логов для отладки") width := flag.Int("width", 800, "ширина окна") height := flag.Int("height", 700, "высотка окна") top := flag.Bool("topmost", false, "поверх всех окон") port = flag.Int("port", 0, "порт") flag.Parse() if *port == 0 { rand.Seed(time.Now().UnixNano()) *port = int(rand.Int31n(1024)) + 10000 } if *debug { log.SetLevel(log.DebugLevel) log.SetOutput(nil) logFile, _ := os.OpenFile("log.txt", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.ModePerm) log.SetOutput(io.MultiWriter(logFile, os.Stdout)) log.Infof("truncate log file") } log.Infof("started with log level: %v", log.GetLevel().String()) go webThread(*folder, *section) w := webview.New(false) if w == nil { os.Exit(1) } var t webview.Hint if *maximized { t = webview.HintNone C.gtk_window_fullscreen((*C.GtkWindow)(w.Window())) } else if *minimized { t = webview.HintMin } else if *fixed { t = webview.HintFixed } else { t = webview.HintNone } if *top { w.Topmost(true) } defer w.Destroy() w.SetTitle("ОСГОС") w.SetSize(*width, *height, t) w.Center() // Center the window w.NoCtx() // remove the right click context menu w.Navigate(fmt.Sprintf("http://127.0.0.1:%d/%s/index.html", *port, *section)) w.Run() log.Infof("finished") }