/* * ============================================================================ * Projekt.....: rs2322tcp * Datei.......: cmd/rs2322tcp-client/main.go * Copyright (C) 2026 Dieter Lang * * SPDX-License-Identifier: GPL-3.0-or-later * * Beschreibung: * Einstiegspunkt für den grafischen rs2322tcp-Client. * * Der Client wird als eigenständige Desktop-Anwendung ausgeführt. Die * grafische Oberfläche basiert auf Fyne und bildet sowohl die Statusanzeige * als auch später die Konfiguration der lokalen virtuellen seriellen * Ports ab. * * Die eigentliche Client- und Runtime-Logik bleibt in den internen * Packages gekapselt. Diese Datei ist bewusst auf den Programmstart * und die Übergabe an die GUI beschränkt. * ============================================================================ */ package main import ( "fmt" "image/color" "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/theme" "git.lang-dieter.de/rs2322tcp/internal/gui" "git.lang-dieter.de/rs2322tcp/internal/version" ) /////////////////////////////////////////////////////////////////////////////// // Application theme /////////////////////////////////////////////////////////////////////////////// // applicationTheme keeps the standard Fyne theme and increases the general // text size for better readability. // // All other colors, fonts, icons and dimensions remain unchanged. type applicationTheme struct{} // Ensure applicationTheme implements fyne.Theme. var _ fyne.Theme = (*applicationTheme)(nil) // Color returns the standard Fyne theme color. func (t *applicationTheme) Color( name fyne.ThemeColorName, variant fyne.ThemeVariant, ) color.Color { return theme.DefaultTheme().Color(name, variant) } // Font returns the standard Fyne theme font. func (t *applicationTheme) Font( style fyne.TextStyle, ) fyne.Resource { return theme.DefaultTheme().Font(style) } // Icon returns the standard Fyne theme icon. func (t *applicationTheme) Icon( name fyne.ThemeIconName, ) fyne.Resource { return theme.DefaultTheme().Icon(name) } // Size returns the standard Fyne theme size, except for normal text. // // Normal text is increased from the Fyne default to 22 px for better // readability. func (t *applicationTheme) Size( name fyne.ThemeSizeName, ) float32 { if name == theme.SizeNameText { return 22 } return theme.DefaultTheme().Size(name) } /////////////////////////////////////////////////////////////////////////////// // Main /////////////////////////////////////////////////////////////////////////////// func main() { fmt.Printf( "rs2322tcp-client %s\n", version.Version, ) application := app.NewWithID( "git.lang-dieter.de.rs2322tcp.client", ) // Use the standard Fyne theme with a larger general text size. application.Settings().SetTheme( &applicationTheme{}, ) guiApplication, err := gui.NewApp( application, "./configs/client.json", ) if err != nil { fmt.Printf( "GUI konnte nicht gestartet werden: %v\n", err, ) return } // SetOnClosed gehört zum Fyne-Fenster, nicht zur Fyne-Anwendung. // // Beim Schließen des Hauptfensters wird die technische Client- // Anwendung beendet. Dadurch werden Runtime, Bridges, virtuelle // Ports und die Serververbindung sauber geschlossen. guiApplication.Window().SetOnClosed( func() { guiApplication.Close() }, ) // Zuerst das GUI-Fenster erzeugen und anzeigen. // // Dadurch wird ein möglicher Fehler beim Start von Fyne/GLFW erkannt, // bevor die technische Client-Kommunikation gestartet wird. guiApplication.Window().Show() // Erst nachdem das Fenster erfolgreich erzeugt wurde, wird das // technische Client-System asynchron gestartet. guiApplication.Start() // Den Fyne-Eventloop starten. application.Run() }