Skärmdumpar på osynlig skärm och deterministiska bildrutor
All checks were successful
release / build-release (push) Successful in 1m42s

- tools/shots/headless.go: startar en egen headless Wayfire (wlroots
  headless-backend + Xwayland) och kör spelet där, så att inga fönster syns
  eller tar fokus från det man gör på datorn; snäll avstängning och
  städning av sockets; METRO_HEADLESS=0 använder skärmen
- skriptläget ritar scenen synkront vid shot så att bilden alltid speglar
  exakt den uppdateringen oavsett FPS (två körningar ger identiska PNG:er)
- README/roadmap: hur den osynliga skärmen fungerar och används manuellt

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-10-24 11:40:49 +02:00
parent 915c684dc2
commit ef6cfaccc8
12 changed files with 155 additions and 1 deletions

View File

@@ -6,6 +6,10 @@
// PNG:er till doc/img/. Vägarna genom banorna räknas ut med BFS från
// bandatan. Kör om detta när grafik, UI eller banor ändrats, och committa
// bilderna – README och wikin pekar på dem.
//
// På Linux körs spelet på en osynlig skärm (headless Wayfire + Xwayland,
// se headless.go) så att inget fönster syns eller tar fokus. METRO_HEADLESS=0
// stänger av det.
package main
import (
@@ -164,6 +168,14 @@ func main() {
if runtime.GOOS == "windows" {
exe += ".exe"
}
hl, err := startHeadless(filepath.Join(root, "build"))
must(err)
if hl != nil {
fmt.Printf("» osynlig skärm: %s / %s (inget syns på skrivbordet)\n", hl.wayland, hl.x11)
defer hl.stop()
} else {
fmt.Println("» ingen headless-kompositor (wayfire saknas eller METRO_HEADLESS=0): använder skärmen")
}
_ = demo
for _, s := range shots {
args := []string{"-mute", "-nosave", "-script", strings.ReplaceAll(s.script, "$OUT", out)}
@@ -175,7 +187,11 @@ func main() {
}
run := exec.Command(exe, args...)
run.Dir, run.Stdout, run.Stderr = filepath.Dir(exe), os.Stdout, os.Stderr
if hl != nil {
run.Env = hl.env()
}
if err := run.Run(); err != nil {
hl.stop()
fail(fmt.Errorf("%s: %w", s.script, err))
}
}