The traceability job now runs `tools/manual/record.sh --check`: every picture docs/manual/README.md shows must be made by a scene in tools/manual/scenes.py, and every picture a scene makes must be shown. It reads the two files and nothing else, so it needs no app, display or LFS pull. --changed now dates a scene by the newest commit among its pictures rather than each picture alone. A scene that also makes a picture which re-records byte for byte (panorama-aligned beside panorama.gif) no longer stays listed for ever. A scene all of whose pictures come out identical (launch) stays listed until one differs, which costs one harmless re-run.
tools/manual — the pictures in docs/manual
record.sh drives the desktop build on a private X server and records the
scenes in scenes.py into docs/manual/media/:
tools/manual/record.sh /var/tmp/dr-demo/library # every scene
tools/manual/record.sh /var/tmp/dr-demo/library develop_zoom # one, and what it needs
tools/manual/record.sh --changed /var/tmp/dr-demo/library # those whose sources moved
tools/manual/record.sh --check # the manual and the scenes agree
tools/manual/record.sh --list
Set DR_LIBRARY_SNAPSHOT to a pristine copy of the library: a recording
rates, files and merges, and the snapshot is copied over the library first.
Each run starts from a fresh profile under DR_HOME.
Controls by name
The binary is built with --features automation, which lets the app answer
"where is the control labelled Exposure?" over the Unix socket named by
DR_AUTOMATION (ui/dr-ui/src/automation.rs). No other build has the
feature, and a build that has it listens only when the variable is set. The
names are the accessible labels a screen reader reads, so a scene says
click_on('Select@Button') or slide('Exposure', 24) rather than a pixel,
and survives a panel that moves. The pointer itself is still xdotool.
DR_HOME=/var/tmp/x tools/manual/drive.py launch /some/folder # a feature build in DR_BIN
tools/manual/drive.py labels # every name on screen
tools/manual/drive.py click-on 'Settings@Button'
tools/manual/drive.py ids canvas # things with no name: id:canvas-image
tools/manual/drive.py stop
Grid cells are named by file (_MG_8393@ListItem), rating stars 1 star
to 5 stars. What a scene cannot name — a point on the photograph, the crop
rectangle's corner — it places relative to something it can
(drive.photo(fx, fy), id:move-area).
Scenes and the manual
Each scene in scenes.py declares the pictures it makes, as the manual names
them, and the globs of the sources that could change them. --check fails
when the manual shows a picture no scene makes, or a scene makes one the
manual does not show; it reads two files and runs in CI. --changed
re-records a scene when one of its sources, or its own code, has changed
since the commit that last touched its pictures.
Two things the scripts know that are not obvious: a Slint TouchArea wants
a held press, not xdotool's click; and the app is driven on Xvfb rather
than the desktop because under XWayland at scale 2 a pointer warp lands at
twice the coordinate asked for.