OSGOS_D1/custom/helper/main.go

118 lines
3.2 KiB
Go

// OSGOS helper
// =======================================================================================================
// Author: LLC Texnico <main@texnico.ru>
// All rights reserved
// Russia, Chelyabinsk, 2022-2024
package main
/*
#cgo linux openbsd freebsd pkg-config: gtk+-3.0 webkit2gtk-4.0
#include <gtk/gtk.h>
*/
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")
}