Ein Browser-Tab
Das Toolkit ist reines Go ohne DOM-Abhängigkeit, daher baut GOOS=js GOARCH=wasm
es wie jedes andere Ziel. Zwei Wege, das Ergebnis jemandem vorzuführen:
Ein einfaches Canvas
go-widgets/webcanvas überträgt einen RGBA-
Framebuffer per Blit in ein <canvas> und leitet DOM-Zeiger- und Tastaturereignisse zurück
in die Szene. Kein Compositor, kein SharedArrayBuffer, keine Header für Cross-Origin-
Isolation: Jeder statische Host kann es ausliefern.
//go:build js && wasm
package main
import "github.com/go-widgets/webcanvas"
func main() { webcanvas.Run("screen", myScene()) }Die Szene implementiert App: Size, Draw(buf []byte) und eine Methode pro
Ereignisart, die jeweils meldet, ob sich etwas geändert hat, damit ein unveränderter Frame
nicht neu gezeichnet wird. Sie kann außerdem Ticker, Animator, Resizer oder
Scroller implementieren.
Die Galerie und
app-template laufen auf diese Weise.
Oder man lässt window wählen. Seit window v0.87.0 gibt
window.Open,
für js/wasm gebaut, auf einer gewöhnlichen Seite ein Back-End zurück, das über
webcanvas in das <canvas> der Seite zeichnet (Config.Canvas, Standard "screen").
Eine gegen window geschriebene Anwendung läuft dann unverändert als natives Fenster,
in einem Browser-Tab und in wasmdesk.
Ein Fenster auf dem wasmdesk-Desktop
In einem wasmdesk-Worker gibt window.Open
einen Client des Browser-Compositors wasmdesk/wasmbox
zurück. Er legt seine Oberfläche in einem SharedArrayBuffer an, sagt
hello über seinen MessagePort, wartet auf welcome, zeichnet in den gemeinsamen
Puffer und sendet commit – die ganze Oberfläche oder nur die geschädigten Rechtecke.
Die input-Nachrichten des Compositors werden zu toolkit.Event, wie unter X11.
So läuft eine gegen window geschriebene Anwendung unverändert als natives Fenster
und als Fenster eines Desktops in einem Browser-Tab. Die
Desktop-Shell-Demo macht genau
das, aus einer einzigen Quelle.
Der Protokoll-Codec ist auf jeder Plattform zu 100 % abgedeckt. Der Live-Nachweis lässt Headless-Chromium gegen den echten wasmdesk-Compositor laufen: Er startet den Client, liest die vom Compositor selbst komponierten Pixel, klickt und prüft, dass der Klick das Widget erreicht hat.
Erstellt am von tannevaled
Geändert am von tannevaled