9c9576b5b9
ci / test (macos-latest) (push) Has been cancelled
ci / test (ubuntu-latest) (push) Has been cancelled
ci / lint (push) Has been cancelled
ci / govulncheck (push) Has been cancelled
ci / tidy (push) Has been cancelled
ci / webview (push) Has been cancelled
ci / windows-gui (push) Has been cancelled
release / check (push) Has been cancelled
release / release (push) Has been cancelled
Docs / build (push) Has been cancelled
Docs / deploy-pages (push) Has been cancelled
Docs / deploy-cloudflare (push) Has been cancelled
54 lines
1.5 KiB
Go
54 lines
1.5 KiB
Go
//go:build webview
|
|
|
|
package viewer
|
|
|
|
import (
|
|
"context"
|
|
"runtime"
|
|
|
|
webview "github.com/webview/webview_go"
|
|
)
|
|
|
|
// Native is true in the webview build: Show opens a real window backed by the
|
|
// operating system's WebView (WKWebView on macOS, WebView2 on Windows,
|
|
// WebKitGTK on Linux), so a packed kage feels like a standalone app.
|
|
//
|
|
// This build needs cgo and links the platform WebView, so it is opt-in
|
|
// (-tags webview) and kept out of the default CGO_ENABLED=0 release pipeline.
|
|
const Native = true
|
|
|
|
// LockMainThread pins the calling goroutine to its OS thread. main calls it
|
|
// first thing, while the main goroutine is still on the process's initial
|
|
// thread, because the macOS WebView must be driven from that thread.
|
|
func LockMainThread() { runtime.LockOSThread() }
|
|
|
|
// Show opens a native window pointed at o.URL and runs the UI event loop on the
|
|
// calling (main) goroutine, blocking until the window is closed. A cancelled
|
|
// context terminates the loop too, so Ctrl-C still shuts the viewer down. The
|
|
// o.Browser flag is ignored: the whole point of this build is the native window.
|
|
func Show(ctx context.Context, o Options) error {
|
|
w := webview.New(false)
|
|
defer w.Destroy()
|
|
|
|
title := o.Title
|
|
if title == "" {
|
|
title = "kage"
|
|
}
|
|
w.SetTitle(title)
|
|
w.SetSize(1024, 768, webview.HintNone)
|
|
w.Navigate(o.URL)
|
|
|
|
done := make(chan struct{})
|
|
go func() {
|
|
select {
|
|
case <-ctx.Done():
|
|
w.Dispatch(func() { w.Terminate() })
|
|
case <-done:
|
|
}
|
|
}()
|
|
|
|
w.Run()
|
|
close(done)
|
|
return nil
|
|
}
|