112 lines
2.8 KiB
Go
112 lines
2.8 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"log"
|
|
"os"
|
|
|
|
"gioui.org/app"
|
|
"gioui.org/op"
|
|
"gioui.org/unit"
|
|
|
|
"softbox.local/app-win7/platform/windows"
|
|
softboxgio "softbox.local/app-win7/ui/gio"
|
|
"softbox.local/core"
|
|
"softbox.local/core/application"
|
|
)
|
|
|
|
const applicationEventCapacity = 32
|
|
|
|
func main() {
|
|
if handled, err := acknowledgeInternalUpdateHealth(os.Args[1:]); handled {
|
|
if err != nil {
|
|
log.Printf("%s internal update health failed: %v", core.ProductName, err)
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
go func() {
|
|
if err := run(); err != nil {
|
|
log.Printf("%s Legacy stopped: %v", core.ProductName, err)
|
|
}
|
|
os.Exit(0)
|
|
}()
|
|
app.Main()
|
|
}
|
|
|
|
func run() error {
|
|
return runWithCatalogLoader(application.UnconfiguredCatalogLoader{})
|
|
}
|
|
|
|
func runWithCatalogLoader(loader application.CatalogSnapshotLoader) error {
|
|
platform := windows.New()
|
|
window := new(app.Window)
|
|
window.Option(
|
|
app.Title(core.ProductName+" Legacy"),
|
|
app.Size(unit.Dp(1024), unit.Dp(680)),
|
|
)
|
|
|
|
theme := softboxgio.NewTheme()
|
|
shell := softboxgio.NewAppShell(string(platform.Edition()))
|
|
runtime := application.NewRuntime(applicationEventCapacity)
|
|
relay, err := application.NewEventRelay(applicationEventCapacity)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
eventContext, cancelEvents := context.WithCancel(context.Background())
|
|
pumpDone := make(chan error, 1)
|
|
go func() {
|
|
pumpDone <- application.PumpEvents(
|
|
eventContext,
|
|
runtime.Events(),
|
|
relay,
|
|
window.Invalidate,
|
|
)
|
|
}()
|
|
catalogDone := startCatalogBootstrap(eventContext, runtime, loader)
|
|
defer func() {
|
|
cancelEvents()
|
|
runtime.Close()
|
|
relay.Close()
|
|
if bootstrapErr := <-catalogDone; bootstrapErr != nil &&
|
|
!errors.Is(bootstrapErr, context.Canceled) &&
|
|
!errors.Is(bootstrapErr, application.ErrCatalogSourceUnconfigured) &&
|
|
!errors.Is(bootstrapErr, application.ErrRuntimeClosed) &&
|
|
!errors.Is(bootstrapErr, application.ErrEventRelayClosed) {
|
|
log.Printf("%s catalog bootstrap failed", core.ProductName)
|
|
}
|
|
if pumpErr := <-pumpDone; pumpErr != nil &&
|
|
!errors.Is(pumpErr, context.Canceled) &&
|
|
!errors.Is(pumpErr, application.ErrEventRelayClosed) {
|
|
log.Printf("application event pump stopped: %v", pumpErr)
|
|
}
|
|
}()
|
|
var operations op.Ops
|
|
|
|
for {
|
|
switch event := window.Event().(type) {
|
|
case app.DestroyEvent:
|
|
return event.Err
|
|
case app.FrameEvent:
|
|
if err := relay.Drain(shell.ApplyEvent); err != nil {
|
|
log.Printf("apply application event: %v", err)
|
|
}
|
|
context := app.NewContext(&operations, event)
|
|
shell.Layout(context, theme)
|
|
event.Frame(context.Ops)
|
|
}
|
|
}
|
|
}
|
|
|
|
func startCatalogBootstrap(
|
|
ctx context.Context,
|
|
runtime *application.Runtime,
|
|
loader application.CatalogSnapshotLoader,
|
|
) <-chan error {
|
|
done := make(chan error, 1)
|
|
go func() {
|
|
done <- application.NewCatalogBootstrap(loader, runtime).Run(ctx)
|
|
}()
|
|
return done
|
|
}
|